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使用vant中的checkbox实现全选功能
Nov 17 Vue.js
如何使用 vue-cli 创建模板项目
Nov 19 Vue.js
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 Vue.js
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
Vue的生命周期一起来看看
Feb 24 Vue.js
解决vue自定义组件@click点击失效问题
Apr 30 Vue.js
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
Vue Mint UI mt-swipe的使用方式
Jun 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
PHP文件上传原理简单分析
2011/05/29 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
python利用datetime模块计算时间差
2015/08/04 Python
Python冲顶大会 快来答题!
2018/01/17 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
详解python深浅拷贝区别
2019/06/24 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Python pandas用法最全整理
2019/08/04 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
出纳岗位职责模板
2013/11/27 职场文书
生产内勤岗位职责
2013/12/07 职场文书
毕业生大学生活自我总结
2014/01/31 职场文书
作弊检讨书1000字
2014/02/01 职场文书
司机岗位职责说明书
2014/07/29 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
入党申请书怎么写?
2019/06/21 职场文书
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