React 和 Vue的自定义Hooks是如何实现的,如何创建自定义钩子

目的:将公共逻辑提取出来,类似于 mixin,解决了mixin的设计缺陷。

React 和 Vue 自定义 Hooks 实现对比

React 自定义 Hooks

React 的自定义 Hooks 是 JavaScript 函数,它们以 use 开头,可以调用其他 Hooks。

基本规则

  1. 必须以 use 开头命名
  2. 可以在内部调用其他 Hooks
  3. 只能在 React 函数组件或其他 Hooks 中调用

示例:自定义计数器 Hook

import { useState } from 'react';// 自定义计数器 Hook
function useCounter(initialValue = 0, step = 1) {const [count, setCount] = useState(initialValue);const increment = () => setCount(prev => prev + step);const decrement = () => setCount(prev => prev - step);const reset = () => setCount(initialValue);return { count, increment, decrement, reset };
}// 使用自定义 Hook
function CounterComponent() {const { count, increment, decrement, reset } = useCounter(0, 2);return (<div><p>Count: {count}</p><button onClick={increment}>+</button><button onClick={decrement}>-</button><button onClick={reset}>Reset</button></div>);
}

示例:自定义数据获取 Hook

import { useState, useEffect } from 'react';function useFetch(url) {const [data, setData] = useState(null);const [loading, setLoading] = useState(true);const [error, setError] = useState(null);useEffect(() => {const fetchData = async () => {try {const response = await fetch(url);if (!response.ok) throw new Error('Network response was not ok');const result = await response.json();setData(result);} catch (err) {setError(err);} finally {setLoading(false);}};fetchData();}, [url]);return { data, loading, error };
}// 使用示例
function UserList() {const { data, loading, error } = useFetch('https://api.example.com/users');if (loading) return <div>Loading...</div>;if (error) return <div>Error: {error.message}</div>;return (<ul>{data.map(user => (<li key={user.id}>{user.name}</li>))}</ul>);
}

Vue 3 组合式 API (类似 Hooks 的概念)

Vue 3 的组合式 API 提供了类似 React Hooks 的功能,但实现方式不同。

基本规则

  1. 使用 refreactive 创建响应式数据
  2. 使用 computed 创建计算属性
  3. 使用 watchwatchEffect 监听变化
  4. 将逻辑组织在 setup 函数或 <script setup>

示例:自定义计数器 Hook

<script setup>
import { ref } from 'vue';// 自定义计数器组合函数
function useCounter(initialValue = 0, step = 1) {const count = ref(initialValue);const increment = () => count.value += step;const decrement = () => count.value -= step;const reset = () => count.value = initialValue;return { count, increment, decrement, reset };
}// 使用自定义组合函数
const { count, increment, decrement, reset } = useCounter(0, 2);
</script><template><div><p>Count: {{ count }}</p><button @click="increment">+</button><button @click="decrement">-</button><button @click="reset">Reset</button></div>
</template>

示例:自定义数据获取 Hook

<script setup>
import { ref, onMounted } from 'vue';function useFetch(url) {const data = ref(null);const loading = ref(true);const error = ref(null);const fetchData = async () => {try {const response = await fetch(url);if (!response.ok) throw new Error('Network response was not ok');data.value = await response.json();} catch (err) {error.value = err;} finally {loading.value = false;}};onMounted(fetchData);return { data, loading, error };
}// 使用示例
const { data, loading, error } = useFetch('https://api.example.com/users');
</script><template><div v-if="loading">Loading...</div><div v-else-if="error">Error: {{ error.message }}</div><ul v-else><li v-for="user in data" :key="user.id">{{ user.name }}</li></ul>
</template>

关键区别

  1. 响应式系统:

    • React: 依赖状态更新触发重新渲染
    • Vue: 基于 Proxy 的自动响应式系统
  2. 依赖管理:

    • React Hooks 需要手动声明依赖数组
    • Vue 自动跟踪依赖关系
  3. 生命周期:

    • React: 使用 useEffect 模拟生命周期
    • Vue: 提供明确的生命周期钩子函数
  4. 语法:

    • React: 必须在函数组件顶层调用 Hooks
    • Vue: 可以在 <script setup> 中自由组织代码

