关于 react-hooks
面向 React 开发者的 Hooks 技能,涵盖内置 Hook 和可复用自定义 Hook,并指导 Hook 选择、依赖项处理、清理逻辑与使用规则。
主要功能
- 01内置 React Hooks 指导
- 02可复用自定义 Hook 模式
- 03使用 useReducer 管理复杂状态
- 04依赖项与清理检查
- 05Hook 规则与记忆化指导
适用场景
- 01管理组件状态和副作用
- 02提取可复用的有状态逻辑
- 03处理复杂状态转换
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ partme-ai/ full-stack-skills --skill react-hooks安装后在 Claude Code 中输入/react-hooks确认已加载。
附带文件LICENSE.txt
详细介绍
适用场景
在用户希望执行以下操作时使用此技能:
- 使用 React 内置 Hook(useState、useEffect、useContext、useRef、useMemo、useCallback)
- 创建用于复用有状态逻辑的自定义 Hook
- 使用 useReducer 管理复杂状态
- 使用记忆化 Hook 优化组件性能
- 使用 useEffect 处理副作用(数据获取、订阅、计时器)
- 理解并遵循 Hook 规则
使用方法
工作流
- 确定最适合用户需求的 Hook
- 遵循 Hook 规则:只能在顶层调用 Hook;只能在 React 函数中调用 Hook
- 生成 Hook 代码,并正确设置依赖数组和清理函数
- 验证不存在过时闭包或缺失的依赖项
1. useState 和 useEffect
import { useState, useEffect } from 'react';
function useUserData(userId: string) {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<Error | null>(null);
useEffect(() => {
let cancelled = false;
setLoading(true);
fetch(`/api/users/${userId}`)
.then(res => res.json())
.then(data => {
if (!cancelled) {
setUser(data);
setLoading(false);
}
})
.catch(err => {
if (!cancelled) {
setError(err);
setLoading(false);
}
});
return () => { cancelled = true; }; // Cleanup on unmount or userId change
}, [userId]);
return { user, loading, error };
}
2. 使用 useReducer 管理复杂状态
import { useReducer } from 'react';
type State = { count: number; step: number };
type Action = { type: 'increment' } | { type: 'decrement' } | { type: 'setStep'; payload: number };
function reducer(state: State, action: Action): State {
switch (action.type) {
case 'increment': return { ...state, count: state.count + state.step };
case 'decrement': return { ...state, count: state.count - state.step };
case 'setStep': return { ...state, step: action.payload };
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, { count: 0, step: 1 });
return (
<div>
<p>Count: {state.count}</p>
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
</div>
);
}
3. useMemo 和 useCallback
import { useMemo, useCallback } from 'react';
function FilteredList({ items, filter }: { items: Item[]; filter: string }) {
// Memoize expensive computation
const filtered = useMemo(
() => items.filter(item => item.name.includes(filter)),
[items, filter]
);
// Memoize callback to prevent child re-renders
const handleSelect = useCallback((id: string) => {
console.log('Selected:', id);
}, []);
return <ItemList items={filtered} onSelect={handleSelect} />;
}
4. 自定义 Hook 模式
import { useState, useCallback } from 'react';
function useToggle(initialValue = false): [boolean, () => void] {
const [value, setValue] = useState(initialValue);
const toggle = useCallback(() => setValue(prev => !prev), []);
return [value, toggle];
}
// Usage
function Modal() {
const [isOpen, toggleOpen] = useToggle(false);
return <>{isOpen && <div>Modal Content</div>}<button onClick={toggleOpen}>Toggle</button></>;
}
最佳实践
- 始终在 useEffect 依赖数组中包含所有依赖项(使用 ESLint 插件
react-hooks/exhaustive-deps) - 在 useEffect 的返回函数中清理订阅、计时器和监听器
- 自定义 Hook 的名称以
use为前缀(例如:useAuth、useFetch) - 切勿在条件语句、循环或嵌套函数中调用 Hook
- 仅在可测量的性能收益明显时使用
useCallback和useMemo - 状态转换复杂时,优先使用
useReducer,而不是多次调用useState
资源
关键词
React Hooks、useState、useEffect、useContext、useReducer、useMemo、useCallback、useRef、自定义 Hook、Hook 规则、依赖数组、清理、记忆化
评论
支持 Markdown