详解vue指令与$nextTick 操作DOM的不同之处


Posted in Javascript onAugust 02, 2018

异步更新队列

可能你还没有注意到,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 更新完成后就会调用。例如:

<div id="example">{{message}}</div>
var vm = new Vue({
 el: '#example',
 data: {
 message: '123'
 }
})
vm.message = 'new message' // 更改数据
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
 vm.$el.textContent === 'new message' // true
})

在组件内使用 vm.$nextTick() 实例方法特别方便,因为它不需要全局 Vue ,并且回调函数中的 this 将自动绑定到当前的 Vue 实例上:

Vue.component('example', {
 template: '<span>{{ message }}</span>',
 data: function () {
 return {
  message: '没有更新'
 }
 },
 methods: {
 updateMessage: function () {
  this.message = '更新完成'
  console.log(this.$el.textContent) // => '没有更新'
  this.$nextTick(function () {
  console.log(this.$el.textContent) // => '更新完成'
  })
 }
 }
})

vue指令

钩子函数

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

unbind:只调用一次,指令与元素解绑时调用。

钩子函数的参数 (即 el、binding、vnode 和 oldVnode)。

需要注意的是:update时dom可能还没有插入文档,componentUpdated是DOM已经插入文档。并且所谓的“更新”这个钩子函数的触发条件非常宽泛,不容易把控。比如,其他与该节点无关的相邻节点更新,引发其布局的重流,也会导致该钩子函数触发

因此,如果想要在数据更新后,操作DOM,使用指令的update, componentUpdated 需要谨慎,可以考虑使用nextTick

总结

以上所述是小编给大家介绍的vue指令与$nextTick 操作DOM的不同之处,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
根据鼠标的位置动态的控制层的位置
Nov 24 Javascript
JavaScript的document对象和window对象详解
Dec 30 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
Dec 21 Javascript
Document:getElementsByName()使用方法及示例
Oct 28 Javascript
jquery实现checkbox 全选/全不选的通用写法
Feb 22 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
JavaScript实现简单获取当前网页网址的方法
Nov 09 Javascript
原生js制作日历控件实例分享
Apr 06 Javascript
JS实现六边形3D拖拽翻转效果的方法
Sep 11 Javascript
vue.js 上传图片实例代码
Jun 22 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
Feb 24 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
Aug 10 Javascript
vue组件挂载到全局方法的示例代码
Aug 02 #Javascript
原生js封装的ajax方法示例
Aug 02 #Javascript
JS实现根据指定值删除数组中的元素操作示例
Aug 02 #Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 #Javascript
JavaScript防止全局变量污染的方法总结
Aug 02 #Javascript
微信小程序之自定义组件的实现代码(附源码)
Aug 02 #Javascript
Array数组对象中的forEach、map、filter及reduce详析
Aug 02 #Javascript
You might like
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
Smarty模板配置实例简析
2019/07/20 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
firefo xml 读写实现js代码
2009/06/11 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
js输出列表实现代码
2010/09/12 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
vue实现图片懒加载的方法分析
2020/02/05 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
Python操作MySQL数据库9个实用实例
2015/12/11 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
对Python3 序列解包详解
2019/02/16 Python
python numpy 反转 reverse示例
2019/12/04 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
国际贸易求职信
2014/07/05 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
Python内置的数据类型及使用方法
2022/04/13 Python