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+element-ui添加自定义右键菜单的方法示例
Dec 08 Vue.js
Vue实现小购物车功能
Dec 21 Vue.js
Vue仿百度搜索功能
Dec 28 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 Vue.js
vue3.0封装轮播图组件的步骤
Mar 04 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
Vue+Flask实现图片传输功能
Apr 01 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 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的十大要点(上)
2009/02/04 PHP
php基础学习之变量的使用
2011/06/09 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
JS处理VBArray的函数使用说明
2008/05/11 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
详解在React里使用&quot;Vuex&quot;
2018/04/02 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
Python程序设计入门(4)模块和包
2014/06/16 Python
基于Python实现文件大小输出
2016/01/11 Python
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
Python 常用string函数详解
2016/05/30 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python3处理HTTP请求的实例
2018/05/10 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
python async with和async for的使用
2019/06/20 Python
Python3常用内置方法代码实例
2019/11/18 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
Java软件工程师综合面试题笔试题
2013/09/08 面试题
公路绿化方案
2014/05/12 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis