iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >vue是实时刷新dom吗
  • 559
分享到

vue是实时刷新dom吗

异步渲染Vue 2023-05-14 21:05:45 559人浏览 薄情痞子
摘要

本教程操作环境:windows7系统、vue3版,DELL G3电脑。Vue中的数据更新是异步的,意味着我们在修改完Data之后并不能立刻获取修改后的DOM元素。Vue在更新DOM时是异步执行的,只要侦听到数据变化,Vue将开启一个队列,并

vue是实时刷新dom吗

教程操作环境:windows7系统、vue3版,DELL G3电脑。

Vue中的数据更新是异步的,意味着我们在修改完Data之后并不能立刻获取修改后的DOM元素。

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

Vue异步更新DOM的原理

1、 什么时候能获取到真正的DOM元素?

在Vue的nextTick回调中。

2 、为什么Vue需要通过nextTick方法才能获取最新的DOM?

vue在调用Watcher更新视图时,并不会直接进行更新,而是把需要更新的Watcher加入到queueWatcher队列里,然后把具体的更新方法flushSchedulerQueue 传给nexTick 进行调用。
// src > core > observer > watcher.js + scheduler.js// 当一个 Data 更新时,会依次执行以下代码
// 1. 触发 Data.set
// 2. 调用 dep.notify
// 3. Dep 会遍历所有相关的 Watcher 执行 update 方法
class Watcher {
  // 4. 执行更新操作
  update() {
    queueWatcher(this);
  }
}

const queue = [];

function queueWatcher(watcher: Watcher) {
  // 5. 将当前 Watcher 添加到异步队列
  queue.push(watcher);
  // 6. 执行异步队列,并传入回调
  nextTick(flushSchedulerQueue);
}

// 更新视图的具体方法
function flushSchedulerQueue() {
  let watcher, id;
  // 排序,先渲染父节点,再渲染子节点
  // 这样可以避免不必要的子节点渲染,如:父节点中 v-if 为 false 的子节点,就不用渲染了
  queue.sort((a, b) => a.id - b.id);
  // 遍历所有 Watcher 进行批量更新。
  for (index = 0; index < queue.length; index++) {
    watcher = queue[index];
    // 更新 DOM
    watcher.run();
  }
}

1.png

2.2 nextTick -- 将传入的flushSchedulerQueue 添加到callbacks 数组中,然后执行了timerFunc 方法。

const callbacks = [];
let timerFunc;

function nextTick(cb?: Function, ctx?: Object) {
  let _resolve;
  // 1.将传入的 flushSchedulerQueue 方法添加到回调数组
  callbacks.push(() => {
    cb.call(ctx);
  });
  // 2.执行异步任务
  // 此方法会根据浏览器兼容性,选用不同的异步策略
  timerFunc();
}

2.3 timerFunc方法 -- 是根据浏览器兼容性创建的一个异步方法,执行完该方法就会调用flushSchedulerQueue 方法进行具体的DOM更新。

let timerFunc;
// 判断是否兼容 Promise
if (typeof Promise !== "undefined") {
  timerFunc = () => {
    Promise.resolve().then(flushCallbacks);
  };
  // 判断是否兼容 MutationObserver
  // https://developer.mozilla.org/zh-CN/docs/WEB/api/MutationObserver
} else if (typeof MutationObserver !== "undefined") {
  let counter = 1;
  const observer = new MutationObserver(flushCallbacks);
  const textnode = document.createTextNode(String(counter));
  observer.observe(textNode, {
    characterData: true,
  });
  timerFunc = () => {
    counter = (counter + 1) % 2;
    textNode.data = String(counter);
  };
  // 判断是否兼容 setImmediate
  // 该方法存在一些 IE 浏览器中
} else if (typeof setImmediate !== "undefined") {
  // 这是一个宏任务,但相比 setTimeout 要更好
  timerFunc = () => {
    setImmediate(flushCallbacks);
  };
} else {
  // 如果以上方法都不知道,使用 setTimeout 0
  timerFunc = () => {
    setTimeout(flushCallbacks, 0);
  };
}

// 异步执行完后,执行所有的回调方法,也就是执行 flushSchedulerQueue
function flushCallbacks() {
  for (let i = 0; i < copies.length; i++) {
    callbacks[i]();
  }
}

2.png

2.4 完善逻辑判断

2.4.1 判断has 标识,避免在一个Queue 中添加相同的Watcher;

2.4.2 判断waiting 标识,让所有的Watcher 都在一个tick 内进行更新;

2.4.3 判断flushing 标识,处理Watcher 渲染时,可能产生的新Watcher。

  如触发了v-if 条件,新增的Watcher 渲染。

3.png

tip:nextTick 只是单纯通过Promise、setTimeout等方法模拟的异步任务。

3、为什么this.$nextTick 能够获取更新后的DOM?

  调用this.$nextTick 其实就是调用图中的nextTick 方法,在异步队列中执行回调函数。根据先进先出原则,修改Data 触发的更新异步队列会先得到执行,执行完成后就生成了新的DOM,接下来执行this.$nextTick 的回调函数时,能获取到更新后的DOM元素了。

// 我们使用 this.$nextTick 其实就是调用 nextTick 方法
Vue.prototype.$nextTick = function (fn: Function) {
  return nextTick(fn, this);
};

