前端开发
React 函数组件需要状态…
在 React 函数组件中,用内置 Hook 和以 use 开头的自定义 Hook 管理状态、副作用并复用有状态逻辑。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
React 函数组件需要状态、副作用或跨特定
解决思路
- 在函数组件中用 `useState` 管理局部状态:通过 `const [value, setValue] = React.useState(initialValue)` 获取当前值和更新方法,并用 setter 更新状态(如 `onChange={(e) => setInput(e.target.value)}`)。
- 在函数组件中用 `useEffect` 处理副作用;把依赖项放进第二个参数的 dependency array 来控制触发时机(如 `[input]`)。
- 对需要清理的副作用,在 `useEffect` 中返回清理函数并移除监听器/订阅(如 `window.removeEventListener("keydown", handleDown)`)。
- 将可复用的有状态逻辑封装成自定义 Hook,函数名必须以 `use` 开头(如 `useKeyPress`),并在其中组合 `useState`、`useEffect` 等 Hook。
- 遵循 Rules of Hooks:只在顶层调用 Hook,且只在 React 函数组件或自定义 Hook 中调用。
- 避免不必要的 `useEffect`:能从 props/state 直接算出的派生状态,直接在组件主体中计算。
- 在可能的情况下,让 React Compiler 处理 memoization,而不是手动使用 `useMemo`/`useCallback`。
- 用 Hooks 把类组件重构为函数组件:例如把 `Input` 类组件改成使用 `useState` 的函数组件。
- 把组件里混合的逻辑拆成更小的自定义 Hook,例如 `useCounter`、`useWindowWidth`,让组件只负责组合它们。
- 对复杂状态逻辑、多子值或下一状态依赖前一状态的情况,用 `useReducer`:传入 `reducer` 和初始状态,从返回值解构当前状态与 `dispatch`。
- 用 `useContext` 读取 context:传入 `React.createContext` 返回的 context 对象本身,并注意 context 值变化时调用组件会重新渲染。
- 复用社区 Hook 库中的现成 Hook(如 React Use、useHooks、Collection of React Hooks),不要重复实现通用逻辑。
适用边界 · 注意事项
- React 版本低于 16.8 或运行环境不支持 Hooks 时不适用。
- 组件只是纯展示,不需要状态、生命周期、副作用,也没有可复用的有状态逻辑时,不必强行使用 Hooks。
- 没有配置 Rules of Hooks 的 linter plugin 且团队不熟悉 Hooks 时,不宜直接大规模重构;否则容易误用 useEffect/useMemo/useCallback。