广告
返回顶部
首页 > 资讯 > 精选 >Vue2异步更新及nextTick原理是什么
  • 647
分享到

Vue2异步更新及nextTick原理是什么

2023-07-05 23:07:16 647人浏览 安东尼
摘要

这篇文章主要介绍“Vue2异步更新及nextTick原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue2异步更新及nextTick原理是什么”文章能帮助大家解决问题。javascript

这篇文章主要介绍“Vue2异步更新及nextTick原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue2异步更新及nextTick原理是什么”文章能帮助大家解决问题。

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    }  }}

常见问题

nexTick 是异步还是同步?

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

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

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

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

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

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

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

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

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

关于“Vue2异步更新及nextTick原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Vue2异步更新及nextTick原理是什么

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

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

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

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

下载Word文档
猜你喜欢
  • Vue2异步更新及nextTick原理是什么
    这篇文章主要介绍“Vue2异步更新及nextTick原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue2异步更新及nextTick原理是什么”文章能帮助大家解决问题。JavaScript...
    99+
    2023-07-05
  • Vue2异步更新及nextTick原理详解
    目录JavaScript 执行机制nextTick实现原理异步更新常见问题总结:vue 官网中是这样描述 nextTick 的 在下次 DOM 更新循环结束之后执行延迟回调。在修改数...
    99+
    2023-05-15
    Vue异步更新机制和nextTick原理 vue2异步更新原理 vue2的nextTick使用
  • Vue异步更新机制及$nextTick原理是什么
    本文小编为大家详细介绍“Vue异步更新机制及$nextTick原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue异步更新机制及$nextTick原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-30
  • Vue异步更新机制和nextTick的原理是什么
    本篇内容介绍了“Vue异步更新机制和nextTick的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2022-10-19
  • Vue异步更新机制及$nextTick原理的深入讲解
    目录前言Vue的异步更新DOM更新是异步的DOM更新还是批量的事件循环执行过程源码深入异步更新队列nextTick$nextTick总结一般更新DOM是同步的既然更新DOM是个同步的...
    99+
    2022-11-13
  • Vue异步更新机制和nextTick原理实例分析
    这篇文章主要介绍“Vue异步更新机制和nextTick原理实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue异步更新机制和nextTick原理实例分析”文章能帮助大家解决问题。1. 异步更...
    99+
    2023-06-27
  • Vue 中异步更新的原理是什么
    今天就跟大家聊聊有关Vue 中异步更新的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Vue 异步更新 DOM 原理很多同学都知道,Vue...
    99+
    2022-10-19
  • Vue3组件异步更新和nextTick运行机制是什么
    这篇文章主要讲解了“Vue3组件异步更新和nextTick运行机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3组件异步更新和nextTick运行机制是什么”吧!组件的异步更新...
    99+
    2023-07-06
  • 怎样理解从Vue.js源码看异步更新DOM策略及nextTick
    怎样理解从Vue.js源码看异步更新DOM策略及nextTick,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。操作DOM在使用vue.js...
    99+
    2022-10-19
  • 在vue中nextTick用法及nextTick的原理是什么
    目录什么是 nextTicknextTick 的用法nextTick 的实现原理总结Vue.js 是一个流行的前端框架,它提供了一种响应式的数据绑定机制,使得页面的数据与页面的 UI...
    99+
    2023-05-16
    vue nextTick使用 vue nextTick原理
  • vue的异步数据更新机制与$nextTick使用方法是什么
    这篇文章主要讲解了“vue的异步数据更新机制与$nextTick使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue的异步数据更新机制与$nextTick使用方法是什么”吧!v...
    99+
    2023-07-05
  • React setState异步原理是什么
    本文小编为大家详细介绍“React setState异步原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“React setState异步原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-07-04
  • Webpack热更新的原理是什么
    本篇内容介绍了“Webpack热更新的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、是什么H...
    99+
    2022-10-19
  • unity异步加载原理是什么
    Unity的异步加载原理是利用协程(Coroutine)和异步操作(AsyncOperation)来实现的。在Unity中,协程是一...
    99+
    2023-09-29
    unity
  • Java缓存更新的原理是什么
    这篇文章主要介绍“Java缓存更新的原理是什么”,在日常操作中,相信很多人在Java缓存更新的原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java缓存更新的原理是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-04
  • ADO.NET 批处理更新步骤是什么
    本篇内容介绍了“ADO.NET 批处理更新步骤是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在ADO.NET 批处理中,批处理更新只可...
    99+
    2023-06-17
  • dubbo异步调用的原理是什么
    Dubbo异步调用的原理是通过使用线程池来实现异步调用。首先,服务消费者发送请求给服务提供者,然后服务提供者将请求放入线程池中进行处...
    99+
    2023-10-23
    dubbo
  • webpack的异步加载原理是什么
    这篇文章主要讲解了“webpack的异步加载原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“webpack的异步加载原理是什么”吧!webpack ...
    99+
    2022-10-19
  • C#中异步调用的原理是什么
    本篇文章为大家展示了C#中异步调用的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#异步调用是什么呢?具体的内容又是什么呢?让我们开始C#异步调用的学习吧计算机中有些处理比较耗时。调用这...
    99+
    2023-06-17
  • windows更新失败的原因及解决方法是什么
    Windows更新失败的原因有很多,其中一些常见的原因包括:1. 网络问题:如果网络连接不稳定或中断,则Windows更新可能失败。...
    99+
    2023-09-08
    windows
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作