浅析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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
vue3 自定义图片放大器效果的示例代码
Jul 23 Vue.js
Vue3实现简易音乐播放器组件
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
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php 注册时输入信息验证器的实现详解
2013/07/05 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
Javascript简单实现可拖动的div
2013/10/22 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
下载给定网页上图片的方法
2014/02/18 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
成人教育自我鉴定
2013/11/01 职场文书
最热门的自我评价
2013/12/30 职场文书
小学生班会演讲稿
2014/01/09 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
签约仪式致辞
2015/07/30 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