详解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 相关文章推荐
JavaScript中的集合及效率
Jan 08 Javascript
js 针对html DOM元素操作等经验累积
Mar 11 Javascript
获取当前点击按钮的id用this.id实现
Mar 17 Javascript
巧用replace将文字表情替换为图片
Apr 17 Javascript
node.js中的fs.createWriteStream方法使用说明
Dec 17 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
Mar 23 Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 Javascript
vue2.0自定义指令示例代码详解
Apr 25 Javascript
vue增加强缓存和版本号的实现方法
May 01 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
Sep 05 Javascript
vue使用video插件vue-video-player详解
Oct 23 Javascript
element 动态合并表格的步骤
Dec 31 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
php实现微信扫码支付
2017/03/26 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
python访问sqlserver示例
2014/02/10 Python
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
Python如何调用JS文件中的函数
2019/08/16 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
水利学院求职自荐书
2014/02/01 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
网聊搭讪开场白
2015/05/28 职场文书
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL