【vue】$nextTick、mixin的理解及使用


一,$nextTick

<template>
  <div>
    <ul ref="ul">
      <li v-for="(i, index) in list" :key="index">{{ i }}</li>
    </ul>

    <button @click="addItem">添加</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ["a", "b", "c"],
    };
  },

  methods: {
    addItem() {
      this.list.push("d");

      // 可以先猜猜打印出的长度是几?打印出3,是不是不符合预期?
      console.log(this.$refs.ul.childNodes.length);
      /**
       * 这是因为vue是异步渲染,当data中的数据发生改变时,
       * vue并不会直接去渲染dom,
       * 如果直接渲染,那么改一次data渲染一次,对速度以及用户体验极不友好
       * 所以就有这么一个回调,当页面渲染完成后会执行,
       * 这个回调就是$nextTick
       * 使用也特别简单 */

      this.$nextTick(() => {
        // 这时候打印的就是4
        console.log(this.$refs.ul.childNodes.length);
      });
    },
  },
};
</script>

<style></style>

二,mixin

mixin其实就是将多个组件的export default 中共同的部分抽离出来,就是类似css中抽离公共样式,并不难理解,看下代码就可以明白:

<template>
  <div>
    <ul>
      <!-- 代码中的gender city 和showHobby方法并没有定义,那么是从哪里来的呢? -->
      <li>{{ name }}</li>
      <li>{{ age }}</li>
      <li>{{ gender }}</li>
      <li>{{ city }}</li>
      <li v-if="flag">{{ hobby }}</li>
      <li></li>
    </ul>
    <button @click="showHobby">显示爱好</button>
  </div>
</template>

<script>
// 首先引入mixin
import mixin from "./mixin.js";
export default {
  // 在这里使用minxin,可以是多个,写到数组中就行,gender,city以及showHobby就在mixin这个文件内定义。
  mixins: [mixin],
  data() {
    return {
      name: "zhangsan",
      age: 18,
      flag: false,
    };
  },
};
</script>

<style></style>


mixin.js中的内容,相当于哪个组件引用这个mixin,那么这个mixin的内容就会和这个组件的内容混合到一起,比如data中的属性就会混合,mounted和methods中的方法也会混合在一起

export default {
  data() {
    return {
      gender: "男",
      city: "西安",
      hobby: "吉祥村",
    };
  },

  methods: {
    showHobby() {
      this.flag = true;
    },
  },
};

总结

  • vue是异步渲染,data更新之后,并不会立即渲染dom,而是将所有的更新整合起来之后,再一次性的渲染到页面中
  • $nextTick主要用在组件更新后获取最新的dom,所以如果想让组件在更新之后第一时间获取到dom元素,那么就可以使用$nextTick这个钩子
  • mixin在某些场景特别好用,但也有一些缺点:比如如果是别人写的mixin,那么你就会很疑惑这个属性是从哪里来的,不利于阅读。而且会出现变量冲突,以及多对多的关系,所以mixin虽然好用,但也要慎用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值