浅析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 相关文章推荐
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 Vue.js
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 Vue.js
vue实现滑动解锁功能
Mar 03 Vue.js
vue实现拖拽交换位置
Apr 07 Vue.js
vue实现input输入模糊查询的三种方式
Aug 14 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
德劲1103二次变频版的打磨
2021/03/02 无线电
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
Python中input和raw_input的一点区别
2014/10/21 Python
零基础写python爬虫之神器正则表达式
2014/11/06 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
Python闭包思想与用法浅析
2018/12/27 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Python如何读取、写入CSV数据
2020/07/28 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
服装促销活动方案
2014/02/23 职场文书
解除财产保全担保书
2014/05/20 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记
win10搭建配置ftp服务器的方法
2022/08/05 Servers
MySQL自定义函数及触发器
2022/08/05 MySQL