• $nextTick的原理及作用


    $nextTickVue.js 提供的一个方法,用于在 DOM 更新完成后执行回调函数。它是基于 JavaScript 的事件循环机制实现的。原理和作用如下:

    原理
    Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个任务队列,并缓冲在同一时间循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。(这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的)
    然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行任务队列 (已去重的) 工作。
    Vue 在内部对异步队列尝试使用原生的 Promise.then(微任务)、MutationObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0)(宏任务)代替。

    什么时候使用$nextTick
    1、Vue⽣命周期的created()钩⼦函数进⾏的DOM操作⼀定要放在Vue.nextTick()的回调函数中,原因是在created()钩⼦函数执⾏的时候,DOM 其实并未进⾏任何渲染,⽽此时进⾏DOM操作⽆异于徒劳,所以此处⼀定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。

    2、当项⽬中改变data函数的数据,想基于新的dom做点什么,对新DOM⼀系列的js操作都需要放进Vue.nextTick()的回调函数中
    作用

    1. 等待 DOM 更新后执行操作:有时候你需要在 Vue 更新 DOM 后执行一些操作,例如操作更新后的 DOM 元素。使用 $nextTick 可以确保你的操作在 DOM 更新完成后执行。

    2. 避免不同数据更新之间的竞态条件:如果你在数据更新后立即想要获取更新后的 DOM 信息或进行操作,直接在数据更新后使用 $nextTick 会更可靠,避免竞态条件。

    示例代码:

    // 在 Vue 实例内部
    this.$nextTick(function() {
      // DOM 已更新
      // 执行操作
    });
    
    // 在组件内部
    this.$nextTick(function() {
      // DOM 已更新
      // 执行操作
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    JS 运行机制
    JS 执行是单线程的,它是基于事件循环的。事件循环大致分为以下几个步骤:

    1. 所有同步任务都在主线程上执行,形成一个执行栈
    2. 主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
    3. 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
    4. 主线程不断重复上面的第三步。

    主线程的执行过程就是一个 tick,而所有的异步结果都是通过 “任务队列” 来调度。"任务队列"中存放的是一个个的任务(task)。规范中规定 task 分为两大类,宏任务和微任务
    微任务,也称job
    通常用于在当前正在执行的脚本之后直接发生的事情,比如对一系列的行为做出反应,或者做出一些异步的任务,而不需要新建一个全新的task。只要执行栈没有其他javascript在执行,在每个task结束时,微任务队列就会在回调后处理。在微任务期间排队的其他微任务将被添加到这个队列的末尾
    常见的 微任务 有 MutationObsever 、 Promise.then 、$nextTick

    宏任务
    作用是为了让浏览器能够从内部获取javascript / dom的内容并确保执行栈能够顺序进行。调度是随处可见的,例如解析HTML,获得鼠标点击的事件回调等等。
    常见的 宏任务 有 setTimeout、MessageChannel、postMessage、setImmediate;

    vue进行DOM更新内部也是调用nextTick来做异步队列控制。而当我们自己调用nextTick的时候,它就在更新DOM的那个micro task后追加了我们自己的回调函数,从而确保我们的代码在DOM更新后执行。

    setTimeout是宏任务:只是延迟执行,在延迟执行的方法里,DOM有可能会更新也有可能没有更新。

  • 相关阅读:
    kafka消息重复消费解决方案
    数据可视化PCA与t-SNE
    2023年中国煤气节能器产量及市场规模分析[图]
    韩顺平0基础学java——第15天
    大模型时代的科研人员的思考
    Python基础入门篇【45】--python中json文件及yaml文件的应用
    虚拟机Ubuntu操作系统最基本终端命令(安装包+详细解释+详细演示)
    [环境搭建]OpenHarmony开发环境搭建
    视频素材从哪里找?看这篇就对了
    前端npm打包自动压缩
  • 原文地址:https://blog.csdn.net/qq_60893085/article/details/133556306