两种框架的自定义 Hook/组合函数都旨在提高代码的可复用性和组织性,但实现方式和理念有所不同。

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

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

相关文章

构建高效事件驱动架构:AWS S3与SQS集成实践指南

引言 在现代云架构中,事件驱动的设计模式越来越受到开发者的青睐。AWS S3与SQS的集成为我们提供了一个强大的事件处理机制,能够在文件上传、删除或修改时自动触发后续的业务逻辑。本文将详细介绍如何配置S3事件通知到SQS队列,并分享实际项目中的最佳实践。 架构概述 S3事…

C++ -- STL-- List

////// 欢迎来到 aramae 的博客&#xff0c;愿 Bug 远离&#xff0c;好运常伴&#xff01; ////// 博主的Gitee地址&#xff1a;阿拉美 (aramae) - Gitee.com 时代不会辜负长期主义者&#xff0c;愿每一个努力的人都能达到理想的彼岸。1. list的介绍及使用 2. list的深度剖…

rt-thread 线程间同步方法详解

rt-thread 线程间同步方法详解一、什么是线程间同步线程同步的必要性线程同步的挑战二、同步方式1、信号量信号量工作机制信号量的管理方式信号量的创建与删除信号量的获取与释放信号量的典型应用场景信号量的注意事项2、互斥量互斥量工作机制互斥量的特性互斥量的操作接口互斥…

Spring Boot + Vue2 实现腾讯云 COS 文件上传:从零搭建分片上传系统

目录 一、项目目标 二、腾讯云 COS 基本配置 1. 创建存储桶 2. 获取 API 密钥 3. 设置跨域规则&#xff08;CORS&#xff09; 三、后端&#xff08;Spring Boot&#xff09;实现 1. 依赖配置 2. 配置腾讯云 COS&#xff08;application.yml&#xff09; 3. 初始化 COS…

使用 Java 获取 PDF 页面信息(页数、尺寸、旋转角度、方向、标签与边框)

目录 引言 一、安装和引入PDF处理库 二、获取 PDF 页数 三、获取页面尺寸&#xff08;宽高&#xff09; 四、获取页面旋转角度 五、判断页面方向&#xff08;横向 / 纵向&#xff09; 六、获取页面标签 七、获取页面边框信息 八、总结 引言 了解 PDF 页面属性是我们在…

基于 AI 的大前端安全态势感知与应急响应体系建设

大前端应用&#xff08;Web、APP、小程序&#xff09;作为用户交互的入口&#xff0c;面临日益复杂的安全威胁&#xff1a;从传统的 XSS 攻击、CSRF 伪造&#xff0c;到新型的供应链投毒、AI 驱动的自动化爬虫&#xff0c;再到针对业务逻辑的欺诈攻击&#xff08;如薅羊毛、账号…

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践

文章目录一、引言二、InnoDB引擎下的全文检索功能详解2.1 全文索引的基本概念与原理2.2 全文索引的创建与管理2.3 全文检索的三种查询模式2.4 中文全文检索的挑战与解决方案三、CMS 场景下的全文检索性能瓶颈分析3.1 索引构建与维护开销3.2 查询性能瓶颈3.3 锁机制与并发性能问…

应用软件格式渗透 利用word去渗透(MS10-087)

用到的靶机为&#xff1a;WinXP漏洞原理&#xff1a;一、漏洞触发机制与核心组件 漏洞根源&#xff1a;RTF文件解析逻辑缺陷 触发组件&#xff1a;Microsoft Word的RTF&#xff08;Rich Text Format&#xff09;解析引擎&#xff0c;具体涉及 mso.dll 模块中的 路径规范化函数&…

解密AWS VPC路由表:显式关联与隐式关联,谁决定了网络出口?

大家好&#xff0c;今天我们来聊一个在 AWS 云计算世界里既基础又关键的话题&#xff1a;VPC 路由表。 很多刚接触 AWS 的朋友&#xff0c;在配置网络时可能会遇到这样的困惑&#xff1a;为什么我的 EC2 实例无法访问互联网&#xff1f;为什么某些子网的网络策略和其他子网不一…