总结:vue异步更新的原理

  • 修改 Vue 中的 Data 时,就会触发所有和这个 Data 相关的 Watcher 进行更新。

  • 首先,会将所有的 Watcher 加入队列 Queue。

  • 然后,调用 nextTick 方法,执行异步任务。

  • 在异步任务的回调中,对 Queue 中的 Watcher 进行排序,然后执行对应的 DOM 更新。

学习视频分享:vuejs入门教程、编程基础视频)

以上就是vue是实时刷新dom吗的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: vue是实时刷新dom吗

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

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

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

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

下载Word文档
猜你喜欢
  • vue是实时刷新dom吗
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。Vue中的数据更新是异步的,意味着我们在修改完Data之后并不能立刻获取修改后的DOM元素。Vue在更新DOM时是异步执行的,只要侦听到数据变化,Vue将开启一个队列,并...
    99+
    2023-05-14
    异步渲染 Vue
  • vue是不是实时刷新dom
    今天小编给大家分享一下vue是不是实时刷新dom的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue不是实时刷新dom。Vu...
    99+
    2023-07-04
  • vue实现右上角时间显示实时刷新
    本文实例为大家分享了vue实现右上角时间显示实时刷新的具体代码,供大家参考,具体内容如下 效果图 utils文件夹下的index.js export default { /...
    99+
    2024-04-02
  • Vue+WebSocket页面实时刷新长连接的实现
    最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死。。。 与后台人员讨论过后决定使用h5...
    99+
    2024-04-02
  • Vue实现页面的局部刷新(router-view页面刷新)
    利用Vue里面的provide+inject组合 首先需要修改App.vue。 <template> <!-- 公司管理 --> <di...
    99+
    2024-04-02
  • Vue怎么实现刷新页面
    这篇文章主要介绍“Vue怎么实现刷新页面”,在日常操作中,相信很多人在Vue怎么实现刷新页面问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么实现刷新页面”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-04
  • vue实现原生下拉刷新
    本文实例为大家分享了vue实现原生下拉刷新的具体代码,供大家参考,具体内容如下 这是动画样式   文字样式 html代码 <template>  ...
    99+
    2024-04-02
  • vue中如何实现页面刷新以及局部刷新
    vue中如何实现页面刷新以及局部刷新,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一.全页面刷新修改 App.vue,代码如下:<template> &n...
    99+
    2023-06-26
  • Django+Ajax异步刷新/定时自动刷新实例详解
    目录前言一、Django是什么?二、Ajax异步刷新1.jQuery语法下的Ajax运用2.定时刷新页面的样例3.展示效果总结前言 分享一下最近在学习Django过程中,遇到和解决的...
    99+
    2024-04-02
  • php实时刷新数据的方法是什么
    PHP是一种服务器端编程语言,它本身无法实现实时刷新数据。然而,可以通过一些其他的技术来实现实时刷新数据,例如:1. JavaScr...
    99+
    2023-08-17
    php
  • vue实现页面刷新动画
    本文实例为大家分享了vue实现页面刷新动画的具体代码,供大家参考,具体内容如下 做一个vue的页面刷新动画,找了好多动画样式,感谢大佬们造的轮子。 主要就是在index.html文件...
    99+
    2024-04-02
  • vue异步更新dom的实现浅析
    目录Vue异步更新DOM的原理1 什么时候能获取到真正的DOM元素?2 为什么Vue需要通过nextTick方法才能获取最新的DOM?3 为什么this.$nextTick 能够获取...
    99+
    2024-04-02
  • vue中实现页面刷新以及局部刷新的方法
    目录一.全页面刷新二、局部刷新三、应用场景总结一.全页面刷新 1.修改 App.vue,代码如下: <template> <div id="app"> ...
    99+
    2024-04-02
  • Vue批量更新dom的实现步骤
    目录场景介绍深入响应式触发getter寻找Dep.targetgettersetter总结场景介绍 在一个SFC(single file component,单文件组件)中,我们经...
    99+
    2024-04-02
  • php实时刷新数据怎么实现
    要实现PHP的实时刷新数据,可以使用以下方法:1. Ajax轮询:通过JavaScript定时向服务器发送请求,获取最新的数据,并更...
    99+
    2023-09-06
    php
  • vue怎么实现发送验证码计时器防止刷新
    这篇文章主要介绍“vue怎么实现发送验证码计时器防止刷新”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue怎么实现发送验证码计时器防止刷新”文章能帮助大家解决问题。基本实现效果按钮: &...
    99+
    2023-07-05
  • linux实时刷新文件怎么实现
    在Linux中,可以使用`tail`命令来实时刷新文件内容。 `tail`命令用于显示文件的末尾内容,默认情况下会一直输出文件的新增...
    99+
    2023-10-27
    linux
  • vue发送验证码计时器防止刷新实现详解
    目录基本实现效果防止刷新基本实现效果 按钮: <t-button @click="handleSend" :disabled="disable">{...
    99+
    2023-03-09
    vue发送验证码计时器防止刷新 vue 发送验证码
  • java实时刷新数据怎么实现
    在Java中实现实时刷新数据可以使用以下几种方法:1. 轮询:在程序中使用一个循环,定期地从数据源中获取最新的数据。可以使用定时任务...
    99+
    2023-08-17
    java
  • Vue nextTick获取更新后的DOM的实现
    目录生命周期 updateVue.nextTickPromise结语&参考资料前两天在开发时遇到一个需求:打开对话框的时候自动聚焦其中的输入框。由于原生的 autofocus...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作