Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

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

Avatar for Yudai Jinno Yudai Jinno
January 16, 2025
1k

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

Avatar for Yudai Jinno

Yudai Jinno

January 16, 2025
Tweet

More Decks by Yudai Jinno

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など外部ライブラリに代替して、シンプルな設計にできな いか検討する(必ずしも何か外部ライブラリを使うことが正解といった わけでもないです)