← ClaudeAtlas

react-use-effectlisted

Rules for useEffect usage in React including when to avoid it and when to extract it into custom hooks. Use when writing or reviewing React components that contain or might need useEffect.
ncaq/konoka · ★ 3 · Web & Frontend · score 72
Install: claude install-skill ncaq/konoka
# useEffectの使いどころを見極める `useEffect`は外部システム(ブラウザAPI、ネットワーク、サードパーティライブラリ)との同期にのみ使います。 それ以外の用途では、より適切な代替手段がないか検討してください。 参考: [You Might Not Need an Effect](https://react.dev/learn/you-might-not-need-an-effect) ## useEffectを使わずに解決するパターン ### レンダリング用のデータ変換は直接計算します ```tsx // Bad: useEffectでstateを更新 const [fullName, setFullName] = useState(""); useEffect(() => { setFullName(firstName + " " + lastName); }, [firstName, lastName]); // Good: レンダリング中に計算 const fullName = firstName + " " + lastName; ``` ### ユーザー操作の処理はイベントハンドラで行います ```tsx // Bad: useEffectで副作用を検知 useEffect(() => { if (product.isInCart) { showNotification(`Added ${product.name} to cart!`); } }, [product]); // Good: イベントハンドラで直接処理 function handleBuyClick() { addToCart(product); showNotification(`Added ${product.name} to cart!`); } ``` ### propsが変わったときの状態リセットにはkeyを使います ```tsx // Bad: useEffectでリセット useEffect(() => { setComment(""); }, [userId]); // Good: keyでコンポーネントを再マウント <Profile userId={userId} key={userId} />; ``` ### 高コストな計算のキャッシュにはuseMemoを使います ```tsx // Bad: useEffectで計算結果をstateに保存 useEffect(() => { setFilteredTodos(getFilteredTodos(todos, filter)); }, [todos, filter]); // Good: useMemoでキャッシュ const filteredTodos = useMemo(() => getFilteredTodos(todos, filter), [todos, filter]); ``` ### データ取得にはデータフェッチライブラリを使います ```tsx // Bad: useEffectで手動フェッチ(冗長なボイラープレート、キャッシュなし、重複排除なし) useEffect(() => { let ignore = false; fetchData(id).then((data) => { if (!ignore) setData(data); }); return () =