iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue2异步更新及nextTick原理详解
  • 106
分享到

Vue2异步更新及nextTick原理详解

摘要

目录javascript 执行机制nextTick实现原理异步更新常见问题总结:Vue 官网中是这样描述 nextTick 的 在下次 DOM 更新循环结束之后执行延迟回调。在修改数

Vue 官网中是这样描述 nextTick 的

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,可以获取更新后的 DOM。

学习 nextTick 是如何实现之前,我们要先了解下 JavaScript 的执行机制

JavaScript 执行机制

浏览器是多线程的,例如GUI渲染线程js引擎线程、事件监听线程等。。。

javascript 执行机制就是借用浏览器的多线程机制,再基于 Event Loop 事件循环机制实现的。其实现了单线程异步效果

Event Loop 步骤大致如下:

浏览器加载页面时,除了开辟堆栈内存外,还会创建两个队列 WEB api:任务监听队列,监测异步任务是否可以执行 Task Queue:任务队列,分为异步宏任务队列和异步微任务队列 当主线程自上而下执行代码过程中,如果遇到异步代码,则把异步任务放到 Web API 中去监听 浏览器会开辟新的线程去监听是否可以执行 不会阻碍主线程的渲染,它会继续向下执行同步代码 当异步任务被监测为可以执行了(有了运行结果),也不会立即去执行,而是在 task queue 中放置一个事件,排队等待执行 根据微任务还是宏任务,放在不同的队列中 谁先进来排队的,谁在各自队伍的最前面 执行栈中的所有同步任务执行完毕,主线程空闲下来,此时会去 task queue 中把正在排队的事件,按照顺序取出来,进入主线程执行 微任务优先级比较高。当执行栈为空时,先去执行微任务队列中的事件,直到微任务队列为空,才会去执行宏任务队列中的事件 上述过程会不断重复,也就是常说的事件循环(Event Loop)

task 又分为宏任务(Macro task)和微任务(micro task)两大类,在浏览器环境中

常见的 macro task 有 script(整体代码)、setTimeout/setInterval/setImmediateXMLHttpRequest/fetch,DOM事件(如鼠标点击、滚动页面、放大缩小等),渲染事件(解析 DOM、计算布局、绘制) 常见的 micro task 有 Promise.then/catch/finallyasync/awaitMutationObserver

需要注意的是!!!如果处理微任务的过程中有新的微任务添加进来了,添加的速度一直比执行快,则永远执行微任务

下面的代码永远不会打印宏任务输出

function macroFn(){
   setTimeout(() => {
     console.log('>>>>MA')
   },0)
}
function microFn(){
    Promise.resolve().then(() => {
        console.log('mi')
        microFn()
    })
}
macroFn()
microFn()

nextTick实现原理

vue2.7 源码中,有一个单独的文件src/core/util/next-tick.js去维护 nextTick,有兴趣的同学可以自行去观看

vue2.7 源码中,nextTick并没有直接使用某个 API ,而是采用了优雅降级的方案去实现异步更新

在内部会尝试使用原生的Promise.then (IE不支持)MutationObserversetImmediate (高版本IE专享),如果执行环境还不支持的话,则会采用 setTimeout(fn, 0)

需要注意的是,我们维护了一个 callbacks,用于存储 nextTick 回调

这样就保证了在同一个 tick 内多次调用 nextTick,只需创建一个异步任务,就可以依次执行 callbacks 中的所有 nextTick 回调。而不是去开启多个异步任务去处理。

let callbacks = [] // 存储 nextTick 回调
let waiting = false // 防抖

// 按照顺序依次执行 callbacks 中的方法
function flushCallbacks() {
  let cbs = callbacks.slice(0)
  waiting = false
  callbacks = []
  cbs.forEach(cb => cb()) 
}


let timerFunc;
if (Promise) {
    timerFunc = () => {
        Promise.resolve().then(flushCallbacks)
    }
}else if(MutationObserver){
    let observer = new MutationObserver(flushCallbacks); // 这里传入的回调是异步执行的
    let textnode = document.createTextNode(1);
    observer.observe(textNode,{
        characterData:true
    });
    timerFunc = () => {
        textNode.textContent = 2;
    }
}else if(setImmediate){
    timerFunc = () => {
       setImmediate(flushCallbacks);
    }
}else{
    timerFunc = () => {
        setTimeout(flushCallbacks);
     }
}

