当前位置: 首页 > ops >正文

Vue3学习(6)-Vue3的生命周期和自定义hook

1. Vue3生命周期

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

常用的钩子:onMounted(挂载完毕)、onUpdated(更新完毕)、onBeforeUnmount(卸载之前)

示例代码:

<template><div class="person"><h2>当前求和为:{{ sum }}</h2><button @click="changeSum">点我sum+1</button></div>
</template><!-- vue3写法 -->
<script lang="ts" setup name="Person">import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'// 数据let sum = ref(0)// 方法function changeSum() {sum.value += 1}console.log('setup')// 生命周期钩子onBeforeMount(()=>{console.log('挂载之前')})onMounted(()=>{console.log('挂载完毕')})onBeforeUpdate(()=>{console.log('更新之前')})onUpdated(()=>{console.log('更新完毕')})onBeforeUnmount(()=>{console.log('卸载之前')})onUnmounted(()=>{console.log('卸载完毕')})
</script>

注意:

  1. 需显式导入钩子(如 import { onMounted } from ‘vue’)。
  2. setup() 替代了 beforeCreate 和 created,逻辑集中在此函数中组织。
  3. 钩子函数名增加前缀 on(如 onMounted)。

2. 自定义hook

  • 定义:本质是一个函数,把setup函数中使用的Composition API进行了封装。
  • 自定义hook的优势:复用代码, 让setup中的逻辑更清楚易懂。

2.1 自定义 Hook 的本质与核心价值

  1. ​逻辑复用与解耦​
    将组件中的状态逻辑(如数据获取、事件监听、状态管理)提取为独立函数,避免重复代码。
    例:useMousePosition 封装鼠标坐标追踪逻辑,供多个组件调用。
  2. ​组合性​
    多个 Hook 可组合使用(如 useAdd + useAverage),构建复杂逻辑链。
  3. ​替代 Vue 2 的 Mixin​
    解决 Mixin 的命名冲突和来源不清晰问题,通过函数显式调用和返回数据。

2.2 创建与使用步骤

1. 创建 Hook
  • 命名规范​:以 use 开头(如 useCounter)
  • 内部实现​:
    • 使用响应式 API(ref/reactive)管理状态
    • 使用生命周期钩子(onMounted/onUnmounted)处理副作用。
    • 返回需暴露的变量或方法

示例1:

// useCounter.js
import { ref } from "vue";
export function useCounter(initialValue = 0) {const count = ref(initialValue);const increment = () => count.value++;return { count, increment };
}

示例2:
useSum.ts中内容如下:

import {ref,onMounted} from 'vue'export default function(){let sum = ref(0)const increment = ()=>{sum.value += 1}const decrement = ()=>{sum.value -= 1}onMounted(()=>{increment()})//向外部暴露数据return {sum,increment,decrement}
}		

useDog.ts中内容如下:

import {reactive,onMounted} from 'vue'
import axios,{AxiosError} from 'axios'export default function(){let dogList = reactive<string[]>([])// 方法async function getDog(){try {// 发请求let {data} = await axios.get('https://dog.ceo/api/breed/pembroke/images/random')// 维护数据dogList.push(data.message)} catch (error) {// 处理错误const err = <AxiosError>errorconsole.log(err.message)}}// 挂载钩子onMounted(()=>{getDog()})//向外部暴露数据return {dogList,getDog}
}
2. 在组件中使用

导入 Hook 并调用,解构其返回值。
示例1:

<template><p>Count: {{ count }}</p><button @click="increment">+1</button>
</template>
<script setup>
import { useCounter } from "./hooks/useCounter";
const { count, increment } = useCounter(10); // 初始值 10
</script>

示例2:

<template><h2>当前求和为:{{sum}}</h2><button @click="increment">点我+1</button><button @click="decrement">点我-1</button><hr><img v-for="(u,index) in dogList.urlList" :key="index" :src="(u as string)"> <span v-show="dogList.isLoading">加载中......</span><br><button @click="getDog">再来一只狗</button>
</template><script lang="ts">import {defineComponent} from 'vue'export default defineComponent({name:'App',})
</script><script setup lang="ts">import useSum from './hooks/useSum'import useDog from './hooks/useDog'let {sum,increment,decrement} = useSum()let {dogList,getDog} = useDog()
</script>
http://www.xdnf.cn/news/13760.html

相关文章:

  • 浅谈软件开发工作流
  • 论文参考文献干干货
  • Null-text Inversion for Editing Real Images using Guided Diffusion Models
  • ChatGPT革命升级!o3-pro模型重磅发布:开启AI推理新纪元
  • 人工智能应用案例:如何处理数据、分析数据并训练模型迭代至满意程度
  • Conan 包管理工具介绍与使用
  • 下载量飙升153.6%,《Solvely》如何成为出海AI教育应用新晋“黑马“?
  • Windows下安装MySQL5.7安装过程
  • Verilog基础:$timeformat系统任务的使用
  • Linux服务器部署n8n实战教程
  • AWS-EFS
  • 智能安全带:建筑行业安全防护的新利器
  • 黑群晖NAS部署DeepSeek模型与内网穿透实现本地AI服务
  • Linux中升级或者切换python版本
  • 网络上搜集的IFC资源共享(含下载链接)
  • LLM基础7_用于文本分类的微调
  • Cesium1.95中加载模型过多导致内存溢出的解决方案
  • 用户态与内核态是什么?有什么作用?两者在什么时候切换?为什么要切换?
  • 知识变现新趋势:创客匠人解析创始人 IP 打造与行业破局之道
  • SmartGit(图形化GitGUI客户端) v24.1.3
  • Python实现web请求与访问
  • 选品融电商:全域代运营赋能,抖音小红书销量倍增的头部引擎
  • SGDvsAdamW 优化策略详细解释
  • mybatis foreach里用bind、foreach中使用bind的坑、foreach中动态生成表名
  • 预压技术对滚珠螺杆寿命的影响是什么?
  • 预测性去匿名化攻击(PDAA):重塑数据安全攻防边界
  • 说一说Redis中如何使用一致性哈希算法
  • 强化学习:DQN学习总结
  • 野火板子上重装ubuntu20.04系统
  • gbcom线上共享瓦片