背景

✅加一Q一带一你✅10812591✅邀一情一玛✅95889990✅进【 09191m 典 c o m 】✅以下疏忽
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> 

原本点击完之后数组长度应该输入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);      });    }, 

这个例子也能够看出,$nextTick会待DOM渲染实现再回调,同时也能够看出,咱们尽管一次点击有三次批改data,然而屡次批改会进行整合,最初渲染一次,这也阐明渲染也是异步的,如果是同步,就没方法整合。