最近在研究Vue的nextTick,自己写了如下demo代码:
<html>
<head>
<script src="./vue.js"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
const vue = new Vue({
el: '#root',
template: '<div><div id="dom">{{msg}}</div><button @click="add">add</button></div>',
data() {
return {
msg: 1
}
},
watch: {
msg(value) {
console.log('msg>>>>>', value);
}
},
methods: {
add() {
const dom = document.getElementById('dom');
dom.textContent = '30'
for(let i = 0; i < 3; i ++) {
this.msg ++
}
this.$nextTick(() => {
console.log('msg.content2>>>>>>', msg.textContent)
})
}
}
})
</script>
</html>
结果真的让我很困惑。 正如我所料,点击添加按钮后,
dom.textContent = '30'
将dom元素的textConent更改为30。接下来的for循环,将msg
添加到4,因为Vue将异步更新页面,我们无法在页面中看到最新的结果。在this.$nextTick
之后,Vue会立即使用更新后的msg
重新渲染dom元素,我们现在知道的是4。所以 dom 元素的 textContent 现在应该是 4,但它仍然是 30。为什么会这样?我哪里错了?