Upgrade to Pro — share decks privately, control downloads, hide ads and more …

React Contextの状態管理について考える

Yudai Jinno
January 16, 2025
51

React Contextの状態管理について考える

Yudai Jinno

January 16, 2025
Tweet

Transcript

  1. © 2024 Classmethod, Inc. 自己紹介 3 簡単な自己紹介をさせていただきます。本日はどうかよろしくお願いいたします。 名前 神野 雄大(Jinno

    Yudai) 所属 classmethod株式会社 クラウド事業本部 コンサルティング部 ソリューションアーキテクト 資格 • AWS Certification All Cert • Azure Solutions Architect Expert • Google Cloud All Cert 得意領域 • アプリケーション全体の設計・開発 • IoT 好きなスーパーはラ・ムー!!! ブログはこのアイ コンで書いていま す!
  2. © 2024 Classmethod, Inc. 本発表の目的 4 本発表の対象と目標は下記の通りです。 対象 対象と目的 •

    React 初心者 ~ 中級者 • React Contextを使用しているが課題感を感じている 目標 • React Contextの設計を見直すきっかけとなり、よりより設計への一歩を 踏み出すきっかけとなる。
  3. © 2024 Classmethod, Inc. 状態管理:useState 6 Reactの基本的なステート管理はuseStateです。ひとつのコンポーネント内で完結する ようなステートならばuseStateを使用します。 useStateのイメージ •

    コンポーネントBとCは、それぞれ独自のState を持つ • 各コンポーネントの状態は互いに独立している • コンポーネント内で完結する状態管理が可能
  4. © 2024 Classmethod, Inc. 状態管理:useState 親子間でのState連携 7 useStateで親から小コンポーネントへ状態を伝播する場合、下記のようにpropsを介し て行います。 useStateのバケツリレーイメージ

    • コンポーネントAで定義されたStateが、複数の 子コンポーネントで必要とされている • コンポーネントEとGが実際にStateを使用(黒 色で表示) • 中間のコンポーネント(B、C、D)は単なる経 由点として機能 バケツリレーが発生
  5. © 2024 Classmethod, Inc. 状態管理:useState + バケツリレーの課題 8 useState +

    バケツリレーはパフォーマンスが悪くなる可能性があります。仮にMemo化 したとしても仲介となっているコンポーネントの再レンダリングも発生する可能性があ り、多くのコンポーネントの再レンダリングを意識することになるからです。 useStateのバケツリレーによる再レンダリングイメージ • 実際にStateを必要としないコンポーネントB、 D、Fも含まれる • Memo化による最適化を行っても、propsの受け 渡しは依然として必要 • アプリケーションの規模が大きくなるほど、こ の問題の影響も大きくなる
  6. © 2024 Classmethod, Inc. 状態管理:useState + バケツリレーの課題解消に向けて 9 useState +

    バケツリレーの課題に対して、いくつかの解決策があります。アプリケー ションの規模や要件に応じて、適切な状態管理ソリューションを選択することが重要で すが、標準で備わっているReact Contextが採用されるケースが多いように感じます。 useState + バケツリレーの課題解消案 React Context 状態管理ライブラリ 設計の見直し • Reactの標準機能 ◦ 標準機能といったこともあり最初に採用される可能性が高い • 中間コンポーネントを介さずに状態共有が可能 • Redux, Jotai, Zustand など • より高度な状態管理機能を提供 • 状態を持つコンポーネントの配置を最適化 • コンポーネント分割の見直し
  7. © 2024 Classmethod, Inc. 状態管理:React Contextの利用イメージ 10 React Contextは、propsのバケツリレーを解消するためのReactの組み込み機能です。 Contextを使用することで、中間コンポーネントを介さずに、必要なコンポーネントに

    直接状態を提供することができます。 React Contextの利用イメージ • Providerで状態を提供 • 必要なコンポーネント(青色)で直接Context を使用 • 中間コンポーネントはContextの存在を意識す る必要がない
  8. © 2024 Classmethod, Inc. 状態管理:React Contextの採用の決め手 11 ContextはReact標準で組み込まれているため、まずは使ってみようみたいな温度感で採 用されるケースが多いと思います。ただ使っていくといくつか課題も発生しうると思っ ていてそこを深掘りしていきます。

    React Contextの採用イメージ React Context 状態管理ライブラリ エンジニア 採用 外部ライブラリよりは標準の方 が敷居低そうだし採用!! ただ、使っていくと課題があっ た・・・?
  9. © 2024 Classmethod, Inc. React Context:利用イメージ(再掲) 13 useState + バケツリレーを避ける場合、React標準で可能な選択肢として

    React Contextの使用が挙げられます。Contextは、props以外でコンポーネント間の伝達を可 能にします。 React Contextの利用イメージ(再掲) • Providerで状態を提供 • 必要なコンポーネント(青色)で直接Context を使用 • 中間コンポーネントはContextの存在を意識す る必要がない
  10. © 2024 Classmethod, Inc. ReactContext:Context Hell or Provider Tower 14

    useContextは便利な機能ですが、安易な使用は「Context Hell」(もしくはProvider Tower)と呼ばれる問題を引き起こす可能性があります。複数のContextが入り組むこ とで依存関係が複雑化し、コードの保守性が著しく低下するケースがあります。 Context Hellのイメージ • Providerの過度な入れ子構造 • コードの可読性が低下 • パフォーマンスへの影響 • 状態管理の責務が不明確
  11. © 2024 Classmethod, Inc. 状態管理の設計:対応方針 19 Contextを使用する際の課題に対して、アプリケーションの設計面から解決策を検討 します。グローバルな状態管理の見直しと、適切なライブラリの選択が重要なポイン トとなります。 Contextへの課題対応方法検討

    ライブラリの使用 設計の見直し • 外部データソースのクエリ結果保持にはSWR/Tanstack Query の使用を検討する • 上記以外の全体の状態管理はJotaiなどの外部ライブラリの使用 を検討する • グローバルで保持するStateかどうか再検討する • Providerのスコープを検討する
  12. © 2024 Classmethod, Inc. まとめ 27 まとめ React Contextを使用している場合は下記まとめの通り検討することでアーキテク チャの見直しを実現できます。

    まとめ • 全体で状態管理すべきStateか再検討する(無闇にグローバルのState としていないか) • 状態管理が必要なStateに関しては、Providerのスコープや保持する箇 所を意識する(役割を意識せず全て1つのProviderとしていないか?) • SWRやJotaiなど外部ライブラリに代替して、シンプルな設計にできな いか検討する(必ずしも何か外部ライブラリを使うことが正解といった わけでもないです)