小工具知识网

当前位置: 首页 > 行业知识 > 每日十题---三

行业知识

每日十题---三

2026-11-12 10:56:43 来源:互联网转载

1. Vue中$nextTick原理

1. 简单的理解就是它就是一个setTimeout函数,将函数放到异步后去处理。

2. Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。

3. 也就是说我们在设置this.msg = 'some thing'的时候,Vue并没有马上去更新DOM数据,而是将这个操作放进一个队列中;如果我们重复执行的话,队列还会进行去重操作;等待同一事件循环中的所有数据变化完成之后,会将队列中的事件拿出来处理。

4. 这样做主要是为了提升性能,因为如果在主线程中更新DOM,循环100次就要更新100次DOM;但是如果等事件循环完成之后更新DOM,只需要更新1次。

$nextTick源码理解:

1. 把回调函数放入callbacks等待执行

2. 将执行函数放到微任务或者宏任务中

3. 事件循环到了微任务或者宏任务,执行函数依次执行callbacks中的回调

再回到我们开头说的setTimeout,可以看出来nextTick是对setTimeout进行了多种兼容性的处理,宽泛的也可以理解为将回调函数放入setTimeout中执行;不过nextTick优先放入微任务执行,而setTimeout是宏任务,因此nextTick一般情况下总是先于setTimeout执行

$nextTick()返回一个Promise对象

nextTick原理

methods: {    updateMessage: function () {      this.message = '已更新'      console.log(this.$el.textContent) // => '未更新'      this.$nextTick(function () {        console.log(this.$el.textContent) // => '已更新'      })    }}//因为 $nextTick() 返回一个 Promise 对象,//所以你可以使用新的 ES2017 async/await 语法完成相同的事情:methods: {  updateMessage: async function () {    this.message = '已更新'    console.log(this.$el.textContent) // => '未更新'    await this.$nextTick()    console.log(this.$el.textContent) // => '已更新'  }}

 

上一篇:实用技巧大解密,轻松改变网页导航栏风格!

下一篇:电脑服务器配置怎么看?