# 14 React 自定义Hook详解

自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他 Hook。自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他 Hook。下面是几个自定义 Hook 的例子以及需要注意的知识:

1. 使用状态管理数据

import { useState } from 'react';function useCounter(initialValue, step) {const [count, setCount] = useState(initialValue);const increment = () => setCount(count + step);const decrement = () => setCount(count - step);return { count, increment, decrement };
}// 在组件中使用
function Counter() {const { count, increment, decrement } = useCounter(0, 1);return (<div><p>Count: {count}</p><button onClick={increment}>Increment</button><button onClick={decrement}>Decrement</button></div>);
}

注意:

  • 自定义 Hook 可以帮助复用状态逻辑。
  • 在使用状态时,确保传递正确的默认值和参数。

2. 使用生命周期

import { useState, useEffect } from 'react';function useDocumentTitle(title) {useEffect(() => {document.title = title;return () => {document.title = 'React App'; // 在卸载时重置标题};}, [title]);
}// 在组件中使用
function TitleUpdater() {useDocumentTitle('New Title');return <div>Updating Document Title</div>;
}

注意:

  • useEffect 用于处理副作用,如修改文档标题。
  • 注意 useEffect 的第二个参数,这决定了何时应该重新执行副作用。

3. 订阅和取消订阅事件

import { useEffect } from 'react';function useEventListener(eventName, handler) {useEffect(() => {const eventListener = (event) => handler(event);window.addEventListener(eventName, eventListener);return () => {window.removeEventListener(eventName, eventListener);};}, [eventName, handler]);
}// 在组件中使用
function EventListenerComponent() {const handleScroll = (event) => {console.log('Scrolled:', event);};useEventListener('scroll', handleScroll);return <div>Listening to Scroll Events</div>;
}

注意:

  • useEffect 在这里用于添加和移除事件监听器。
  • 注意清除函数,以免内存泄漏。

4. 处理本地存储

import { useState } from 'react';function useLocalStorage(key, initialValue) {const [value, setValue] = useState(() => {const storedValue = localStorage.getItem(key);return storedValue ? JSON.parse(storedValue) : initialValue;});const updateValue = (newValue) => {setValue(newValue);localStorage.setItem(key, JSON.stringify(newValue));};return [value, updateValue];
}// 在组件中使用
function LocalStorageComponent() {const [name, setName] = useLocalStorage('name', '');const handleChange = (event) => {setName(event.target.value);};return (<div><input type="text" value={name} onChange={handleChange} /><p>Hello, {name}!</p></div>);
}

注意:

  • 使用 useState 和 useEffect 来管理本地存储。
  • 注意对存储数据进行序列化和反序列化。

注意事项:

  • 自定义 Hook 本质上是函数,但需要符合特定的命名规范以及 Hook 规则。
  • 在自定义 Hook 内部,可以使用其他 Hook,但不要在普通 JavaScript 函数中调用 Hook。

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

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

相关文章

用指针处理链表(一)

1链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。我们知道,用数组存放数据时,必须事先定义固定的长度(即元素个数)。比如,有的班级有100人&#xff0c;而有的班只有30人&#xff0c;如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度…

为wordpress特定分类目录下的内容添加自定义字段

在WordPress中&#xff0c;您可以使用自定义字段(Custom Fields)或称为元数据(Meta Data)来为特定分类目录下的内容添加额外的信息。自定义字段可以附加到文章、页面、用户和其他对象上。以下是一个逐步指南&#xff0c;介绍如何为特定分类目录下的内容添加自定义字段&#xff…

男青年穿什么裤子好看?适合男生穿的百搭神裤

这几年衣服的款式可谓是越来越多了&#xff0c;很多男生在选裤子的时候都发现虽然款式越来越多&#xff0c;但现在市面上的裤子质量参差不齐&#xff0c;导致难以选择。而且还有很多商家为了利润采用低廉的材料&#xff0c;从而上身舒适性极差。 那么今天就给大家详细介绍几点…

web3 token 如何理解

"Web3 Token"是指建立在Web3技术堆栈上的数字令牌。为了更好地理解这个概念&#xff0c;让我们逐步解释&#xff1a; Web3&#xff1a;指的是下一代互联网&#xff08;Web3.0&#xff09;&#xff0c;它是基于区块链技术的去中心化网络。Web3的核心理念是去中心化、安…

cpu自动加速@TDP@睿频TurboBoost@PB精准频率提升技术

文章目录 自动加速技术Intel超频睿频工作原理:特点超频技术对比 AMDPBO PB2 TDP定义与意义TDP与实际功耗TDP的应用TDP的发展与挑战 Intel相关指标PL1 (Power Limit 1)PL2 (Power Limit 2)PL1 与 PL2 的关系与应用场景小结查看 AMD相关指标主板厂商与用户干预 高端型号的加速技术…

3D软件坐标系速查

本文介绍不同3D软件的世界坐标系之间的差异及其工作原理。 基本上&#xff0c;游戏引擎和3D软件包最重要的问题是根据软件的坐标轴系统创建资产&#xff0c;正确缩放它们并根据要完成的工作设置枢轴系统。 坐标系正确性的定义可能会根据模型导入的游戏引擎或 3D 软件而变化。…

开放式耳机性价比高的品牌有哪些呢?五大高性价比选购清单

不入耳开放式蓝牙耳机近两年开始火起来了&#xff0c;因为它佩戴的舒适性和安全性两方面受到了很多人的关注。开放式的设计&#xff0c;就算不放进耳朵里也能听歌&#xff0c;同时加上它独特的空气传导的传声途径&#xff0c;整体的音质还是很不错的。不压耳&#xff0c;不涨耳…

申请发明专利的基本条件是什么?发明专利需要什么资料?

发明专利申请的基本条件是什么&#xff1f;发明专利需要的资料有啥?发明专利大家真的了&#xff0c;那么今天的这2个问题我们就一起来看看吧。 发明专利申请的基本条件是什么&#xff1f; 在进行技术开发、新产品研制过程中取得的成果&#xff0c;因其技术水平较高&#xff0…

2016年认证杯SPSSPRO杯数学建模D题(第二阶段)NBA是否有必要设立四分线全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 D题 NBA是否有必要设立四分线 原题再现&#xff1a; NBA 联盟从 1946 年成立到今天&#xff0c;一路上经历过无数次规则上的变迁。有顺应民意、皆大欢喜的&#xff0c;比如 1973 年在技术统计中增加了抢断和盖帽数据&#xff1b;有应运而生、力…

Filter PWM和普通PWM区别

Filter PWM和普通PWM是两种不同的脉冲宽度调制&#xff08;PWM&#xff09;技术。它们的区别主要在于滤波器的使用和输出信号的特性。 普通PWM是一种基本的PWM技术&#xff0c;它通过改变信号的脉冲宽度来控制输出电平的平均值。普通PWM信号的频率通常较高&#xff0c;可以达到…

通过MobaXterm工具远程连接可视化服务器桌面并操控

目录 一、MobaXterm工具二、MobaXterm工具可视化服务器目录三、MobaXterm工具可视化服务器桌面 一、MobaXterm工具 MobaXterm是一款功能强大的远程连接工具&#xff0c;可以用于连接到各种类型的服务器&#xff0c;包括Linux、Windows和MacOS。它支持多种协议&#xff0c;包括…

【C语言】linux内核pci_enable_device函数和_PCI_NOP宏

pci_enable_device 一、注释 static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) {struct pci_dev *bridge;int err;int i, bars 0;/** 此时电源状态可能是未知的&#xff0c;可能是由于新启动或者设备移除调用。* 因此获取当前的电源状态&…

【Java】哈希表

文章目录 一、概念二、哈希冲突2.1概念2.2设计合理的哈希函数-避免冲突2.3调节负载因子-避免冲突2.4闭散列-冲突解决&#xff08;了解&#xff09;2.5开散列/哈希桶-冲突解决&#xff08;重点掌握&#xff09; 三、代码实现3.1成员变量及方法的设定3.2插入3.3重新哈希3.4 获取到…

YT8531调试记录

总结 还是从设备树&#xff0c;mac驱动&#xff0c;mac驱动对mdio总线的注册&#xff0c;phy驱动 &#xff0c;phy的datasheet&#xff0c;cpu的datasheet 几个方面来看来看 0.确认供电&#xff0c;以及phy的地址(一般会有多个地址&#xff0c;根据相关引脚电平可配置) 1.确…

第二十九天-Flask框架web开发

目录 1.介绍 2.安装 虚拟环境安装 3.使用 1.第一个Flask程序 2.MTV模式 3.启动选项以及调试 启动 调试模式 Pycharm启动配置 4.Flask的扩展 5.url配置和路由 6.响应上下文对象 ​编辑7.请求保报文常用参数 8.响应报文 9.重定向等内部视图 1.介绍 网址&#xff1…

BEVFormer v2论文阅读

摘要 本文工作 提出了一种具有透视监督&#xff08;perspective supervision&#xff09;的新型鸟瞰(BEV)检测器&#xff0c;该检测器收敛速度更快&#xff0c;更适合现代图像骨干。现有的最先进的BEV检测器通常与VovNet等特定深度预训练的主干相连&#xff0c;阻碍了蓬勃发展…

Diffuison在域自适应中 笔记

1 Title Diffusion-based Target Sampler for Unsupervised Domain Adaptation&#xff08;Zhang, Yulong, Chen, Shuhao, Zhang, Yu, Lu, Jiang&#xff09;【CVPR 2023】 2 Conclusion large domain shifts and the sample scarcity in the target domain make exis…

LeetCode:2642. 设计可以求最短路径的图类(SPFA Java)

目录 2642. 设计可以求最短路径的图类 题目描述&#xff1a; 实现代码与解析&#xff1a; SPFA 原理思路&#xff1a; 2642. 设计可以求最短路径的图类 题目描述&#xff1a; 给你一个有 n 个节点的 有向带权 图&#xff0c;节点编号为 0 到 n - 1 。图中的初始边用数组 e…

【开发篇】六、查询大量数据导致内存溢出

文章目录 1、溢出场景2、快照文件分析3、本地环境复现4、结论5、解决思路 记录一个问题&#xff0c;工作中有个数据处理服务OOM&#xff0c;查了下镜像的dockerfile&#xff0c;发现JVM参数如下。很明显&#xff0c;一个数据服务&#xff0c;里面经手大量的数据对象&#xff0c…

浏览器地址栏输入地址发生什么(浏览器输入不同的地址类型会导致不同的以为和结果)

浏览器输入不同的地址类型会导致不同的以为和结果。 大多数情况下 当在浏览器的地址栏输入一个地址时&#xff0c;通常情况下浏览器会发起一个HTTP请求来获取该地址对应的网页内容。 当在浏览器的地址栏输入一个地址时&#xff0c;浏览器会进行DNS域名解析&#xff0c;得到IP…