Vue中的nextTick作用和几个简单的使用场景


Posted in Vue.js onJanuary 25, 2021

目的

理解下 nextTick 的作用和几个简单的使用场景

正文

起什么作用?

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

我想各位都知道或了解 Vue 的渲染流程,Vue 在监听到数据变化后会重新渲染,配合 VDOM 更新真实的 DOM,而 nextTick 的触发时机就是在调用方法后的第一次重新渲染完毕后。

Vue中的nextTick作用和几个简单的使用场景

如何使用?

有两种使用方法,一种是传入回调,另一种是 Promise,官方使用示例如下:

// 修改数据
vm.msg = 'Hello'
// DOM 还没有更新
Vue.nextTick(function () {
 // DOM 更新了
})

// 作为一个 Promise 使用 (2.1.0 起新增,详见接下来的提示)
Vue.nextTick()
 .then(function () {
 // DOM 更新了
 })

如果在 SPA(单文件组件) 中,可能是这个样子

<template>
 <div id="test">{{msg}}</div>
</template>

<script>
export default {
 name: 'app',
 data() {
 return {
  "msg": "Hello World!"
 }
 },
 method() {
 this.msg = "Hi World!";
 this.$nextTick(() => {
  console.log('DOM updated:', document.getElementById('test').innerHTML)
 });
 }
}
</script>

有什么使用场景?

需要等待渲染完成后执行的一些方法

初始化绑定或操作 DOM

比如在 created 和 mounted 回调中,需要操作渲染好的 DOM,则需要在 nextTick 中执行相关逻辑,这在必须使用一些老的需要绑定 DOM 的库时很有用。

比如,在加载 UEditor 时,可能会这样玩

<template>
<script id="container" name="content" type="text/plain"> 这里写你的初始化内容 </script>
</template>
<script>
export default {
 mounted() {
  this.nextTick(() => {
   var ue = UE.getEditor('container');
  });
 }
}

获取元素宽度

在 Vue 中获取元素宽度有两种方式,第一种是通过 $refs[ref名称].style.width,第二种可以使用传统操作 DOM 的方式获取,但这两者要获取到准确的元素宽度,则需要在 DOM 渲染完毕后执行。

<template>
<p ref="myWidth" v-if="showMe">{{ message }}</p> <button @click="getMyWidth">获取p元素宽度</button>
</template>
<script>
export default {
 data() {
 return {
  message: "Hello world!",
  showMe: false,
 },
 methods: {
  getMyWidth() {
  this.showMe = true;
  //this.message = this.refs.myWidth.offsetWidth;  //报错 TypeError: this.refs.myWidth is undefined 
  this.nextTick(()=>{
  //dom元素更新后执行,此时能拿到p元素的属性   this.message = this.refs.myWidth.offsetWidth; })
  }
 }
 }
}
</script>

总结

虽说 Vue 的设计理念并不建议我们去直接操作 DOM,但有些场景下出现了特别令人迷惑的问题,理解 Vue 的渲染逻辑后,使用 nextTick() 可以解决。

以上就是如何使用Vue中的nextTick的详细内容,更多关于使用vue中的nextTick的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
详解Vue的mixin策略
Nov 19 Vue.js
Vue使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
vue如何使用rem适配
Feb 06 Vue.js
vue项目两种方式实现竖向表格的思路分析
Apr 28 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
HTML+VUE分页实现炫酷物联网大屏功能
May 27 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 #Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 #Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 #Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 #Vue.js
vue keep-alive的简单总结
Jan 25 #Vue.js
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 #Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 #Vue.js
You might like
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
js 匿名调用实现代码
2009/06/19 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
python实现发送邮件功能
2017/07/22 Python
Python输出各行命令详解
2018/02/01 Python
python读取和保存图片5种方法对比
2018/09/12 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
给你一面国旗 教你用python画中国国旗
2019/09/24 Python
Python-openCV开运算实例
2020/07/05 Python
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
银行会计职员个人的自我评价
2013/09/29 职场文书
优秀毕业生求职推荐信范文
2013/11/21 职场文书
董事长秘书职责
2014/01/31 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
公司开业庆典主持词
2014/03/21 职场文书
中班幼儿评语大全
2014/04/30 职场文书
公司董事长岗位职责
2014/06/08 职场文书
薪资证明范本
2015/06/19 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript