Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Vue.nextTick 的原理和用途

Vue.nextTick 的原理和用途

作者头像
青梅煮码
发布于 2023-03-02 11:25:37
发布于 2023-03-02 11:25:37
5350
举报
文章被收录于专栏:青梅煮码青梅煮码

一、原理

1.异步说明

Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。

2.事件循环说明

简单来说,Vue在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。

eg:

事件循环:

第一个tick(本次更新循环)

1.首先修改数据,这是同步任务。同一事件循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及DOM.

2.Vue开启一个异步队列,并缓冲在此事件循环中发生的所有数据变化。如果同一个watcher被多次触发,只会被推入队列中一次。

第二个tick ( 下次更新循环 )

同步任务执行完毕,开始执行异步watcher队列的任务,更新DOM。Vue在内部尝试对异步队列使用原生的Promise.then和MessageChannel 方法,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。

第三个tick(下次 DOM 更新循环结束之后)

二、应用场景及原因

1.在Vue生命周期的created()钩子函数进行DOM操作一定要放到Vue.nextTick()的回调函数中。

在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进

Vue.nextTick()的回调函数中。

与之对应的就是mounted()钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不

会有问题。

2.在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中。

具体原因在Vue的官方文档中详细解释:

Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。

如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。

然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。

Vue 在内部尝试对异步队列使用原生的Promise.then和MessageChannel,如果执行环境不支持,会采用setTimeout(fn, 0)代替。

例如:

当你设置vm.someData = ‘new value’,该组件不会立即重新渲染。当刷新队列时,组件会在事件循环队列清空时的下一个“tick”更新。

多数情况我们不需要关心这个过程,但是如果你想在 DOM 状态更新后做点什么,这就可能会有些棘手。

虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们确实要这么做。

为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用Vue.nextTick(callback)。这样回调函数在 DOM 更新完成后就会调用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue.nextTick 的应用解析
在弹窗表单里,经常关闭打开要重置整个表单,使用 this.$refs.addForm.resetFields()
Krry
2020/03/07
7770
浅析$nextTick和$forceUpdate
vue中提供了数十种api供我们开发者日常使用,而常用的其实也就十多种,比如setup, mount, forceupdate, nextTick, compute, ref等,这些参数有的是在生命周期中进行管理,有的是在页面执行过程中,更新参数,有些是可以用来检测页面数据,这些随着项目的推进或多或少都是会使用到。其中nextTick和forceUpdate都是用来更新参数的,那这两个参数有什么差异呢?这还真值得仔细琢磨。
Yerik
2022/04/05
1.9K0
VUE 异步更新队列 - $nextTick()
Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后在下一个的事件循环 “tick” 中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。
用户7043603
2022/02/26
8970
Vue.nextTick核心原理
相信大家在写vue项目的时候,一定会发现一个神奇的api,Vue.nextTick。为什么说它神奇呢,那是因为在你做某些操作不生效时,将操作写在Vue.nextTick内,就神奇的生效了。那这是什么原因呢?
yyds2026
2022/10/18
5670
# $nextTick 原理解析
$nextTick:根据官方文档的解释,它可以在 DOM 更新完毕之后执行一个回调函数,并返回一个 Promise(如果支持的话)
九旬
2023/10/18
2100
面试题:Vue中$nextTick原理
 在做项目的时候,我们经常会用到nextTick,简单的理解就是它就是一个setTimeout函数,将函数放到异步后去处理;将它替换成setTimeout好像也能跑起来,但它仅仅这么简单吗?那为什么我们不直接用setTimeout呢?让我们深入剖析一下。
