React Hooks 最佳实践与常见陷阱
Hooks 让函数组件具备状态和副作用能力,但使用不当容易引发 bug。本文总结常见实践与避坑指南。
一、useState 使用要点
1. 函数式更新
依赖前一次状态时,使用函数形式:
setCount((prev) => prev + 1);
2. 复杂状态考虑 useReducer
状态逻辑复杂、多子状态联动时,useReducer 更清晰。
二、useEffect 依赖与清理
1. 依赖数组要完整
useEffect(() => {
fetchData(userId);
}, [userId]); // 用到的变量都要列入
缺少依赖可能导致闭包拿到旧值。
2. 清理副作用
useEffect(() => {
const timer = setInterval(() => {}, 1000);
return () => clearInterval(timer);
}, []);
订阅、定时器、事件监听等务必在 return 中清理。
三、useCallback 与 useMemo
何时使用
- useCallback:将函数引用传给依赖引用相等的子组件或 useEffect 时
- useMemo:昂贵计算需要缓存时
避免过度优化
简单计算、普通函数不必包一层,否则反而增加心智负担。
四、自定义 Hooks 封装
将可复用逻辑抽成自定义 Hook:
function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const timer = setTimeout(() => setDebouncedValue(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);
return debouncedValue;
}
五、常见陷阱
- 条件调用 Hooks:Hooks 必须在组件顶层调用,不可放在条件、循环中
- 闭包陈旧:useEffect 内使用 state 时,依赖数组要包含该 state
- 对象依赖:依赖对象时注意引用变化,必要时用
useMemo稳定引用
掌握这些要点,能写出更稳定、可维护的 React 代码。