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使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
vue实现按钮切换图片
Jan 20 Vue.js
vue 项目@change多个参数传值多个事件的操作
Jan 29 Vue.js
Vue实现todo应用的示例
Feb 20 Vue.js
解读Vue组件注册方式
May 15 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
vue整合百度地图显示指定地点信息
Apr 06 Vue.js
vue自定义右键菜单之全局实现
Apr 09 Vue.js
vue的项目如何打包上线
Apr 13 Vue.js
vue如何清除浏览器历史栈
May 25 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模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
安全资料员岗位职责
2013/12/14 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
新生儿未入户证明
2015/06/23 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android