先有两个例子:
例子1:
基于vue2.x版本
1 2 3 4
| <div id="app"> <span id="demo">{{num}}<span> <button @click="onClick">累加</button> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| var app = new Vue({ el: '#app', data() { return { a: 1 } }, mounted() { this.$nextTick(()=>{ console.log(document.getElementById('test').innerHTML); }) this.a = ++; }, methods: { onClick() { this.$nextTick(()=>{ console.log(document.getElementById('test').innerHTML); }) this.a = ++; } } });
|
上述代码分别输出1,2,你猜对了吗
页面初始化时,dom显示为2,输出1
点击事件之后,dom显示为3,输出为2
例子2:
基于vue3.x版本
1 2 3 4
| <template> <p id="demo">{{ a }}</p> <button @click="onClick">累加</button> </template>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <script setup>
import { ref, nextTick, onMounted } from 'vue';
let a = ref(1); onMounted(()=>{ nextTick(() => { console.log(document.getElementById('demo').innerHTML); }); a.value ++; }); function onClick() { nextTick(() => { console.log(document.getElementById('demo').innerHTML); }); a.value ++; } </script>
|
上述代码分别输出1,2,你猜对了吗
页面初始化时,dom显示为2,输出2
点击事件之后,dom显示为3,输出为2
可以看出来,对于初始化完成之后的事件,vue 2、3版本的输出与显示是相处的。
对于初始化时的处理,vue2 中nextTick优先于赋值操作,vue3 中赋值操作优先于nextTick
具体原因是为什么呢?