Vue3你真的熟悉吗?03-下一次 Dom 更新-nextTick

368 阅读2分钟

原题传送门

题目:

下一次Dom更新

看到这个题,这里点击按钮的核心逻辑是每次点击 count变量都加 1,这时通过 counter.value.textContent去拿到 counter 这个 Dom 元素的textContent 值应该是 1,第一次应该就要输入 true,但现在是输出 false,到第二次才输出 true。也就是这个题所说的问题,改变响应式状态时,dom 不会同步更新。

分析:

nextTick 来到 Vue 官网,看 nextTick 这个 api 的说明,我们可以发现问题所在,也就是这句话。当你在 Vue 中更改响应式状态时,最终的 DOM 更新并不是同步生效的,而是由 Vue 将它们缓存在一个队列中,直到下一个tick才一起执行。这样是为了确保每个组件无论发生多少状态改变,都仅执行一次更新。

解决:

async function increment() {
  count.value++
  await nextTick();
  console.log(+counter.value.textContent === 1)
}

那么这里显然我们解决问题的逻辑就是,通过 nextTick 这个 api 确保更改响应式状态的时候,Dom 更新是同步生效的。现在可以看到当 count的值更新为 1 的时候,Dom 的更新也同步生效了,所以第一次点击变为数字 1 的时候就输出为 true。

理解:

这里说说我对nextTick的理解吧,Vue使用的是异步更新的策略,当数据变化时,Vue 将异步地更新 DOM。这意味着在数据变化之后,DOM 不会立即更新,而是在下一个事件循环周期中进行更新。这样的设计也比较有利于性能优化。然而,有时候我们需要在 DOM 更新后执行一些操作,例如获取更新后的 DOM 元素的信息或执行一些需要在 DOM 确保更新后才能生效的逻辑。这就是 nextTick 设计的初衷吧。

最后:

好了那么,就到此为止吧。

我是Xwenhaha,一个不想只当切图仔的切图仔罢了。

如果对该系列感兴趣,可以移步专栏Vue3你真的熟悉吗