前端迷
2020/05/26
6.1K0
面试题:Vue中$nextTick原理
Vue.$nextTick的原理是什么-vue面试进阶
原理性的东西就会文字较多,请耐下心来,细细品味Vue中DOM更新机制当你气势汹汹地使用Vue大展宏图的时候,突然发现,咦,我明明对这个数据进行更改了,但是当我获取它的时候怎么是上一次的值(本人比较懒,就不具体举例了👵)此时,Vue就会说:“小样,这你就不懂了吧,我的DOM是异步更新的呀!!!”简单的说,Vue的响应式并不是只数据发生变化之后,DOM就立刻发生变化,而是按照一定的策略进行DOM的更新。这样的好处是可以避免一些对DOM不必要的操作,提高渲染性能。在Vue官方文档中是这样说明的:可能你还没有注意到
bb_xiaxia1998
2022/10/04
3160
Vue中的nexTick()
获取更新后的DOM言外之意就是,操作需要用到了更新后的DOM而不能使用之前的DOM或者使用更新前的DOM会出问题,所以就衍生出了这个获取更新后的 DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操作的 JS代码。
刘亦枫
2020/03/19
1.7K0
关于vue中$nextTick的一点使用心得
当下公司在做一个媒体门户网站,后台由另一家公司使用java开发并提供接口,本人负责开发后台页面,使用的是vue-element-admin开发 下面说一下问题场景,在开发过程中有一个后台管理员角色页面,其中包含一个表单dialog,在其中使用了el-tree组件,相关 代码结构如下: <div class="filter-container"> <el-button class="filter-item" style="margin-left: 10px;" v-waves @click="hand
lestat
2018/04/17
2.2K0
Vue项目中使用npm i swiper插件踩坑记录
在一个 Vue 项目中使用的,npm 的 swiper 插件,遇到了一些坑,记录一下填坑过程。
德顺
2023/08/25
9850
vueweb端响应式布局_vue响应式原理图文详解「建议收藏」
Vue最显著的特性之一便是不太引人注意的响应式系统(reactivity system)。模型层(model)只是普通JS对象,修改它则更新视图(view)。这会让状态管理变得非常简单且直观,不过理解它的工作原理以避免一些常见的问题也是很重要的。
全栈程序员站长
2022/09/02
1.6K0
Vue项目中使用npm i swiper插件踩坑记录
1、使用静态数据时,一切正常, Swiper 可以正常滚动和滑动。但是使用动态数据时,会出现不能自动滚动/播放甚至数据显示不正常的现象。
德顺
2020/06/28
3.5K0
nextTick的原理及运行机制
主线程的执行过程就是一个tick,而所有的异步结果都是通过 "任务队列" 来调度。消息队列中存放的是一个个 macro task 结束后,都要清空 所有的 micro task。
木子星兮
2020/07/17
1.3K0
Vue为何采用异步渲染
Vue在更新DOM时是异步执行的,只要侦听到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更,如果同一个watcher被多次触发,只会被推入到队列中一次,这种在缓冲时去除重复数据对于避免不必要的计算和DOM操作是非常重要的,然后,在下一个的事件循环tick中,Vue刷新队列并执行实际(已去重的)工作,Vue在内部对异步队列尝试使用原生的Promise.then、MutationObserver和setImmediate,如果执行环境不支持,则会采用setTimeout(fn, 0)代替。
WindRunnerMax
2021/02/25
2.1K1
面试必考:真的理解 $nextTick 么
浏览器(多进程)包含了「Browser进程」(浏览器的主进程)、「第三方插件进程」和「GPU进程」(浏览器渲染进程),其中「GPU进程」(多线程)和Web前端密切相关,包含以下线程:
coder_koala
2020/09/08
1.2K0
面试必考:真的理解 $nextTick 么
8 道高频出现的 Vue 面试题及答案
MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。
夜尽天明
2019/08/19
1.8K0
8 道高频出现的 Vue 面试题及答案
Vue面试题-03
前言 马上要秋招了,搜集整理了一些Vue面试题,包括组件、指令、API等相关内容,巩固基础😎秋招冲冲冲!!!本篇包括: ✅keep-alive的理解 ✅nextTick的理解 ✅vue组件之间的通信方式 ✅Vuex的理解及使用场景 keep-alive的理解 Props: include - string | RegExp | Array。只有名称匹配的组件会被缓存。 exclude - string | RegExp | Array。任何名称匹配的组件都不会被缓存。 max - number |
客怎眠qvq
2022/11/01
2.5K0
Vue中$nextTick的理解
Vue中$nextTick方法将回调延迟到下次DOM更新循环之后执行,也就是在下次DOM更新循环结束之后执行延迟回调,在修改数据之后立即使用这个方法,能够获取更新后的DOM。简单来说就是当数据更新时,在DOM中渲染完成后,执行回调函数。
WindRunnerMax
2020/08/27
1.3K0
Vue源码阅读 - 批量异步更新与nextTick原理
vue已是目前国内前端web端三分天下之一,同时也作为本人主要技术栈之一,在日常使用中知其然也好奇着所以然,另外最近的社区涌现了一大票vue源码阅读类的文章,在下借这个机会从大家的文章和讨论中汲取了一些营养,同时对一些阅读源码时的想法进行总结,出产一些文章,作为自己思考的总结,本人水平有限,欢迎留言讨论~
前端下午茶
2018/10/22
1.1K0
Vue源码阅读 - 批量异步更新与nextTick原理
Vue改变数组值,页面视图为何不刷新?
这个问题还折腾了快半个小时,归根到底还是不经常使用的后果,好多代码之前都用过,像封装组件这种还要折腾,简直是不知道说什么好呀,只能以后多使用了。
执行上下文
2022/07/26
1.7K0
Vue改变数组值,页面视图为何不刷新?
相关推荐
Vue.nextTick 的应用解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档