export function nextTick(cb) {
  callbacks.push(cb) // 维护 nextTick 中的 cakllback 方法
  
  if (!waiting) {
    timerFunc()
    waiting = true
  }
}

异步更新

vue 内部的异步更新渲染也使用了 nextTick

在 Watcher 类的 update 更新方法中,我们调用了 queueWatcher 异步队列更新方法,该方法在 vue2.7源码中的 src/core/util/scheduler.js 文件中维护

import { queueWatcher } from './scheduler'

class Watcher {
	...
  // 重新渲染
  update() {
    console.log('watcher-update')
    queueWatcher(this) // watcher 异步更新
  }
}

src/core/util/scheduler.js

import { nextTick } from '../util/next-tick'



let queue = []
let has = {}
let pending = false // 防抖

function flushSchedulerQueue() {
  let flushQueue = queue.slice(0)
  queue = []
  has = {}
  pending = false
  flushQueue.forEach(q => q.run()) // 在刷新的过程中可能还有新的 watcher,重新放到 queue 中
}

// 在一个tick周期内,不管我们的 update 执行多少次,只会执行一轮刷新操作
export function queueWatcher(watcher) {
  const id = watcher.id
  if (!has[id]) {
    queue.push(watcher)
    has[id] = true
    if (!pending) {
      nextTick(flushSchedulerQueue)
      pending = true
    }
  }
}

常见问题

1. nexTick 是异步还是同步?

这个不能一概而论,nextTick 内部既有同步代码又有异步代码。

例如 维护 callbacks 队列是同步任务;执行队列中的方法是异步任务

2. nextTick 回调的执行是微任务还是宏任务?

针对 vue2.7 来说,nextTick并没有直接使用某个 API ,而是采用了优雅降级的方案去实现异步更新。
在内部会尝试使用原生的Promise.then (微任务)MutationObserver (微任务)setImmediate (宏任务),如果执行环境还不支持的话,则会采用 setTimeout (宏任务)

可以理解为 99% 的场景下都是微任务,只有在不支持 Promise 和 MutationObserver API的浏览器中,才会是宏任务,例如 IE9 、IE10

3. 为什么要封装 nextTick?而不是使用某个具体的 API?

优雅降级。尽量使用微任务,尽可能缩短渲染周期

保证统一性。nextTick 可以暴露给用户,保证用户在修改数据之后立即使用这个方法,可以获取更新后的 DOM

this.name = 'libc'

this.$nextTick(()=>{
  console.log(document.querySelector('.user').innerhtml)
});

总结:

Vue2的异步更新机制是Vue的核心之一,通过事件循环机制实现了高效的渲染和性能优化。nextTick方法则提供了更为灵活的DOM操作方式,可以在DOM更新后执行回调函数。在使用Vue2进行开发时,理解和掌握异步更新机制和nextTick方法是非常必要的,可以帮助我们更好地优化性能和提高渲染效率。

到此这篇关于Vue2异步更新及nextTick原理详解的文章就介绍到这了,更多相关Vue2异步更新及nextTick原理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue2异步更新及nextTick原理详解

