浅析vue中的nextTick


Posted in Vue.js onDecember 28, 2020

背景

vue是异步渲染的,当data改变之后,DOM不会立刻被渲染,页面渲染时会将data的修改做整合,多次data修改只会做整合最后一次性渲染出来,这也是异步渲染的原因。只有异步渲染才可以实现整合操作。

例子

methods: {
  update() {
    for (let i = 0; i < 10; i++) {
      this.testNum = this.testNum + i;
    }
  },
},

在你的 Vue 视图中, testNum 会发生变化。不过需要注意的是这个变化的过程,虽然我们把 firstNum 循环修改了 10 次,但是实际上它只会把最后一次的值更新到视图上——这也是非常合理的,比如说我们这个 demo 里,每一次循环给 testNum 的赋值只不过是一个过程,最终的目的是拿到 10 次循环的计算结果而已。如果我们硬去算 10 次,那么不必要的性能开销必然是令人肉疼的。

需求

我们需要对data修改后并拿到DOM,对DOM进行操作解决,

例子

<template>
 <div id="app">
  <ul ref="ul1">
   <li v-for="(v, i) in list" :key="i">{{ v }}</li>
  </ul>
  <button @click="add">add DOM</button>
 </div>
</template>
<script>
export default {
 name: "app",
 data() {
  return {
   list: ["a", "b", "c"],
  };
 },
 methods: {
  add() {
   this.list.push(`${Date.now()}`);
   this.list.push(`${Date.now()}`);
   this.list.push(`${Date.now()}`);
   const ulElem = this.$refs.ul1;
   console.log(ulElem.childNodes.length);
  },
 },
};
</script>

浅析vue中的nextTick

本来点击完之后数组长度应该输出6个,但是实际上数组长度只有3个,因为data改变后,DOM并不会立刻改变,此时我们是拿不到新增的节点的,这时候的DOM节点还是一开始的a,b,c 。DOM操作执行完之后,它再异步渲染。

不过我们的期望是点击完之后立刻拿到后面的三个,这时候就需要请出我们的主角nextTick。

add() {
   this.list.push(`${Date.now()}`);
   this.list.push(`${Date.now()}`);
   this.list.push(`${Date.now()}`);
   const ulElem = this.$refs.ul1;
   this.$nextTick(() => {
    console.log(ulElem.childNodes.length);
   });
  },

浅析vue中的nextTick

这个例子也可以看出,$nextTick会待DOM渲染完成再回调,同时也可以看出,我们虽然一次点击有三次修改data,但是多次修改会进行整合,最后渲染一次,这也说明渲染也是异步的,如果是同步,就没办法整合。

以上就是浅析vue中的nextTick的详细内容,更多关于vue中的nextTick的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue实现广告栏上下滚动效果
Nov 26 Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
Vite和Vue CLI的优劣
Jan 30 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
vue如何实现关闭对话框后刷新列表
Apr 08 Vue.js
vue动态绑定style样式
Apr 20 Vue.js
Vue实现省市区三级联动
Dec 27 #Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 #Vue.js
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 #Vue.js
在vue项目中封装echarts的步骤
Dec 25 #Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 #Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 #Vue.js
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 #Vue.js
You might like
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
如何用php获取文件名后缀
2013/06/09 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
jquery 选择器部分整理
2009/10/28 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
浅析Visual Studio Code断点调试Vue
2018/02/27 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
git进行版本控制心得详谈
2017/12/10 Python
python实现用户答题功能
2018/01/17 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
Python各种扩展名区别点整理
2020/02/27 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
结婚典礼证婚词
2014/01/11 职场文书
亲子拓展活动方案
2014/02/20 职场文书
大学生个人总结范文
2015/02/15 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python