nextTick

164 阅读1分钟

作用

将回调推迟到下一个DOM更新周期之后执行。在更改了一些数据以等待DOM 更新后立即使用它。
vue在更新DOM时是异步执行的,本质是执行延迟回调的钩子,接受一个回调函数作为参数,在下次DOM更新循环结束之后执行延迟回调。当数据发生变化,VUE将开启一个异步更新队列,视图需要等队列中所有数据变化完成之后,统一进行更新。

为什么异步

只要侦听到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个watcher被多次触发,只会被推入到队列中一次。在缓冲时去除重复数据避免不必要的计算和dom操作。

代码

<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>

<div id='app'>

<p ref='p'>{{msg}}</p>

<span @click='fn'>click me</span>

</div>
span{

background-color: #4CAF50; /* Green */

border: none;

color: white;

padding: 15px 32px;

text-align: center;

text-decoration: none;

display: inline-block;

font-size: 16px;

}
new Vue({

el:'#app',

data:{

msg:'hi'

},

methods:{

fn(){

this.msg='the lastest msg'

// console.log(this.$refs['p'].innerHTML)

this.$nextTick(()=>{

console.log(this.$refs['p'].innerHTML)

})

}

}

})

image.png

image.png

为什么要有nextTick

如果没有nextTick更新机制,数据每次更新都会触发视图更新,有nextTick机制,只需要更新一次,nextTick本质是一种优化策略。

原理

callbacks就是异步操作队列。callbacks(异步操作队列)新增回调函数后又执行了timerFunc函数,pending是用来标识同一个时间只能执行一次。利用Event loop事件线程去异步操作

除了nexttick还有什么手段可以实现类似的效果

场景

想在修改数据后立刻得到更新后的DOM 结构。

参考资料