浅析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中使用mockjs代码实例
Nov 25 Vue.js
vue element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
Vue如何实现验证码输入交互
Dec 07 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
vue router 动态路由清除方式
May 25 Vue.js
vue实现input输入模糊查询的三种方式
Aug 14 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
利用js调用后台php进行数据处理原码
2006/10/09 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
用javascript连接access数据库的方法
2006/11/17 Javascript
jquery 选择器部分整理
2009/10/28 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
python使用webbrowser浏览指定url的方法
2015/04/04 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
python中使用while循环的实例
2019/08/05 Python
举例讲解Python装饰器
2020/12/24 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
艺术设计专业个人求职信
2014/04/10 职场文书
学校对教师的评语
2014/04/28 职场文书
爱国主义教育活动总结
2014/05/07 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
创业计划书之餐饮
2019/09/02 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python