当前位置: 代码迷 >> 综合 >> Vue 的 $nextTick 的使用和原理
  详细解决方案

Vue 的 $nextTick 的使用和原理

热度:22   发布时间:2023-12-05 02:09:15.0

$nextTick是Vue更新DOM-异步的

例如:点击count++, 马上通过"原生DOM"拿标签内容, 无法拿到新值,因为DOM更新是异步的

<template><div><p ref="myP">{
   { count }}</p><button @click="btn">点击count+1, 马上提取p标签内容</button></div>
</template><script>
export default {data(){return {count: 0}},methods: {btn(){this.count++; // vue监测数据更新, 开启一个DOM更新队列(异步任务)console.log(this.$refs.myP.innerHTML); // 0// 原因: Vue更新DOM异步// 解决: this.$nextTick()// 过程: DOM更新完会挨个触发$nextTick里的函数体this.$nextTick(() => {console.log(this.$refs.myP.innerHTML); // 1})}}
}
</script>

$nextTick使用场景

点击搜索按钮, 弹出聚焦的输入框, 按钮消失

 

<template><div><input ref="myInp" type="text" placeholder="这是一个输入框" v-if="isShow"><button v-else @click="btn">点击我进行搜索</button></div>
</template><script>
// 目标: 点按钮(消失) - 输入框出现并聚焦
// 1. 获取到输入框
// 2. 输入框调用事件方法focus()达到聚焦行为
export default {data(){return {isShow: false}},methods: {async btn(){this.isShow = true;// this.$refs.myInp.focus()// 原因: data变化更新DOM是异步的// 输入框还没有挂载到真实DOM上// 解决:// this.$nextTick(() => {//     this.$refs.myInp.focus()// })// 扩展: await取代回调函数// $nextTick()原地返回Promise对象await this.$nextTick()this.$refs.myInp.focus()}}
}
</script>

Vue 的 nextTick 的原理

1. 为什么需要 nextTick ,Vue 是异步修改 DOM 的并且不鼓励开发者直接接触 DOM,但有时候业务需要必须对数据更改--刷新后的 DOM 做相应的处理,这时候就可以使用 Vue.nextTick(callback)这个 api 了。

2. 理解原理前的准备 首先需要知道事件循环中宏任务和微任务这两个概念,常见的宏任务有 script, setTimeout, setInterval, setImmediate, I/O, UI rendering 常见的微任务有:    process.nextTick(Nodejs) , Promise.then(), MutationObserver;

3. 理解 nextTick 的原理正是 vue 通过异步队列控制 DOM 更新和 nextTick 回调函数先后执行的方式。如果大家看过这部分的源码,会发现其中做了很多 isNative()的判断,因为这里还存在兼容性优雅降级的问题。可见 Vue 开发团队的深思熟虑,对性能的良苦用心。

  相关解决方案