【vue3|第14期】深入Vue3自定义Hooks:掌握组件逻辑复用的核心

日期:2024年6月26日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006

说在最前面:本文 vue3 的示例代码,在没有另外声名的情况下,均采用 <script setup> 组合式代码风格,风格统一,避免混乱,请各位新老食客放心食用哈 ^ _ ^


文章目录

  • 一、前言
  • 二、什么是Hooks?
  • 三、Hooks的实现原理
  • 四、Hooks的作用与应用场景
    • 1、Hooks的作用
    • 2、Hooks的应用场景
  • 五、vue3 Hooks优缺点
    • 1、vue3 Hooks优点:
    • 2、vue3 Hooks缺点:
  • 六、Hooks书写规范
  • 七、如何定义并使用 vue3 Hooks
    • 示例一:追踪鼠标位置
      • (1-1)定义
      • (1-2)调用
    • 示例二:计数器
      • (2-1) 定义
      • (2-2)调用
  • 八、总结


在这里插入图片描述


一、前言

Vue3 的世界中,自定义 Hooks 本质上是一段具有复用性的代码,为我们带来了更强大的功能更优雅的代码组织方式。它犹如一把锋利的“钩子”,在组件的构建过程中插入所需的逻辑。通过 Composition API 提供的灵活 API 设计,自定义 Hooks 能够将组件中的逻辑代码巧妙地包装起来,实现在多个组件之间共享和复用,极大地提升了开发效率和代码的可维护性。

二、什么是Hooks?

Hook,直译为“钩子”,是一种设计模式,允许我们在不修改组件内部逻辑的情况下,复用组件逻辑。它使得我们可以将组件的某些逻辑提取到单独的函数中,这个函数可以被 其他组件Hooks 调用。

三、Hooks的实现原理

Vue3 的自定义 Hooks 是基于 Composition API 来实现的。这些 Hooks 可以在组件的生命周期的不同阶段被调用,执行特定的任务。本质上,Hooks特殊的函数,能够在组件的setup 函数中被使用,通过导入如 ref, reactive, onMounted 等API,来创建和管理响应式数据、处理副作用操作以及绑定生命周期事件。

简单来说,Hooks 是通过一系列的 组合式 API 来实现 状态副作用管理,使得函数式组件能够拥有类似类组件的功能。

四、Hooks的作用与应用场景

1、Hooks的作用

  • 状态管理:通过定义状态管理的 Hooks,如useCounter,可以封装计数器的状态和行为。
  • 数据处理:例如,编写一个 useFetchDataHook 来处理 API 请求,获取数据并更新组件状态。
  • 副作用管理:创建一个处理订阅事件的 Hook,确保在组件卸载时清除事件监听器。
  • 表单处理:编写处理表单验证和提交逻辑的 Hooks

2、Hooks的应用场景

  • 逻辑复用:在不同组件间共享相同的业务逻辑。
  • 逻辑拆分:将大型组件的逻辑拆分成易于管理和复用的小块。
  • 副作用管理:确保如定时器、事件监听等在组件卸载时得到正确处理。

五、vue3 Hooks优缺点

1、vue3 Hooks优点:

  • 提高代码复用性和可维护性:通过复用组件逻辑,减少代码冗余,提高代码可维护性。
  • 解耦组件:降低组件间的耦合,提高代码可维护性。
  • 提高开发效率:复用和解耦可以让开发者更快地开发和维护组件。

2、vue3 Hooks缺点:

  • 学习成本:初学者可能需要一定时间来理解和掌握 Hooks 的使用。
  • 过度使用:如果过度使用 Hooks,可能会导致代码变得复杂,降低开发效率。
  • 代码质量:第三方 Hooks 质量和兼容性参差不齐。

六、Hooks书写规范

在编写 Hooks 时,建议遵循以下规范:

  • 命名规范:以“use”开头,描述 Hooks 的功能易于理解:命名应清晰明了,让人一眼就能了解 Hooks 的作用,如 useMonsePositionuseCounter 以及 useFetchData 等。
  • 参数和返回值Hooks 的参数和返回值应尽量简单明了,避免复杂的数据结构。
  • 单一职责原则:每个 Hooks 应该只实现一个功能,避免逻辑复杂。
  • 副作用管理:在自定义 Hooks 中,我们需要确保正确地管理副作用操作,如定时器、事件监听等。

七、如何定义并使用 vue3 Hooks

示例一:追踪鼠标位置

(1-1)定义

路径:xxx/sys/hooks/useMonsePosition.js

