Table of Contents
はじめに: React ネイティブの State Management のマターがなぜ
State Managementは、インタラクティブなReact Nativeアプリケーションのバックボーンです。データの保存、更新、共有の方法は、アプリの応答性、デバッグ性、および保守性に直接影響します。 適切に管理された状態は、UIの固定、予測不可能なバグ、およびスラグジュア開発サイクルにつながります。 アプリがいくつかの画面から、リアルタイムのデータ、オフライン機能、複数のユーザーロールを持つ複雑なシステムまで成長するにつれて、ソリッドステート管理は、非必要なバグになり、 な開発サイクルがなくなります。 これにより、ReactFaste-F-status-F-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-de-
React ネイティブのステータスを理解する
React Native の state は、時間とともに変化し、ユーザーが何を見ることができるかに影響を与える可能性のあるデータを指します。 認証されたユーザーのプロファイルまたはフェッチされた製品のリストに、トグルボタンのオン/オフ状態から範囲を切り替えます。 広く、状態は 2 つのカテゴリに分類できます。
- [Local(component)state[ – 単一のコンポーネントのみのデータまたは小さなスケーターが必要とする。例:フォーム入力、モーダル可視性、アニメーションの進捗。
- [グローバル(共有)状態[]] - アプリの多くの関連のないコンポーネントがアクセスする必要があるデータ。例:現在のユーザー、ショッピングカート、テーマ設定、通知カウント。
状態の各部分をどこに保存するかを選ぶことは、状態管理の本質です。 目標は、データのフロー予測を続け、不要な再レンダリングを避け、状態の変化を追跡しやすいことです。
州政府の経営に最適なプラクティス
1. ローカル州で開始: と
React の組み込みのホックは、まず、最もよくあるツールです。 []]useState] は、単純な独立した状態の部分(例えば、チェックボックスまたはテキスト入力)に最適です。 状態のロジックがより複雑になるとき(複数の関連値、独立した更新)、])に切り替えます。 useReducer。 これにより、reducters と state を繰り返して、結果を直接、Reducer または コンポーネントに再構成できます。
2. 必要性が時だけ持ち上がる状態
2つ以上の兄弟コンポーネントが同じデータを共有する必要がある場合、慣用 React アプローチは、最も近い共通祖先に状態を「リフト」することです。 データを渡すと、更新機能が props としてダウンします。 これは、重複状態を避け、フローの単方向性を維持します。 しかし、あまりにも高い持ち上げを避けます。 2つの兄弟の共有状態だけであれば、ルートにすべての方法を押しないでください。 共有値パターンを保持する小さなラッパーコンポーネントを作成してください。 これにより、外部のスケールや外部のスケールが容易になり、外部の規模がわかりやすくなります。
3. コンテキストAPI(]で中規模シェアリング
プローブの穴あけが痛みを伴う場合、5層以上を網羅する - リアクトのコンテキスト API は、クリーナーエスケープを提供します。ステートオブジェクトとディスパッチ機能を保持するコンテキストを作成します。 [] を使用して、Reducer] をプロバイダ内で組み合わせて、更新ロジックを集中化します。 このパターンは、テーマ、ローカライズ、認証ステータス、または機能フラグなど、中規模のアプリで優れています。 注意: コンテキストのコンテクストのすべてのコンシューマーが、変更時に [FLT] 変更を分離するときに役立ちます。 [FLT]
4. 大規模アプリの州管理ライブラリを採用
アプリが数十画面に達したら、非同期のデータフローが多々あり、複雑なビジネスルールが複雑になれば、堅牢なライブラリが不可欠です。 React Native エコシステムで最も戦闘テスト済みオプションは次のとおりです。
- [Redux Toolkit(RTK)[:Reduxの公式、オピニオンバージョン。 RTKはと大幅にボイラープレートをカットし、非同期のスカンクのサポートを組み込みます。 それは、Immerを介して不変性を強化し、ストアの構成を簡素化し、高度なデバッグのためにRedux DevToolsと統合します。 予測可能性と厳格な一方向データフローのドキュメントを評価するチームに最適です。 [FLTFLT] [FLT] [FLT] [FLT] [FLT] [FLT]] [FLT]]:[FLTFLT]]:[FLT:[FLT]:[FLT:[FLT:[F]]]]:[FLT:[FLT:[FLT]:[F]:[F]:[FLT]:[FLT:[F]:[F]:[F]:[FLT:[F]:[FLT:[F]:[F]:[F]:[F]:[F]:]:[FLT
- [Zustand]:最小限のAPIで軽量でホクシファーストのステートマネージャ。 を使用して小さなストアを作成し、ホックから直接状態にアクセスします。 Zustandは、ミドルウェア(パーシススト、デフツール)と優れたパフォーマンスを提供しながら、Reduxのボイラープレートの多くを避けます。 スケール特性を犠牲にすることなく、シンプルさを望むチームに最適です。
- [MobX-State-Tree(MST)[: 保存可能な状態と暗黙の反応を使用する。 種類、アクション、および計算されたプロパティを持つモデルを定義します。 MSTは、変更された値を消費するコンポーネントだけ依存性と再レンダリングを自動的に追跡します。 オブジェクト指向、モデル主導のアプローチを好む開発者にとって、自動最適化を望むのが大好きです。
チームに精通した、アプリの特定のニーズに基づいて選択してください。 ほとんどの新しいプロジェクトでは、[]]Redux ToolkitまたはZustandは優れた出発点です。 往年の未加工Reduxボイラープレートを避けてください。 ツールキットを常に使用してください。
5. 専用のツールで非同期状態を管理
Server-fetched のデータ(API 呼び出し、GraphQL、Firebase)は、独自の処理に値します。同じグローバルストアで UI の状態を UI の状態に混入しないでください。 のような専用ライブラリは、TanStack Query (React Query)[] と SWR]] は、キャッシュ、重複、背景の削除、背景の拒否、ペグネーション、および、およびそれらが記述された状態の最適化された状態のプロセスを処理します。 [FLTZ] は、 これらを記述するプロセスを記述します。
6. 適切な状態の持続状態
多くの React ネイティブ アプリは、アプリの再起動を生き残る必要があります。ユーザの好み、認証トークン、データドラフト。 状態の永続的なスライスをローカルストレージに永続的に保存します。 ]]] AsyncStorage を単純なキー値のニーズに使用できますが、 を 正確に実行して、より大きなデータセットで高いパフォーマンスを発揮します。 のようなライブラリは、 状態を非同期させるか、 ストレージ (Benid は、Z) [FLT] と は、 を非同期しない (Ben と は、 と は、 メモリが、 ではなく、 と の [FLT:[FLT:] と は、 は、 は、 と の は、 と を を と と の の の の は、 は、 は、 は、 と の の の は、 は、 と 暗号化 ( と の
7. パフォーマンスの最適化: Memoization およびセレクター
過剰な再レンダリングは、React Native のパフォーマンス問題の主要原因です。次の規則に従ってください。
- 同じプロップを頻繁に受け取るコンポーネントに []]] を 再アクト.memo[ で使用します。
- と]を使用して、オブジェクトを安定化し、プロップとして渡された関数参照を処理します。
- Redux や類似ライブラリを使用する場合、メモ帳のセレクター(Reselect から ) で、最小限のデータスライスを常に選択します。これにより、ストアの関連部分が変更されたときに、コンポーネントが再レンダリングされるのを防ぎます。
- コンテキスト重いセットアップのために、更新に関する関連するサブツリーのリレンダリングだけを分割するプロバイダを分割します。
React DevToolsとMetroのパフォーマンスモニターを使ってアプリをプロファイルしてホットスポットを特定します。多くの場合、コンテキスト値のは画面全体が遅くなります。
8. 状態の論理をテストして下さい
状態管理ロジックは、コンポーネントツリー全体をマウントすることなく、分離でテスト可能でなければなりません。Reduxでは、ユニットテストを]を使用して、リデューサーとアクションクリエイターに書きます。Zustandでは、そのゲッターとセッターを呼び出して、ストアを直接テストします。Context + useReducerの場合、リデューサー関数を抽出し、純粋な関数のようにテストします。これは、状態の移行が正しく機能する自信を与えます。特に、レースの要素は、refltrefref(Ref)を正規に渡します。
追加のヒント
- []Keep state mini]: 可能な限り既存の状態から派生する値(例えば、別々に格納する代わりにアイテム配列から合計価格を計算する)。
- []: 常に新しいオブジェクト/配列を状態を更新するときに返します。スプレッド演算子、[/[]]、またはイマーのようなライブラリを使用して、突然変異バグを防ぎます。
- サイドエフェクトのミドルウェア: 再ux の場合、 または Redux Saga/Thunk を使用します。 Zustand の場合、ストアハンドルの副作用内の単純な関数は、きれいに機能します。
- [ キャッシュは選択的に: React Query または SWR を使用して、サーバーの状態キャッシュを行います。オフラインで変更し、後で同期する必要がある場合は、ローカルストアでサーバーデータを複製しないでください。
- [規則的にrefactor]:アプリが進化するにつれて、状態のアーキテクチャを再訪します。 局部状態をコンテキストに移動するか、またはプロップの掘削が混乱するときにライブラリを移動します。 未使用の状態のスライスを削除します。
コンテンツ
React Native の効果的な状態管理は、単一の指定されたアーキテクチャを以下にしていません。これは、各タイプの状態の正しいツールを選択して、データのフローを予測可能に保つことです。 と で簡単に開始します。 適度な共有のためのコンテキストをスケールし、アプリの複雑さが集中的に、デバッグ可能なストアを必要とするときに、Redux Toolkit や Zustand などのライブラリを採用します。 専用のフェッチツールを使用して、クライアントの状態から常にサーバーの状態を分離します。 そして、パフォーマンスを重要かつ忘れないでください。
これらのベストプラクティスを開発ワークフローに編むことで、React Nativeアプリケーションを、レスポンシブ、保守可能、そして、数千行のコードに成長する喜びを築き上げることができます。 キーは、後続ではなく、ファーストクラスの市民として状態を治療することです。