本文链接: https://www.lsjlt.com/news/208437.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue2异步更新及nextTick原理详解
    目录JavaScript 执行机制nextTick实现原理异步更新常见问题总结:vue 官网中是这样描述 nextTick 的 在下次 DOM 更新循环结束之后执行延迟回调。在修改数...
    99+
    2023-05-15
    Vue异步更新机制和nextTick原理 vue2异步更新原理 vue2的nextTick使用
  • Vue2异步更新及nextTick原理是什么
    这篇文章主要介绍“Vue2异步更新及nextTick原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue2异步更新及nextTick原理是什么”文章能帮助大家解决问题。JavaScript...
    99+
    2023-07-05
  • Vue异步更新机制及$nextTick原理是什么
    本文小编为大家详细介绍“Vue异步更新机制及$nextTick原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue异步更新机制及$nextTick原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-30
  • Vue异步更新机制及$nextTick原理的深入讲解
    目录前言Vue的异步更新DOM更新是异步的DOM更新还是批量的事件循环执行过程源码深入异步更新队列nextTick$nextTick总结一般更新DOM是同步的既然更新DOM是个同步的...
    99+
    2024-04-02
  • Vue异步更新DOM及$nextTick执行机制解读
    目录Vue异步更新DOM策略$nextTick执行机制示例详解Vue异步更新DOM的目的$nextTick应用示例总结Vue异步更新DOM策略 我们知道,Vue实现响应式并不是数据发...
    99+
    2023-03-24
    Vue异步更新DOM $nextTick执行机制 Vue异步更新
  • Vue异步更新机制和nextTick原理实例分析
    这篇文章主要介绍“Vue异步更新机制和nextTick原理实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue异步更新机制和nextTick原理实例分析”文章能帮助大家解决问题。1. 异步更...
    99+
    2023-06-27
  • Vue异步更新机制和nextTick的原理是什么
    本篇内容介绍了“Vue异步更新机制和nextTick的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • 怎样理解从Vue.js源码看异步更新DOM策略及nextTick
    怎样理解从Vue.js源码看异步更新DOM策略及nextTick,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。操作DOM在使用vue.js...
    99+
    2024-04-02
  • Vue异步更新DOM及$nextTick执行机制源码分析
    本篇内容介绍了“Vue异步更新DOM及$nextTick执行机制源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Vue异步更新DOM策...
    99+
    2023-07-05
  • Vue 2 nextTick方法|异步更新|事件循环
    1 nextTick的用处 vm.$netTick的作用是将回调延迟到下次DOM更新周期之后执行。 它接受一个回调函数作为参数。 其实,在我们更新数据状态后,是不会立马渲染的,你不能即刻获取到新的DO...
    99+
    2023-09-05
    vue.js 前端 javascript 事件循环 异步更新 宏任务 微任务
  • Vuejs中怎么利用nextTick()实现异步更新队列
    Vuejs中怎么利用nextTick()实现异步更新队列,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。源码解析方法原型以及解析注释如下:var...
    99+
    2024-04-02
  • Vue3组件异步更新和nextTick运行机制是什么
    这篇文章主要讲解了“Vue3组件异步更新和nextTick运行机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3组件异步更新和nextTick运行机制是什么”吧!组件的异步更新...
    99+
    2023-07-06
  • Vue 中异步更新的原理是什么
    今天就跟大家聊聊有关Vue 中异步更新的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Vue 异步更新 DOM 原理很多同学都知道,Vue...
    99+
    2024-04-02
  • Vue3组件异步更新和nextTick运行机制源码分析
    这篇文章主要介绍了Vue3组件异步更新和nextTick运行机制源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3组件异步更新和nextTick运行机制源码分析文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • C#异步原理详情
    目录一、关于第一点的说明二、关于第二点的说明三、关于第三点的说明四、关于第四点的说明五、关于第五点的说明前言: 用async关键字和await表达式表达的异步操作在C#5便发布了,其...
    99+
    2024-04-02
  • vue的异步数据更新机制与$nextTick使用方法是什么
    这篇文章主要讲解了“vue的异步数据更新机制与$nextTick使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue的异步数据更新机制与$nextTick使用方法是什么”吧!v...
    99+
    2023-07-05
  • 详解SpringBoot异常处理流程及原理
    异常处理流程 执行目标方法,目标方法运行期间有任何异常都会被catch捕获,并标志当前请求结束,dispatchException抛出异常 进入视图解析流程,并渲染页面,发生异常时...
    99+
    2024-04-02
  • vue的状态更新方式(异步更新解决)
    目录状态更新(异步更新解决)解决方案异步更新及nexttick为什么需要异步更新nextTick 原理状态更新(异步更新解决) 在vue中状态更新是异步的,这一点和react中的se...
    99+
    2024-04-02
  • SpringBoot异步使用@Async的原理以及线程池配置详解
    目录前言 使用步骤 配置线程池类参数配置 自定义线程任务 总结 原理刨析 文章参考 前言 在实际项目开发中很多业务场景需要使用异步去完成,比如消息通知,日志记录,等非常常用的都可以...
    99+
    2024-04-02
  • Vue2 的 diff 算法规则原理详解
    目录前言算法规则diff 优化策略老数组的开始与新数组的开始老数组的结尾与新数组的结尾老数组的开始与新数组的结尾老数组的结尾与新数组的开始以上四种情况都没对比成功推荐在渲染列表时为节...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作