阅读时间约 5 分钟。
这段时间我们分享了一些 React 内置的钩子函数,如:useRef、useMemo、useReducer、useImperativeHandle 等。这些内置的钩子函数为我们的开发工作提供了极大的便利。除了 React 提供的内置 Hook 外,我们如何编写自己的钩子函数呢?
自定义 Hook 可以让我们在多个组件之间共享逻辑,提高代码的复用性和可维护性。要自定义一个钩子函数,我们应遵循以下规则:
- 自定义 Hook 必须以
use开头。 - 自定义 Hook 必须是一个函数,函数内部可以使用 React 的 Hook。
- 自定义 Hook 必须返回数据或方法。
以上三条规则是我们必须要遵守的,在 React 官方文档中也都有提及。下面我们就通过一个简单的计数器示例来演示如何自定义一个通用的钩子函数。
1. 定义“计数器”钩子函数
要将计数器的通用逻辑提取到一个自定义 Hook 中,这个钩子函数应具有以下能力:
- 可以获取当前计数器的值;
- 能通过钩子函数给计数器增加值;
- 能通过钩子函数给计数器减少值。
根据这三条需求,我们可以实现下面的自定义 Hook:
import { useState } from 'react';
// 定义自定义 Hook 的返回值类型
type UseCounterReturnType = [count: number, increment: () => void, decrement: () => void];
// 定义自定义 Hook
export default function useCounter(initialCount: number = 0): UseCounterReturnType {
// 使用 useState 来初始化 count 状态和 setCount 函数
const [count, setCount] = useState(initialCount);
// 定义 increment 函数,用于增加计数器的值
const increment = () => {
setCount(count + 1);
};
// 定义 decrement 函数,用于减少计数器的值
const decrement = () => {
setCount(count - 1);
};
// 返回 count、increment 和 decrement 函数作为自定义 Hook 的返回值
return [count, increment, decrement];
}我们通常会把自定义的 Hook 方法放到一个单独的文件中维护。上面的示例代码是由 TS 实现一个 useCounter 函数。还记得上面我们提到的三条规则吗?自定义 Hook 的函数名必须是 use 开头的。这个自定义函数中,我们定义了一个状态 count 用来记录计数器的值,同时定义了两个函数用来增加计数器的值和减少计数器的值。在函数最后,将他们放在一个数组中返回出去。
2. 使用“计数器”钩子函数
要使用上面的 useCounter 也非常简单,只需要像使用其他 Hook 一样调用即可。
import useCounter from './useCounter';
function MyComponent1(): JSX.Element {
const [count, increment, decrement] = useCounter(10);
return (
<div>
<h1>Count: {count}</h1>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
}上面的代码中,我们在调用 useCounter 时给计数器设置了一个默认值 10。当点击页面上的“Increment”按钮时,计数器加1;点击页面上的“Decrement”按钮时,计数器减 1。当前计数器的值渲染在 h1 标签中。
3. 应用场景
自定义 Hook 的应用场景非常广泛,下面总结了一些常见的应用场景:
- 处理数据逻辑
在和后端接口交互时,我们可以借助自定义 Hook 将数据的获取、处理、缓存等抽象出来。比如,可以创建一个useFetchHook,用于从 API 接口中获取数据并缓存结果,以提高页面性能。 - 处理表单逻辑
表单的验证、格式化等逻辑也可以抽象出来,比如可以创建一个 useForm 钩子函数来处理表单的数据和逻辑校验。 - 处理视图逻辑
UI 上的一些操作,比如动画效果、手势操作、滚动处理的也可以抽象出来,比如创建一个useSwipe的钩子函数用于处理这些逻辑。 - 处理副作用
我们常见的定时器、订阅事件等副作用也都可以用自定义的钩子函数来处理,比如可以创建一个useInterval用于处理定时器逻辑。
4. 总结
在创建和使用自定义 Hook 时,我们应该根据具体的业务或开发场景来选择合适的 Hook,灵活掌握自定义 Hook 的创建和使用能极大提高我们的开发效率,对提高代码可复用性和可维护性同样有很大的帮助。

14 comments
《华纳圣淘沙公司开户流程全解析》→ 官方顾问一对一指导??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户步骤详解》→ 」专属通道快速办理??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙账户注册指南》→ 扫码获取完整资料清单?「微?? 安全联系:183第三段8890第四段9465
《新手开通华纳圣淘沙公司账户指南》→ 限时免费咨询开放??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙企业开户标准流程》→ 资深顾问实时解答疑问??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户步骤全景图》→ 点击获取极速开户方案??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙账户创建全流程手册》→ 预约顾问免排队服务?9?? 安全联系:183第三段8890第四段9465 《从零开通华纳圣淘沙公司账户》→ 添加客服领取开户工具包?? 安全联系:183第三段8890第四段9465
《官方授权:华纳圣淘沙开户流程》→ 认证顾问全程代办?」?? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户说明书》→立即联系获取电子版文件??? 安全联系:183第三段8890第四段9465
寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】
华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】
联系客服了解华纳圣淘沙开户
(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户专属顾问
(183-8890-9465薇-STS5099】
东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】
华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新车上路,只带前10个人
新车新盘 嘎嘎稳 嘎嘎靠谱
真好呢
哈哈哈
测试
赞👍
sdf sdfsdfsdf
asdfasdf