Vue学习计划-Vue3--核心语法(五)生命周期、自定义Hook

本文介绍了Vue2和Vue3组件的生命周期管理,包括不同阶段的钩子函数,并展示了如何使用自定义hook(如useSum和useDog)来复用代码和组织setup逻辑。
摘要由CSDN通过智能技术生成
1. 生命周期
  • 概念: Vue组件实例在创建时要经历一些列的初始化步骤,在此过程中vue会在合适的时机,调用特定函数,从而让开发中有机会在特定阶段运行自己的代码,这些特定的函数统称为:生命周期钩子
  • 规律:

生命周期整体分为四个阶段:分别是:创建、挂载、更新、销毁,每个阶段都有两个钩子,一前一后

  • Vue2的生命周期

创建阶段:beforeCreatecreated
挂载阶段:beforeMountmounted
更新阶段: beforeUpdateupdated
销毁阶段:beforeDestroydestroyed

  • Vue3的生命周期

创建阶段:setup
挂载阶段:onBeforeMountonMounted
更新阶段:onBeforeUpdateonUpdated
卸载阶段:onBeforeUnmountonMounted

  • 常用的钩子:onMounted(挂载完毕)、onUpdated(更新完毕)、onBeforeUnmount(卸载之前)
  • 示例代码
<template>
  <div>
    <h2>当前值为{{ num }}</h2>
    <button @click="changeSum">点击加1</button>
  </div>
</template>

<script setup lang="ts">
import {ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted} from 'vue'
let num = ref(0)

function changeSum() {
  num.value += 1
}
console.log('创建')

onBeforeMount(() => {
  console.log('挂载之前')
})
onMounted(() => {
  console.log('挂载完毕')
})
onBeforeUpdate(() => {
  console.log('更新之前')
})
onUpdated(() => {
  console.log('更新完毕')
})
onBeforeUnmount(() => {
  console.log('卸载之前')
})
onUnmounted(() => {
  console.log('卸载完毕')
})

</script>
2. 自定义Hook
  • 什么是hook? ————本质是一个函数,把setup函数中使用的Composition API进行了封装,类似与Vue2中的mixin
  • 自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂
  • hooks文件夹中,每一个功能的hook文件期望是usexxx命名的
  • hook的出现诠释了composition API 的终极意义
  • 示例代码
    1. useSum.ts中内容如下:
    import { ref, computed, onMounted } from 'vue'
    
    export default function() {
      let sum = ref(0)
    
      let bigSum = computed(()=> {
        return sum.value * 10
      })
    
      onMounted(()=> {
        changeSum()
      })
      
      function changeSum(){
        sum.value += 1
      }
    
      return {sum, bigSum, changeSum}
    }
    
    1. useDog.ts中内容如下:
    import { reactive, onMounted } from 'vue'
    import axios from 'axios'
    
    export default function(){
      let dogList = reactive([])
    
      async function getDog(){
          try{
            let {data} = await axios.get('https://dog.ceo/api/breed/pembroke/images/random')
            dogList.push(data.message)
          } catch(error){
            alert(error)
          }
      }
      onMounted(() => {
        getDog()
      })
    
      return {dogList, getDog}
    }
    
    1. 组件中具体使用:
    <template>
      <div>
        <h2>当前值为{{ sum }}, 变大10倍的值是: {{ bigSum }}</h2>
        <button @click="changeSum">点击加1</button>
        <hr>
        <img v-for="(dog,index) in dogList" :src="dog" :key="index" alt="">
        <button @click="getDog">添加一只狗</button>
      </div>
    </template>
    
    <script setup lang="ts">
    import useSum from '@/hooks/useSum'
    import useDog from '@/hooks/useDog'
    
    let { sum, bigSum, changeSum } = useSum()
    let { dogList, getDog } = useDog()
    </script>
    <style scoped>
    img{
      height: 150px;
      margin-right: 10px;
    }
    </style>
    
  • 26
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值