程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Vue2

  • Vue3

    • 初识Vue3
    • 组合式API
    • Vue3中的data数据
    • vue3 的 script标签
    • setup函数中执行顺序
    • toRefs() 与 toRef()
    • computed()
    • Vue3弱化this
    • watch() 和 watchEffec()
    • define函数用法
    • defineExpose() 和 ref 属性
    • vue.config.js
    • 生命周期
    • Vue3全局API调用
    • 自定义 Hook
      • 1. 什么是 hook?
      • 2. 自定义 hook 的优势
      • 3. 自定义 Hook 的语法
      • 4. 自定义hook(用于计数)
      • 5. 自定义hook(用于获取图片并管理)
      • 6. 组件中使用自定义hook
    • 传递数据(props)
    • 路由
    • pinia
    • 组件通信
    • getCurrentInstance() 和 nextTick()
    • Vue3 新组件
  • vue3 + TS 项目集成

  • Vue全家桶
  • Vue3
scholar
2024-08-05
目录

自定义 Hook

# 自定义 Hook

# 1. 什么是 hook?

hook 本质上是一个函数,它将 setup 函数中使用的 Composition API 进行了封装,类似于 Vue2.x 中的 mixin。通过自定义 hook,可以将逻辑进行抽离和复用,使 setup 函数中的代码更加清晰和易于维护。

# 2. 自定义 hook 的优势

  • 复用代码:将通用的逻辑封装在一个 hook 函数中,可以在多个组件中复用。
  • 逻辑分离:将复杂的逻辑抽离到单独的 hook 中,使 setup 函数中的代码更加简洁明了。
  • 易于维护:修改 hook 函数中的逻辑,可以同步影响到使用该 hook 的所有组件,提升代码的可维护性。

# 3. 自定义 Hook 的语法

自定义 Hook 是通过函数封装组合式 API (ref, reactive, computed, watch, 等) 来实现的。一个自定义 Hook 通常返回一个对象,包含需要暴露给外部的数据和方法。

定义自定义 Hook 的基本步骤

  1. 创建 Hook 函数:定义一个函数,将组合式 API 封装在其中。
  2. 使用组合式 API:在 Hook 函数中使用 ref、reactive、onMounted 等 API。
  3. 暴露数据和方法:通过返回对象的方式,将需要的数据和方法暴露给外部使用。

# 4. 自定义hook(用于计数)

useSum.ts 中内容如下:定义一个自定义 hook 用于管理一个简单的计数逻辑。

import { ref, onMounted } from 'vue';

// 定义 useSum 自定义 Hook
export default function useSum() {
  // 定义响应式数据 sum
  let sum = ref(0);

  // 定义 increment 方法
  const increment = () => {
    sum.value += 1;
  };

  // 定义 decrement 方法
  const decrement = () => {
    sum.value -= 1;
  };

  // 在组件挂载时调用 increment 方法
  onMounted(() => {
    increment();
  });

  // 向外部暴露数据和方法
  return { sum, increment, decrement };
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 5. 自定义hook(用于获取图片并管理)

useDog.ts 中内容如下:定义一个自定义 hook 用于获取狗狗图片,并管理相关状态。

import { reactive, onMounted } from 'vue';
import axios, { AxiosError } from 'axios';

// 定义 useDog 自定义 Hook
export default function useDog() {
  // 定义响应式数据 dogList
  let dogList = reactive<string[]>([]);

  // 定义获取狗狗图片的方法 getDog
  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 = error as AxiosError;
      console.log(err.message);
    }
  }

  // 在组件挂载时调用 getDog 方法
  onMounted(() => {
    getDog();
  });

  // 向外部暴露数据和方法
  return { dogList, getDog };
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 6. 组件中使用自定义hook

<template>
  <div>
    <!-- 使用 useSum 提供的数据和方法 -->
    <h2>当前求和为:{{ sum }}</h2>
    <button @click="increment">点我+1</button>
    <button @click="decrement">点我-1</button>
    <hr>
    <!-- 使用 useDog 提供的数据和方法 -->
    <img v-for="(url, index) in dogList" :key="index" :src="url">
    <button @click="getDog">再来一只狗</button>
  </div>
</template>

<script lang="ts" setup>
import useSum from './hooks/useSum';
import useDog from './hooks/useDog';

// 使用自定义 Hook
let { sum, increment, decrement } = useSum();
let { dogList, getDog } = useDog();
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

通过自定义 hook,可以将组件中重复的逻辑提取出来,封装成独立的函数。这样在需要使用这些逻辑的组件中,只需导入并调用自定义 hook,即可复用这些逻辑。自定义 hook 提升了代码的可读性和可维护性,是 Vue3 组合式 API 的一大亮点。

编辑此页 (opens new window)
上次更新: 2025/01/30, 23:55:43
Vue3全局API调用
传递数据(props)

← Vue3全局API调用 传递数据(props)→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式