关于 react-useeffect-avoid
这项 React 开发技能说明何时应避免使用 `useEffect`,以及可替代的模式。它区分与外部系统同步和常规应用逻辑。
主要功能
- 01`useEffect` 决策树
- 02派生状态与事件的替代方案
- 03外部系统副作用指南
- 04React 19 资源读取示例
适用场景
- 01检查用于派生状态的 effect
- 02为用户操作选择事件处理器
- 03判断集成是否需要 effect
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ flpbalada/ my-opencode-config --skill react-useeffect-avoid安装后在 Claude Code 中输入/react-useeffect-avoid确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
context/anti-patterns.mddecision-tree.mdpatterns-to-avoid.md详细介绍
React:何时不应使用 useEffect
核心原则
useEffect 是用于与外部系统同步的逃生通道,而不是通用的状态管理或事件处理工具。
现代 React 模式优先采用单向数据流和事件驱动更新,而非基于 effect 的同步,以避免性能损耗和复杂的同步错误。
决策树
Need to sync with external system?
├─ Yes (browser APIs, websockets, timers)
│ └─ Use useEffect
│
└─ No (pure React application logic)
├─ Derived state calculation?
│ ├─ Yes → Calculate during render
│ └─ No → Continue...
│
├─ User action triggered?
│ ├─ Yes → Use event handler
│ └─ No → Continue...
│
├─ State reset needed?
│ ├─ Yes → Use key prop
│ └─ No → Continue...
│
└─ Really need effect after re-think?
└─ Yes → Use useState/useReducer/setState pattern
快速参考
❌ 不要将 useEffect 用于:
| 场景 | 问题 | 替代方案 |
|---|---|---|
| 派生状态 | 双重渲染 | 在渲染期间计算 |
| 重置状态 | 数据过时 | 使用 key 属性 |
| 用户操作 | 意图丢失 | 事件处理程序 |
| 列表筛选 | 额外渲染 | 在渲染期间筛选 |
| 浏览器 API | tearing 错误(并发场景) | useSyncExternalStore |
| 提交表单 | 脆弱的标志位模式 | 直接使用异步处理程序 |
| 获取数据 | 需要手动管理缓存 | React Query、SWR、Suspense |
✅ 应将 useEffect 用于:
- 订阅外部系统(WebSocket、浏览器 API 等)
- 设置需要清理的计时器
- 管理第三方库集成
- 更改文档标题
- 渲染完成时进行分析/遥测
React 19:新替代方案
// React 19+ - Direct resource reading
function UserProfile({ userId }) {
const user = use(fetchUser(userId)); // Reads promise directly
return <div>{user.name}</div>;
}
渐进式展开
| 主题 | 文件 | 适用场景 |
|---|---|---|
| 带示例的反模式 | context/anti-patterns.md | useEffect 错误用法的详细代码示例 |
| 应始终避免的模式 | context/patterns-to-avoid.md | 日志记录、DOM 操作等常见反模式 |
| 决策树与参考资料 | context/decision-tree.md | 快速查阅和延伸阅读 |
参考资料
评论
支持 Markdown