私は現在、オブジェクト タイプを使用して時刻表の「ドキュメント」をモデル化するバス時刻表アプリケーションを作成しています。
リーリー型に加えて、多くの関数があり、ミューテーションを使用する場合は、通常、それらをクラスのメソッドとして記述します。私は主に Immer を使用するため、多くの拡張構文を記述する必要はありません。例えば、### リーリー
状態を管理するために Zustand と Immer を使用していますが、Redux を使用しても問題は同じになるような気がします。私のストアには、Timetable オブジェクトの配列と、Immer を使用して現在選択されている Timetable オブジェクトを再割り当てする操作があります:リーリー
次に、React コンポーネントのデータ変更関数を呼び出し、更新操作を呼び出します。 リーリーこれは機能しますが、正しく実行しているかどうかはわかりません。現在、Immer 呼び出しの 2 つのレイヤーがあり、コンポーネントにはイベント ハンドラーで直接呼び出されるデータ変更関数が含まれています。全体的には小さなバグですが、「メソッド」の外観があまり好きではありません。
検討しました:
すべてのデータ変更を操作に変換します。ストアのオブジェクト配列のインデックス付けには多くの重複があるため、これは保守が難しく、理解しにくくなるように見えます。
[immerable] = true
を設定して、Immer にすべての作業を実行させます。これを実行しましたが、むしろ不変記録モードにこだわりたいと思います。
ほど単純なアプリケーションはありません。 Flux アーキテクチャを使用してアプリケーションを構築する最良の方法は何ですか?
P粉5761849332024-01-11 16:52:03
(Zusand と Immer については詳しくありませんが、お役に立てるかもしれません...)
常にさまざまな方法がありますが、ここでは私のお気に入りの方法を提案します。
「scheduling」アクションと実際の状態の「mutations」を明確に区別します。 (たぶん 間に別のレベルを追加します)。
一般的なものではなく、 特定の 「突然変異」関数を作成することをお勧めします。つまり、
updateThisTt: () => { ...
,addStop: () => { ...
などの関数を使用します。 それぞれの目的を持った、必要なだけのミューテーション関数を作成します。
概念的には、immer
ジェネレーターはミューテーション関数内でのみ使用してください。
(ストアのことです。もちろん、immer
を他の目的に使用することもできます) 。
この公式の例によると: リーリー
コンポーネント内で「mutator」関数を呼び出すことができるようになりました。リーリー
新しい国を築くたとえば、
addStop 関数は Zustand ミューテーション内で呼び出すこともできます。
リーリー
特定のアプローチは提案しませんが、通常、コードは
書かれるよりも読まれることが多いことに注意してください 。
時々 さらにいくつかの文字、たとえば state.timetables[index] のようなものを複数回書く価値があると思います。
コードの目的がより明確になる場合。自分で判断する必要があります。
別のファイル に入れて、他には何もしないことをお勧めします。 こうしてみると、思ったよりも理解しやすいかもしれません。
非常に大きなファイルがあるが、状態の変更のみに完全に集中している場合 、 構造が一貫しているため、スクロールする必要がある場合でも読みやすくなっています。 数ページ。
たとえば次のようになります:リーリー
また、これらの可変引数関数は完全に独立していることにも注意してください(それともそうなのですか?ここでは Zustand が純粋な関数を使用すると予想しています、いいえ?) 。
これは、複雑になった場合には、複数の突然変異関数を分割することもできることを意味します。 フォルダー内で個別のファイルに分割する/store/mutators/timeTable.js のように。
「ペイロード」(「アクション呼び出し元」) の構築
イベント ハンドラーとミューテーション関数の間。 通常、このようなレイヤーを作成しますが、適切な名前がありません。 これを一時的に「オペレーション呼び出し元」と呼びます。
何が「変化関数」に属し、何が「変化関数」に属するのかを判断するのが難しい場合があります。 「アクションコーラー」。とにかく、「アクション呼び出し元」内で「データを構築」することはできますが、そうすべきではありません。
ここでは、immer を使用する場合も含め、いかなる種類の状態操作も実行されません。 これは微妙な違いであり、おそらくあまり心配する必要はありません (例外もあるかもしれません) ただし、例として: 「アクション呼び出し元」内で古い状態の一部を使用できます。例:
リーリー
ただし、 not古い状態を新しい状態にマッピング (または変換) しないでください。例:
リーリー
###もう一つの例###
ここでは具体的な提案はしません。単なる例です: イベント ハンドラーでは、「新しい項目の追加」など、本当にやりたいことに集中したいと考えています。
ただし、すべての議論を考慮する必要はありません。さらに、他の用途で新しいアイテムが必要になる場合もあります。 または次のように書くこともできます: 状態の変換とペイロードの作成
多くの値をミューテーターに渡すと面倒になる可能性があります。例:
リーリー