用途:这是一条 React 编码规范,严格禁止在组件中直接调用 useEffect,并为常见场景给出替代写法,目标是减少依赖数组带来的隐性耦合、无限循环与竞态问题。
主要能力与替代规则:
-
派生状态而非同步:需要从 state/props 计算值时直接内联计算,如 const filtered = products.filter((p) => p.inStock),不要用 useEffect + setState;也不要用多个 effect 串成税收、总价这类计算链。
-
数据请求用库:涉及 fetch + setState 或用例需要缓存、取消、重试时,改用 TanStack Query、SWR、Apollo、RTK Query、tRPC、Relay 或框架 loader(Next.js/Remix/Expo Router)。
-
用户操作用事件处理器:不要用 state 当标志位再由 effect 执行动作,直接在 onClick 等处理器中调用,如 <button onClick={() => postLike()}>Like</button>。
-
唯一允许的 effect 包装器是 useMountEffect,仅用于一次性的外部系统同步(DOM 焦点/滚动、第三方组件初始化、浏览器 API 订阅)。其实现为:
export function useMountEffect(effect: () => void | (() => void)) { // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(effect, []); }
不应在 effect 内部加条件守卫,而应由父组件负责编排;条件满足时才挂载子组件,子组件内直接 useMountEffect。
- 用 key 重置而非依赖编排:当 ID/实体变化需要重新开始时,用 <VideoPlayer key={videoId} videoId={videoId} /> 借助 React 的重挂载语义,避免 useEffect(() => loadVideo(videoId), [videoId])。
使用方式:按决策树选择——计算值用规则 1,请求数据用规则 2,响应用户操作 Use 规则 3,一次性挂载设置用 useMountEffect,ID 变化重置用 key。以上都不适用时应重新审视,几乎不需要 useEffect。
适用场景与限制:适用于 React 项目代码审查与规范约束;useMountEffect 仅限一次性外部同步,不等同于通用 effect 方案。该资料未提供安装方式、版本要求或工具链配置,相关事实暂未提供。