danmaq / react-un-practice

Practice project that the unstated-next with Redux style data flow

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

プロジェクトの概要

Unstated Next を使用して、かつ複数のコンテキストを結合するサンプル プロジェクト。

Create React App のボイラープレートをベースとして、コンテキスト上の状態操作コントロールを追加しています。

使い方

git clone https://github.com/danmaq/react-un-practice.git
cd react-un-practice
npm ci
npm start

サンプル解説

スクリーンショット

画面には Create React App のボイラープレートの他、下部にカウンター表示とログ表示、そしてそれらを操作するためのコントロール群があります。

  • Set counter: テキストボックスを編集すると、速やかにその値でカウンターの値を上書きします。
  • +1 ボタンを押下すると、カウンターの値を +1 します。
  • Fetch to “api.github.com” ボタンを押下すると、GitHub API サーバーへ GET 接続し、リポジトリ一覧の JSON をダウンロード&パースして、そのまま破棄します。
    • この際、ダウンロードの所要時間と、カウンターの値をログに蓄積します。
  • Clear the History ボタンを押下すると、ログをクリアします。

本サンプル プロジェクトは 2 種類、合計 4 つのコンテキストで構成しています。

コンテキスト図解

  • カウンター: 一つの数値を持ちます。
    • リデューサー: カウンターの保持・設定のみを担保します。
    • アクション: カウンターのインクリメント・上書きのエンドポイントを担保し、リデューサーに伝えます。
  • フェッチ: 通信の所要時間のログを蓄積します。
    • リデューサー: 通信ログの保持・追加・消去のみを担保します。
    • アクション: 非同期的に通信を行い、その結果とカウンター値の記録をリデューサーに伝えます。

アーキテクチャ解説

大規模 React プロジェクトでは、ストアとコンポーネントを分割して設計しているのが一般的です。 中でも Redux など一部の状態コンテナは、ストアをさらにリデューサーとアクションに分割していますが、React 標準の Context API やそのごく薄いラッパーである Unstated Next ではその仕組みがなく、自前で用意する必要があります。また、これらは複数のコンテキストを用意すると、その間の結合が難しくなるため、コンテキストが肥大化した場合、分割に慎重な設計が必要となります。

そこでこのサンプル プロジェクトでは、コンテキストをリデューサーとアクションとで明確に分離し、アクションから全てのリデューサーを参照できる仕組みを実装しています。

アーキテクチャ図解

部位 値の保持 副作用 非同期処理 説明
リデューサー ◎※1 △※2 × 値保持のみに特化したコンテキスト
アクション △※2 値保持以外の様々な副作用を伴うコンテキスト
コンポーネント ○※3 ○※3 ○※3 レンダリングのための DOM 構造
  • ※1: リデューサー形式による保持のみ許容。
  • ※2: 可読性や保守性の観点上、強く非推奨。
  • ※3: そのコンポーネントのみで完結するローカルなもののみ可。

参照可能かどうか

参照元\参照対象 リデューサー アクション コンポーネント
リデューサー △※1 × ×
アクション △※1 ×
コンポーネント ○※2 -
  • ※1: 登録順序によっては可能ですが、保守性の観点上、極力避けてください。
  • ※2: 可読性の観点上、アクションを経由して参照することを推奨します。

LICENSE

MIT

About

Practice project that the unstated-next with Redux style data flow

License:MIT License


Languages

Language:TypeScript 92.7%Language:HTML 4.7%Language:CSS 2.6%