0Pricing
React Academy · レッスン

Selectorsと不要な再レンダーの防止

selectorsで必要なstateの一部だけを取り出し、必要な場合にのみコンポーネントを再レンダーします。

「Selectorsと不要な再レンダーの防止」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

ようこそ

このレッスンでは、Zustandのセレクターを使用して、コンポーネントが必要とする状態のスライスだけを購読し、ストアの他の部分が変化したときの不要な再レンダリングを防ぎます。

デフォルトセレクターの問題

セレクターを指定せずにストアフックを呼び出すと、ストアオブジェクト全体が返されます。関係のない状態の変更であっても、ストアが変化するたびにコンポーネントが再レンダリングされます。
// Bad: re-renders on every store change
const store = useAppStore();
return <p>{store.user.name}</p>;

セレクターの使用

ストアフックにセレクター関数を渡します。セレクターの戻り値が変化した場合にのみ、コンポーネントが再レンダリングされます。
// Good: re-renders only when user.name changes
const name = useAppStore(s => s.user.name);
return <p>{name}</p>;

参照の同値性チェック

Zustandはデフォルトで厳密等価(===)を使用します。セレクターが呼び出されるたびに新しいオブジェクトや配列を返すと、内容が同じでもコンポーネントが再レンダリングされます。
// Creates a new object every time — always re-renders!
const info = useStore(s => ({ id: s.id, name: s.name }));

シャロー等価性での修正

`shallow`をzustandからインポートし、等価性関数として渡すと、オブジェクトの内容が同じ場合の再レンダリングを防げます。
import { shallow } from 'zustand/shallow';

const info = useAppStore(
  s => ({ id: s.id, name: s.name }),
  shallow // compare by content, not reference
);

複数の値の選択

shallow等価性のパターンを使用すると、不要な再レンダリングを発生させずに複数の値を一度に選択できます。
const { items, loading } = useCartStore(
  s => ({ items: s.items, loading: s.loading }),
  shallow
);

安定したアクションの参照

Zustandのアクション(関数)の参照は安定しています。状態が更新されても変化しません。shallowを使わずに選択しても、再レンダリングの原因にはなりません。
// Actions are always stable — no shallow needed
const addToCart = useCartStore(s => s.addToCart);

useShallowヘルパー(Zustand v5以降)

Zustand v5にはuseShallowユーティリティが用意されています。セレクターをshallow等価性で自動的にラップできるため、コードがすっきりします。
import { useShallow } from 'zustand/react/shallow';

const { items, loading } = useCartStore(
  useShallow(s => ({ items: s.items, loading: s.loading }))
);

セレクターの組み合わせ

ストアに派生状態を保存せず、セレクター内で計算値を導出します。合計値、フィルタリングされたリスト、フォーマット済みの文字列などをセレクター内で計算します。
const totalPrice = useCartStore(
  s => s.items.reduce((sum, item) => sum + item.price, 0)
);

Zustandの再レンダリングのプロファイリング

React DevTools Profilerを使用して、セレクターが正しく動作することを確認します。ストアに関係のない項目を追加した後、nameセレクターだけを使用するコンポーネントがコミットのフレームグラフに表示されないことを確認します。

確認問題

Zustandのセレクターがオブジェクトを返す場合、なぜshallow等価性を使用する必要がありますか?

まとめ

常に具体的なセレクターを使用します。複数の値をオブジェクトとして選択する場合は、shallow等価性を使用します。計算値はセレクター内で導出します。アクションの参照は安定しているため、shallowは必要ありません。

次のレッスン

次のレッスン: **Persistミドルウェアによる状態の永続化** — persistミドルウェアを使用して、Zustandの状態をlocalStorageと同期します。

よくある質問

「Selectorsと不要な再レンダーの防止」レッスンは無料ですか?

はい。「Selectorsと不要な再レンダーの防止」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「Selectorsと不要な再レンダーの防止」で何を学びますか?

selectorsで必要なstateの一部だけを取り出し、必要な場合にのみコンポーネントを再レンダーします。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Selectorsと不要な再レンダーの防止」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 最初のZustand Storeを作成する
  2. Selectorsと不要な再レンダーの防止
  3. Persist MiddlewareによるStateの永続化
  4. Zustand DevToolsとStoreのテスト
← React Academyに戻る