Vue3新特性的学习(四)

496 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

今天主要学习Vue3的生命周期,以及Vue3中是如何获取元素的DOM结构的。

Vue3/Vue2生命周期的对比

在vue3中,新增了一个setup生命周期函数,setup执行的时机是在beforeCreate生命函数之前执行,因此在这个函数中是不能通过this来获取实例的;同时为了命名的统一,将beforeDestroy改名为beforeUnmountdestroyed改名为unmounted

Vue2Vue3
beforeCreatesetup
createdsetup
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmounted
activatedonActived
deactivatedonDeactivated
<script lang="ts">
import {
  defineComponent,
  ref,
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
  onActivated,
  onDeactivated,
} from 'vue';
export default defineComponent({
  name: 'life',
  setup() {
    let name = ref('张三');
    console.log('setup相当于created和beforeCreate');
    onBeforeMount(() => {
      console.log('onBeforeMount');
    });
    onMounted(() => {
      console.log('onMounted');
    });
    onBeforeUpdate(() => {
      console.log('onBeforeUpdate');
    });
    onUpdated(() => {
      console.log('onUpdated');
    });
    onBeforeUnmount(() => {
      console.log('onBeforeUnmount');
    });
    onUnmounted(() => {
      console.log('onUnmounted');
    });
    onActivated(() => {
      console.log('onActivated');
    });
    onDeactivated(() => {
      console.log('onDeactivated');
    });
    return {
      name,
    };
  },
});
</script>

Vue2获取DOM

<div ref="myName">张三</div>
  created() {
    this.$nextTick(() => {
      console.log((this as any).$refs['myName'].innerHTML);
    });
  },

这里这样写是因为ts的缘故,否则是会报错的;如果js中直接就写成:

  created() {
    this.$nextTick(() => {
      console.log(this.$refs['myName'].innerHTML);
    });
  },

Vue3获取DOM

在Vue2中我们是使用this.$refs获取一个DOM或者多个DOM,Vue3中获取DOM和Vue2有些出入的,做个简单的例子来实现一下如何获取元素的DOM:

在onMounted中获取

<template>
  <div>
    <div ref="myName">张三</div>
    <div :ref="goodsRefs">羊肉串</div>
    <div :ref="goodsRefs">啤酒</div>
    <div :ref="goodsRefs">花生</div>
  </div>
</template>

<script lang="ts">
import { defineComponent, onMounted, ref, nextTick } from 'vue';
export default defineComponent({
  name: 'dom',
  setup() {
    let name = ref<any>(null);
    onMounted(()=>{
        console.log(name.value.innerHTML)
    })
    return {
      myName: name,
    };
  },
});
</script>

这里需要注意的是: 必须将ref设置一个any的泛型,这样才能使用innerHTML。 否则会出现以下的报错:

image.png

在nextTick中获取

nextTick(() => {
    console.log(name.value.innerHTML);
});

获取多个DOM

    <div :ref="goodsRefs">羊肉串</div>
    <div :ref="goodsRefs">啤酒</div>
    <div :ref="goodsRefs">花生</div>

当需要获取多个元素DOM的时候,我们直接使用一个函数来获取:

  setup() {
    let goodsRefs = (el: any) => {
      console.log(el);
    };
    return {
      goodsRefs,
    };
  },

获取到了怎么使用呢,这时候需要定义一个数组,获取到的DOM直接push到数组中即可为我们所用:

let eleGoods: any[] = [];
let goodsRefs = (el: any) => {
    eleGoods.push(el);
};

接下来继续学习Vue3的知识点~