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 相关文章推荐
vuex的数据渲染与修改浅析
Nov 26 Vue.js
vue+element UI实现树形表格
Dec 29 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
Vue实现动态查询规则生成组件
May 27 Vue.js
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 Vue.js
Vue3中toRef与toRefs的区别
Mar 24 Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 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
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
php.ini中date.timezone设置分析
2011/07/29 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
php封装的smarty类完整实例
2016/10/19 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
代码生成器 document.write()
2007/04/15 Javascript
js 覆盖和重载 函数
2009/09/25 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
Python3使用requests发闪存的方法
2016/05/11 Python
Python书单 不将就
2017/07/11 Python
简单了解python模块概念
2018/01/11 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
python全局变量引用与修改过程解析
2020/01/07 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
模具毕业生推荐信
2014/02/15 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
幼师大班个人总结
2015/02/13 职场文书
勤俭节约主题班会
2015/08/13 职场文书
承诺书怎么写 ?
2019/04/16 职场文书