Vue.nextTick 到底有什么用?

Vue 虽然采用了“数据驱动”的思想,但我们依然需要在某些情况下进行少量的 DOM 操作。在 Vue 中,异步执行 DOM 更新。多数情况下,我们并不需要考虑这个过程,但是如果我们的某个操作中,DOM1 的数据变化后,DOM2  需要从 DOM1 的 DOM 结构中获取数据,就会发现数据并没有实时更新,这时候就需要用到  nextTick

我们都知道大多数情况下 Vue 数据变化后,相应的 html 也随着发生变化。事实上,当数据发生改变后,对应的 html 并没有立即重新渲染,

而是开启一个队列,并将改变的数据缓存在同一事件循环中,当刷新队列时,组件会在事件循环队列清空时的下一个“tick”更新。

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

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

页面显示如下:

但是如果我们把 mounted 钩子改为 created 钩子:

我们发现 DOM 操作失败,页面内容并未更改,在控制台上报错:未找到相应的DOM节点:

现在我们给 created 钩子稍作修改,加上 this.$nextTick, 在它的回调函数中写我们的 DOM 操作:

加上 nextTick 后,又可以正常显示:

【分析】:

created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted()钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。

再来另外一个场景:

我们现在给按钮添加点击事件,事件触发后,相应 DOM 的数据发生更改,并查看此刻该 DOM 节点数据的变化情况:

当我们第一次点击绑定事件的 DOM 后,该按钮的 innerHTML 的文字发生改变,更改为: NEW MESSAGE,但是此时打印该 DOM 所绑定的却是点击之前的旧的数据;

当我们再次点击该元素时,控制台打印的该元素绑定的数据才是新的更改的数据

总结:

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

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

原文地址:https://www.cnblogs.com/edwardwzw/p/12132330.html

时间: 2024-11-02 21:53:10

Vue.nextTick 到底有什么用?的相关文章

Vue系列---理解Vue.nextTick使用及源码分析(五)

_ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DOM操作. 三. Vue.nextTick的调用方式如下: 四:vm.$nextTick 与 setTimeout 的区别是什么? 五:理解 MutationObserver 六:nextTick源码分析 回到顶部 一. 什么是Vue.nextTick()? 官方文档解释为:在下次DOM更新循环结束之

Vue nextTick 理解

官网解释: 将回调延迟到下次 DOM 更新循环之后执行.在修改数据之后立即使用它,然后等待 DOM 更新.它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上. 我的理解:在vue完全操作完DOM之后的回调函数. 也就是说如果不调用nextTick直接用JS操作DOM的话,会出现DOM不一样的状态(数量或者属性等)

Vue.nextTick( [callback, context] )

1.在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. Vue.nextTick(() => {})  /  this.$nextTick(() => {// 更新完成}) <template lang="html"> <div> <span>{{msg}}</span> </div> </template> <script> export

Vue.nextTick()的正确使用

Vue异步执行DOM更新.只要观察导数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变,如果同一个watcher被多次触发,只会一次推入到队列中.这种在缓冲时去除重复数据对于避免不必要的计算和DOM 操作上非常重要.然后,在下一个事件循环'tick'中,Vue刷新队列并执行实际(已去重的)工作. 虽然Vue.js通常鼓励开发人员沿着'数据驱动'的方式思考,避免直接接触DOM,但是有时我们确实要这么做.为了在数据变化之后等待Vue完成更新DOM,可以在数据变化之后立即使用 V

Vue.nextTick DOM 更新循环结束之后执行延迟回调

在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 简单来说,Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新. 知乎上的例子 //改变数据 vm.message = 'changed' //想要立即使用更新后的DOM.这样不行,因为设置message后DOM还没有更新 console.log(vm.$el.textContent) // 并不会得到'changed' //这样可以,nextT

vue nextTick使用

Vue nextTick使用 vue生命周期 用法:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 通俗来说就是修改data后dom不会马上改变   可以调用 this.$nextTick 来立刻获取到data改变后dom数据. (比如我们通过ajax请求数据修改dom,发生ajax请求后立即使用 this.$refs获取dom,结果为undfined,因为修改data后dom不会马上改变,可以通过this.$nextTick) this.$

Vue.nextTick 的原理和用途

用法: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新. 在 Vue 的文档中,说明 Vue 是异步执行 DOM 更新的.关于异步的解析,可以查看阮一峰老师的这篇文章.截取关键部分如下: 具体来说,异步执行的运行机制如下. (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack).(2)主线程之外,还存

Vue源码阅读一:说说vue.nextTick实现

用法: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 疑惑: 怎么实现的延迟回调 原理: JavaScript语言的一大特点就是单线程,同一个时间只能做一件事 JavaScript任务可以分为两种,一种是同步任务,一种是异步任务 异步任务大致分为,宏任务,和微任务 所有同步任务都在主线程上执行,形成一个执行栈 主线程之外,还存在一个"任务队列"(task queue).只要异步任务有了运行结果,就在"任务队列"

我理解的关于Vue.nextTick()的正确使用

关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发.合适和够用是最完美的追求. 个人网站:http://www.linganmin.cn 最近刚写了一个手机在线播放的H5电影站:http://www.ifilm.ltd 什么是Vue.nextTick() 官方文档解释如下: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 我理解的官方文档的这句话的侧