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 17 Vue.js
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
vue动态设置路由权限的主要思路
Jan 13 Vue.js
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 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中的时间处理
2006/10/09 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
js切换div css注意的细节
2012/12/10 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
基于vue配置axios的方法步骤
2017/11/09 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
Python3爬虫全国地址信息
2019/01/05 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
python中pow函数用法及功能说明
2020/12/04 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
EJB timer的种类
2014/10/28 面试题
大学四年规划书范文
2013/12/27 职场文书
电子商务专业求职信
2014/07/10 职场文书
年度考核表个人总结
2015/03/06 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
 Python 中 logging 模块使用详情
2022/03/03 Python
Java设计模式中的命令模式
2022/04/28 Java/Android
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers