1、组件基础

每一个.vue 文件呢都可以充当组件来使用
每一个组件都可以复用

2、组件的生命周期

简单来说就是一个组件从创建到销毁的过程成为生命周期
在我们使用Vue3 组合式API 是没有 beforeCreate 和 created 这两个生命周期的
image.png

onBeforeMount()-创建之前

在组件DOM实际渲染安装之前调用。在这一步中,根元素还不存在。

onMounted()-创建完成

在组件的第一次渲染后调用,该元素现在可用,允许直接DOM访问

onBeforeUpdate()-更新之前

数据更新时调用,发生在虚拟 DOM 打补丁之前。

updated()-更新完成

DOM更新后,updated的方法立即调用。

onBeforeUnmount()-卸载之前

在卸载组件实例之前调用。在这个阶段,实例仍然是完全正常的。

onUnmounted()-卸载完成

卸载组件实例后调用。调用此钩子时,组件实例的所有指令都被解除绑定,所有事件侦听器都被移除,所有子组件实例被卸载。

选项式 API Hook inside setup
beforeCreate Not needed*
created Not needed*
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate更新之前
updated onUpdated更新之后
beforeUnmount onBeforeUnmount卸载之前
unmounted onUnmounted卸载完成
errorCaptured onErrorCaptured
renderTracked onRenderTracked
renderTriggered onRenderTriggered
activated onActivated
deactivated onDeactivated

父组件

  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import HelloWorld from "./components/HelloWorld.vue";
  4. const flag = ref(true);
  5. </script>
  6. <template>
  7. <HelloWorld v-if="flag"></HelloWorld>
  8. <div>
  9. <button @click="flag = !flag">改变组件状态</button>
  10. </div>
  11. </template>

子组件

  1. <script setup lang="ts">
  2. import {
  3. onBeforeMount,
  4. onMounted,
  5. onBeforeUpdate,
  6. onUpdated,
  7. onBeforeUnmount,
  8. onUnmounted,
  9. ref
  10. } from "vue";
  11. let count = ref(0)
  12. onBeforeMount(() => {
  13. let div = document.querySelector("#hello");
  14. console.log('创建之前 ===> onBeforeMount',div);
  15. });
  16. onMounted(() => {
  17. let div = document.querySelector("#hello");
  18. console.log('创建完成 ===> onMounted',div);
  19. });
  20. onBeforeUpdate(() => {
  21. console.log('更新之前 ===> onBeforeUpdate',count.value);
  22. })
  23. onUpdated(()=>{
  24. console.log('更新之后 ===> onUpdated',count.value);
  25. })
  26. onBeforeUnmount(()=>{
  27. console.log('卸载之前 ===> onBeforeUnmount');
  28. })
  29. onUnmounted(()=>{
  30. console.log('卸载完成 ===> onUnmounted');
  31. })
  32. </script>
  33. <template>
  34. <div id="hello">hello 胡雪</div>
  35. {{count}}
  36. <button @click="count++">+1</button>
  37. </template>

image.png