LeetCode题解---<203.移除链表元素>

文章目录题目代码及注释关键点题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,…

【JavaScript高级】构造函数、原型链与数据处理

目录构造函数和原型构造函数实例成员和静态成员构造函数的问题构造函数原型 prototype对象原型 \_\_proto\_\_constructor 构造函数构造函数、实例、原型对象三者之间的关系原型链JavaScript 的成员查找机制&#xff08;规则&#xff09;原型对象的this指向扩展内置对象继承cal…

项目进度与预算脱节,如何进行同步管理

项目进度与预算脱节会导致资源浪费、成本超支和项目延期。进行同步管理的方法包括&#xff1a;建立统一的项目进度预算管理体系、实施实时监控与反馈机制、采用项目管理工具辅助同步管理。尤其是实施实时监控与反馈机制&#xff0c;通过持续监测进度与预算的匹配情况&#xff0…

TCP半关闭

理解TCP半关闭&#xff1a;像水管一样的网络连接控制 从全关闭到半关闭&#xff1a;为什么需要这种机制&#xff1f; 想象你和朋友正在通电话讨论一个重要项目&#xff1a; 全关闭&#xff1a;就像突然挂断电话&#xff0c;双方都无法再说话半关闭&#xff1a;你说"我说完…

衡石科技技术手册--仪表盘过滤控件详解

过滤控件说明 过滤控件 的定义 过滤控件用于在仪表盘中过滤图表数据&#xff0c;分为仪表盘内过滤控件和全局过滤控件。 过滤控件结构说明 字段类型描述uidSTRING过滤控件唯一识别 idappIdLONG过滤控件所属的应用 iddataAppIdLONG字段来源是数据包时的数据包 iddashboar…

ASP.NET Core中数据绑定原理实现详解

在ASP.NET Core 中&#xff0c;数据绑定是将 HTTP 请求中的数据&#xff08;如表单、查询字符串、请求体等&#xff09;映射到控制器动作方法参数或模型对象的过程。以下将从原理、核心组件、执行流程及关键机制等方面详细解析其实现逻辑。 一、数据绑定的核心原理与组件 1. 数…

牛客:HJ24 合唱队[华为机考][最长递增子集][动态规划]

学习要点 求最长递增字列求最长递减子列 题目链接 合唱队_牛客题霸_牛客网 题目描述 解法&#xff1a;动归求最长递增子列 #include <iostream> #include <vector> using namespace std;int main() {int n;while (cin >> n) {// 输入的数组int tmp;vect…

C语言的相关基础概念和常用基本数据类型

1.相关概念变量与常量的定义常量&#xff1a;在程序运行中其值不能改变的量。变量&#xff1a;在程序运行中其值可以改变的量。存储器的区分 RAMROM中文名易失存储器不易失存储器特点掉电丢失数据&#xff0c;但存取快掉电不丢失数据&#xff0c;但存取幔标识符标识符只能…

Spring boot整合dubbo+zookeeper

Spring boot整合dubbozookeeper 下文将简述springboot整合dubbozookeeper实现apiproviderconsumer模式&#xff0c;Api用于定于interface,provider和consumer依赖Api,provider实现api接口&#xff0c;consumer调用provider。 spring boot版本&#xff1a;3.5.3 jdk版本&#xf…

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32‘ not found

简介&#xff1a;在复现 VLM-R1 项目并尝试将其中的 GRPO 算法应用到自己的任务时&#xff0c;按照官方文档配置好环境后&#xff0c;运行过程中遇到了一个非常离谱的错误&#xff1a; ImportError: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found 这个问题极…

基于Spring Boot的生活用品电商网站的设计与实现

第1章 摘要随着电商行业的飞速发展&#xff0c;生活用品电商网站作为线上购物的一部分&#xff0c;逐渐成为消费者日常购物的重要渠道。为提升网站的管理效率和用户体验&#xff0c;设计并实现了一款基于Spring Boot的生活用品电商网站。该系统通过合理的架构设计&#xff0c;提…