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

# 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.lryc.cn/news/326787.html

相关文章:

  • HTML静态网页成品作业(HTML+CSS+JS)——中华美食八大菜系介绍(1个页面)
  • PostgreSQL11 | Windows系统安装PostgreSQL
  • uniapp保留两位小数,整数后面加.00
  • R: 网状Meta分析进行模型构建及图形绘制
  • 数据结构——排序算法
  • MyBatis的高级特性探索
  • 未来制造:机器人行业新质生产力提升策略
  • 开发过程中PostgreSQL常用的SQL语句,持续更新ing
  • Linux screen命令教程:如何在一个终端窗口中管理多个会话(附实例详解和注意事项)
  • Android中的本地广播与全局广播
  • Debezium日常分享系列之:Debezium2.5稳定版本之MySQL连接器配置示例和Connector参数详解
  • vue3父组件给子组件传值,并在子组件接受
  • Python爬虫如何快速入门
  • 酷开科技依托酷开系统用“平台+产品+场景”塑造全屋智能生活!
  • P8649 [蓝桥杯 2017 省 B] k 倍区间:做题笔记
  • LeetCode题练习与总结:旋转图像
  • 如何在家中使用手机平板电脑 公司iStoreOS软路由实现远程桌面
  • 【文献分享】myMUSCLE, a New Multiphysics, Multiscale Simulation Coupling Environment
  • 2024年云计算使用报告,89%组织用多云,25%广泛使用生成式AI,45%需要跨云数据集成,节省成本是云首要因素
  • 【Python操作基础】——序列
  • Vue 与 React:前端框架对比分析
  • 解决kubesphere流水线docker登陆错误http: server gave HTTP response to HTTPS client
  • macOS安装mongoDB(homebrew)
  • 免费SSL证书和付费SSL证书的区别点
  • 【SQL】1633. 各赛事的用户注册率(COUNT函数 表达式用法)
  • 【LVGL-使用SquareLine Studio设计器 】
  • 将二进制数a的每一位右移b位operator.rshift(a,b)
  • M芯片 mac配置Vulkan环境报错 Xcode
  • Day23:事务管理、显示评论、添加评论
  • 第一篇:概述、 目录、适用范围及术语 --- IAB/MRC《增强现实(AR)广告(效果)测量指南1.0 》