javascript - 组件 DOM 更改时的 Vue 通知
问题描述
对组件的 DOM 没有影响的 prop 更改会updated
意外触发其功能。
https://jsfiddle.net/e5gyuorL/1/
v-html="markup()"
or {{markup()}}
or的结果相同computed: { markup: ... }
。
updated
(https://vuejs.org/v2/api/#updated )的文档说:
在数据更改后调用会导致重新渲染和修补虚拟 DOM。
如何捕获实际的 DOM 重新渲染?如果这是一个常见问题解答,请道歉;我看了看长度。
解决方案
我能想到的最直接的方法是让组件将其存储innerHTML
在数据项中,并在每次更新时检查它是否已更改:
Vue.component('t-markdown', {
template: '#t-markdown',
data: {
innerHTML: ''
},
props: {src:String},
methods: {
markup: function() { return this.src.slice(0,11) },
},
updated: function() {
if (this.innerHTML !== this.$el.innerHTML) {
this.$parent.count++;
this.innerHTML = this.$el.innerHTML;
}
},
mounted() {
this.innerHTML = this.$el.innerHTML;
}
});
new Vue({
el: "#app",
data: {count:0, inp:'<b>src</b> '},
methods: {
change: function() { this.inp += '#' },
},
mounted() {
setTimeout(() => this.inp = '<i>changed!</i>', 7000);
}
})
body {
background: #20262E;
padding: 20px;
font-family: sans-serif, Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<t-markdown :src="inp"></t-markdown>
<button @click="change">change</button> updated: {{count}}
<div>
{{inp}}
</div>
</div>
<script type="text/x-template" id="t-markdown">
<div v-html="markup()"></div>
</script>
推荐阅读
- reactjs - React 和 MongoDB 中的复选框值
- javascript - 如何在向导类型的网页中保留单击引导卡的背景颜色?
- guice - 如何在 Quarkus 中引导 Guice Injector?
- php - FPDF / PHP:页脚页面显示在下一页的底部(空白页)
- batch-file - 使用 cmd 为文本文件中的每一行添加主机名
- java - 虽然缩小同步块可以提高可伸缩性,但同步块可能太小。“可以”不应该是“不能”吗?
- graphql - Hasura GraphQL 如何按月和年分组查询?
- javascript - Jest 的 `it.each()` 描述以在称为 $predicate 时呈现箭头函数源代码
- c++ - protobuf:new Prototype() 和 Prototype.Clear() 之间的区别
- java - 如何优化 Firebase 数据读取