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打开其他项目页面并传入数据详解
Nov 25 Vue.js
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
Vue Elenent实现表格相同数据列合并
Nov 30 Vue.js
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
Vue中插槽slot的使用方法与应用场景详析
Jun 08 Vue.js
vue3中provide && inject的使用
Jul 01 Vue.js
使用vue判断当前环境是安卓还是IOS
Apr 12 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
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
js select option对象小结
2013/12/20 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
利用Python如何生成随机密码
2016/04/20 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
python按比例随机切分数据的实现
2019/07/11 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
泰国国际航空公司官网:Thai Airways International
2019/12/04 全球购物
android面试问题与答案
2016/12/27 面试题
社会实践自我鉴定
2013/11/07 职场文书
毕业生就业自荐信
2013/12/04 职场文书
直接有效的自我评价
2014/01/11 职场文书
建筑总经理岗位职责
2014/02/02 职场文书
初中作文评语大全
2014/04/23 职场文书
说明书格式及范文
2014/05/07 职场文书
个人向公司借款协议书
2014/10/09 职场文书
千手观音观后感
2015/06/03 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python