// useMousePosition.js
import { ref, onMounted, onUnmounted } from 'vue';  // 本质上导出一个函数  
export default function() {  const x = ref(0);  const y = ref(0);  // 业务逻辑function updatePosition(event) {  x.value = event.clientX;  y.value = event.clientY;  }  //挂载后处理onMounted(() => {  window.addEventListener('mousemove', updatePosition);  });  //卸载前处理onUnmounted(() => {  window.removeEventListener('mousemove', updatePosition);  });  // 返回一个对象return { x, y };  
}

(1-2)调用

路径:xxx\sys\App.vue

// App.vue<template>  <div>  Mouse position(x,y):{{ x }},{{ y }}</div>  
</template>  <script setup>  
//导入自定义hooks函数
import { useMousePosition } from '@/hooks/useMousePosition';  
//调用函数,并解耦接收返回值
const { x, y } = useMousePosition();  
</script>

示例二:计数器

(2-1) 定义

路径:xxx/sys/hooks/useCounter.js

// useCounter.jsimport { ref, onMounted } from 'vue';// 创建自定义Hooks
export default function(initialValue = 0) {const count = ref(initialValue);function increment() {count.value++;}function decrement() {count.value--;}onMounted(() => {// 执行一些操作,例如设置初始值});return { count, increment, decrement };
}

(2-2)调用

路径:xxx\sys\App.vue

// App.vue<template>当前数值是:{{ count }}<button @click="increment">加一</button><button @click="decrement">减一</button>
</template><script setup>
import useCounter from '@/hooks/useCounter';
const { count,increment,decrement } = useCounter()
</script>

八、总结

自定义Hooks在Vue 3中的应用使得我们能够更加高效地组织和重用组件逻辑,是现代Vue开发的一大利器。尽管存在一定的学习成本,但其带来的好处是显而易见的,为我们提供了一种高效、灵活的方式来构建和组织代码,让我们能够更好地应对各种开发需求


参考文章:

  • Vue.js

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/139986768

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动力环境监控系统内部绝密报价!动环监控系统全套价格一览

作为一个综合性的监控系统&#xff0c;动力环境监控系统包含动力系统、环境系统、安防系统等&#xff0c;是整个机房的控制中枢&#xff0c;无论哪里出现问题都可以实时监测到&#xff0c;并在第一时间通知管理人员。当然&#xff0c;根据机房大小和监测需求不同&#xff0c;动…

Windows系统开启python虚拟环境

.\env4socre\Scripts\activate : 无法加载文件 E:\SocreMan\env4socre\Scripts\Activate.ps1&#xff0c;因为在此系统上禁止运行脚本。 环境&#xff1a;windows 11、vscode 1、用管理员权限打开powershell 输入set-executionpolicy remotesigned&#xff0c;选择Y 2、返回v…

稀疏迭代最近点算法(Sparse ICP)

2013年&#xff0c;2013年Sofien Bouaziz等提出了一种新的ICP改进算法&#xff0c;稀疏迭代最近点(Sparse Iterative Closest Point, Sparse ICP)算法。更多扩展资料可参看随书附赠资源中的说明文档。 Sparse ICP算法的设计的灵感、应用范围、优缺点和泛化能力 两个几何数据集…

NAS—网络附加存储

关键词&#xff1a;私有化存储、Nas、云盘、群晖、Tailscale、 前言 身处于互联网时代的我们&#xff0c;几乎每时每刻都在与计算机打交道&#xff0c;而软件则作为我们和计算机之间沟通的桥梁&#xff0c;因此可以认为软件的作用是&#xff1a;将计算机能力进行包装&#xf…

瓦罗兰特新赛季更新资讯 瓦罗兰特新赛季免费加速器

瓦罗兰特新赛季来喽&#xff0c;这是一款由拳头开发的免费第一人称射击游戏&#xff0c;游戏凭借其独特的玩法和丰富的英雄选择吸引了大量玩家。 我们可以在游戏中选择自己喜欢的角色出场与敌人进行对战&#xff0c;而且每一个角色都有自己独特的道具以及技能&#xff0c;使用好…

SwiftUI 中的内容边距

文章目录 前言创建示例适配 iPad使用 contentMargins可运行 Demo总结前言 SwiftUI 引入了一组视图修饰符,使我们能够有效地管理视图中的安全区域。在许多情况下,安全区域是你希望放置内容的地方。今天,我们将了解 SwiftUI 引入的新内容边距概念以及它与安全区域的区别。 创…

【Proteus仿真】多变循环彩灯

【Proteus仿真】多变循环彩灯 ‍ 01功能描述 10种灯光效果可通过按键进行切换/通过按键切换灯光效果&#xff0c;通过数码管显示当前灯光模式&#xff0c;并通过按键调节当前灯光速度快慢。 02原理图 ​​ ‍ 03资料内容 源码仿真 04资料获取链接 https://docs.qq.co…

【unity笔记】五、UI面板TextMeshPro 添加中文字体

Unity 中 TextMeshPro不支持中文字体&#xff0c;下面为解决方法&#xff1a; 准备字体文件&#xff0c;从Windows系统文件的Fonts文件夹里拖一个.ttf文件&#xff08;C盘 > Windows > Fonts &#xff09; 准备字库文件,新建一个文本文件&#xff0c;命名为“字库”&…

确认偏差:金融市场交易中的隐形障碍

确认偏差&#xff0c;作为一种深刻影响交易员决策与表现的心理现象&#xff0c;其核心在于个体倾向于寻求与既有信念相符的信息&#xff0c;而自动过滤或轻视与之相悖的资讯。这种认知偏见严重扭曲了交易者的决策过程&#xff0c;导致他们过分依赖符合既有观念的数据&#xff0…

pdf合并,这三种方法学会了吗?

在信息爆炸的时代&#xff0c;PDF文档凭借其跨平台、不易修改的特性&#xff0c;成为了我们工作和学习中不可或缺的一部分。然而&#xff0c;当面对多个PDF文件需要合并成一个完整的文档时&#xff0c;许多人可能会感到头疼。今天&#xff0c;就让我们一起来探讨三种高效的PDF合…

Rust Eq 和 PartialEq

Eq 和 PartialEq 在 Rust 中&#xff0c;想要重载操作符&#xff0c;你就需要实现对应的特征。 例如 <、<、> 和 > 需要实现 PartialOrd 特征: use std::fmt::Display;struct Pair<T> {x: T,y: T, }impl<T> Pair<T> {fn new(x: T, y: T) ->…

C#——里氏转换详情

里氏转换 里氏转换就是派生类的对象赋值给父类对象&#xff0c;反之则不行 实例 : 先创键一个类然后继承 调用

LLM App统计报告【Streamlit】

本文重点介绍了 Streamlit 报告&#xff1a;2023 年 LLM 应用状况&#xff0c;深入了解了 2023 年在 Streamlit 社区云上部署的所有 LLM 应用程序的统计数据。 Streamlit 是一个开源框架&#xff0c;旨在方便部署数据科学和机器学习应用程序。LLM 的最新发展使 Streamlit 成为开…

[leetcode]search-insert-position 搜索插入位置

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int searchInsert(vector<int>& nums, int target) {int left 0, right nums.size()-1;while(left <right) {int mid left (right-left)/2;if(nums[mid] target){return mid;} else if(nu…

软件测试之接口测试(Postman/Jmeter)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是接口测试 通常做的接口测试指的是系统对外的接口&#xff0c;比如你需要从别的系统来…

Omni 动画核心运动包 - 为 Unity 游戏开发者带来卓越体验

Omni 动画核心运动包 前言资源包内容领取兑换码 前言 亲爱的 Unity 游戏开发者们&#xff0c;今天要向大家介绍一款令人瞩目的动画资源 - Omni 动画核心运动包。 这个运动包包含了多达 74 个 mocap 运动动画&#xff0c;每一个动画都是由专业演员通过我们先进的人工智能驱动动…

汽车电子行业知识:什么是车载智能座舱

1.什么是车载智能座舱 车载智能座舱是指搭载在汽车内部的一种智能系统&#xff0c;它集成了各种功能和技术&#xff0c;旨在提升驾驶体验、增加安全性和提供更多的便利。这种系统可以包括诸如智能驾驶辅助、信息娱乐、智能语音控制、车内环境控制、车辆健康监测等功能。通过车…

AI数据分析003:用kimi生成一个正弦波数学动画

文章目录 一、正弦波公式二、输入内容三、输出内容一、正弦波公式 ƒ(x) = a * sin(x + x0) + b 公式中: a: 决定正弦函数振动幅度的大小; x0:表示x开始比0拖后的弧度值; b:表示函数偏离X轴的距离; 对于难以理解的学生来说,可以用动画把这个公式直观的展现出来。 二…

cartographer从入门到精通(一):cartographer介绍

一、cartographer重要文档 有关cartographer的资料有2个比较重要的网站&#xff0c;我们的介绍也是基于这两个网站&#xff0c;其中会加入自己的一些理解&#xff0c;后续也有一些对代码的修改&#xff0c;来实现我们想完善的功能。 1-Cartographer 2-Cartographer ROS 第1个…

【蓝桥杯省赛真题46】python数字币统计 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python数字币统计 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python数字币统计 第十四届蓝桥杯青少年组python比赛省赛真题 一、题目…