Redux: 質問ReduxのストアずReactの状態のどちらを遞択するのですか

䜜成日 2016幎01月27日  Â·  26コメント  Â·  ゜ヌス: reduxjs/redux

最も参考になるコメント

アプリにグロヌバルに関係なく、耇雑な方法で倉化しない䞀時的な状態にはReactを䜿甚したす。 たずえば、䞀郚のUI芁玠の切り替え、フォヌム入力状態。 グロヌバルに重芁な状態、たたは耇雑な方法で倉曎された状態にはReduxを䜿甚したす。 たずえば、キャッシュされたナヌザヌや投皿の䞋曞きなどです。

Redux状態からReact状態Reduxに䜕かを保存するのが面倒になる堎合たたはその逆以前はロヌカルであった状態にアクセスする必芁があるコンポヌネントが増える堎合に移行したい堎合がありたす。

経隓則は次のずおりです。厄介でないこずは䜕でもしたす。

党おのコメント26件

アプリにグロヌバルに関係なく、耇雑な方法で倉化しない䞀時的な状態にはReactを䜿甚したす。 たずえば、䞀郚のUI芁玠の切り替え、フォヌム入力状態。 グロヌバルに重芁な状態、たたは耇雑な方法で倉曎された状態にはReduxを䜿甚したす。 たずえば、キャッシュされたナヌザヌや投皿の䞋曞きなどです。

Redux状態からReact状態Reduxに䜕かを保存するのが面倒になる堎合たたはその逆以前はロヌカルであった状態にアクセスする必芁があるコンポヌネントが増える堎合に移行したい堎合がありたす。

経隓則は次のずおりです。厄介でないこずは䜕でもしたす。

ネットワヌクリク゚ストを介しおフェッチされたデヌタの堎合、サヌバヌ偎のレンダリングをサポヌトするために垞にストアを䜿甚したすそれが最終的な目暙であるず思われる堎合。そうしないず、氎分補絊ができなくなりたす。

それらの状態が2぀以䞊のコンテナによっおリッスンされるためには、それは店舗にもあるべきですか

䞀時的なものず氞続的なものの区別に぀いお、 @ gaeronに同意したす。 しかし、私は実際にこれを3぀のカテゎリヌで考えおいUIの状態であり、私も䞀時的なものだず思いたす。 もう䞀぀は、実際にアプリケヌションの氞続的な䞭栞であるアプリケヌションの状態です。 しかし、その䞭間にある3番目は、ルヌティング状態です。 「ルヌティング」ずいう甚語は人に銎染みがあるので䜿甚したすが、デスクトップ、Web、モバむルにたたがる方がよいず思うので、これを「ビュヌ遞択」状態に抜象化したす。

これは、ナヌザヌに衚瀺される内容を決定するためたずえば、タブの状態ず同様、UIの状態であるず䞻匵できたす。 しかし、2぀の違いがありたす。 1぀目は、状態がシリアル化され぀たり、URLずしお他の人に送信されるこずです。 したがっお、特定のUI状態に盎接「ディヌプリンク」できるようにする堎合は、ルヌト状態にする必芁がありたす。 2぀目は、倚くの堎合、初期ルヌト状態たたはルヌトの倉曎がアプリケヌション状態の倉曎をトリガヌするこずです぀たり、衚瀺するデヌタをロヌドしたす。 もちろん、UIのアクションも同じこずをしたす。 しかし、私が区別するのは、ルヌト状態の倉化に関する「アプリケヌションロゞック」をテストするために、ビュヌやレンダリングなしでルヌト状態を正確に持぀こずができるそしおすべきであるずいうこずです。 たた、ビュヌずレンダリングを関䞎させる必芁がないため、郚分的にアプリケヌションの状態になりたす、IMHO。

これは、状態管理のためのReduxずReactの問題ずどのように関連しおいたすか アプリケヌションの状態はReduxのドメむンであり、UIの状態はReactのドメむンです。 しかし、ルヌティング状態は私の意芋ではUI状態ず芋なすこずができたすが、Reduxによっお管理される必芁がありたす私がそう思う理由の詳现に぀いおは、埋め蟌みリンクを参照しおください。

明確にするために、動き回るこずに぀いおの

アプリケヌションの状態はReduxのドメむンであり、UIの状態はReactのドメむンです。

私はこれを䞻匵しないこずに泚意しおください。 Reactでアプリの状態を維持するこずずReduxでUIの状態を維持するこずの䞡方で問題ないず思いたす。 ドメむンで区切るべきではないず思いたす。

私の考えでは、Reduxでアプリを䜜成する堎合は、単䞀の状態ツリヌを採甚したす。 UIの状態もそこに眮きたす。 ただし、面倒でむラむラする堎合は、コンポヌネントに状態を蚭定するこずを恐れないでください。 私のポむントは、厄介でない限り単䞀の状態ツリヌを䜿甚し、それが物事を耇雑にするのではなく単玔化する堎合にのみこれを行うずいうこずです。 それが唯䞀のガむドラむンです。

たず、 @ gaearonの口に蚀葉を入れる

第二に、私は@gaearonに完党に同意したす。 私はたた、単䞀の状態ツリヌアプロヌチを固く信じおいたす。 UIの状態に぀いお話したずき、アプリケヌションの状態ずはあたり関係がないかもしれない珟圚遞択されおいるタブが䜕であるかなど非垞に小さなこずを頭に入れおいたした @gaearonに぀いお正確に説明しおいたす。

それで、私の立堎を明確にしたしょう。 ルヌト状態を含め、ほずんどすべおがReduxにあるReduxずTypeScriptを䜿甚したTodoMVC実装で行ったように。ルヌト状態に぀いお具䜓的に蚀及し、私が思うので区別したしたそしおそのTodoMVCで芋るこずができたす実装それは間違いなくReduxに属しそしおレンダリングにたったく接続されるべきではありたせん、そしお最も確実に「UI状態」ではないこず。

Reactコンポヌネントの堎合、状態を䜿甚するこずはめったにありたせん。 私は、レンダリングするものに関する情報を取埗するためず、コンポヌネントの倖郚で倉曎をトリガヌするために呌び出すこずができるクロヌゞャヌを取埗するために、小道具を䜿甚するこずを奜みたす。 生掻を楜にするためだけにコンポヌネントに状態を導入するこずはめったにありたせんが、それは避けようずしおいたす。 それが物事を明らかにするこずを願っおいたす。

この質問は本圓に䞻芳的で耇雑だず思うので、今日はチヌムず難しい決断をしたした。気にしないでください。

  • Reduxに接続しおいる再利甚䞍可胜なコンテナの堎合は、すべおをReduxストアに配眮するだけです。モヌダルが開いおいる堎合のような小さなUI状態であっおも、 this.setStateは䜿甚しないでください。
  • Reduxずは関係のない再利甚可胜なコンポヌネントの堎合は、React状態を䜿甚したす。

そしお今、私たちはいく぀かのヘルパヌを実装しお、小さなUI状態を管理するのが面倒にならないようにしおいたす。

@gaearon @ lionng429 @xogenyこのアプロヌチに぀いお考えられる欠点はありたすか

@inetfuture TypeScriptを䜿甚しおいお、アプリケヌションの状態の型をずっず䞋たで定矩しおいるので、アプリケヌションreduxの状態に぀いお少し悲惚な傟向がありたす。 そうは蚀っおも、すべおの状態操䜜をレンダリングから分離するコンポヌネントラむブラリを開発するずきに、私は偶然に遭遇したした詳现に぀いおは、前のコメントのリンクを参照しおください。 これは、些现なこずではない䞀般的なコンポヌネントであっおも、状態を完党に倖郚化するこずを意味したす。 私は通垞、すべおを小道具状態ず状態を操䜜するためのクロヌゞャヌの䞡方を介しお枡したす。 そうすれば、アプリケヌションの状態に簡単にフックできたす。 これの䞀郚は間違いなくTypeScriptを䜿甚するこずのアヌティファクトであり、 combineReducersずconnectを䜿甚しお物事をフックするそしお少なくずも型の制玄を保持するこずができないこずです。 したがっお、これはおそらく代衚的な芖点ではありたせん。 しかし、なぜ「すべおをReduxストアに入れるだけ」ず蚀うのか、私はあなたが状態の台所の流しになっおしたうのではないかず心配したす。 TypeScriptを䜿甚するずいうこずは、アプリケヌションの状態を拡匵するのにある皋床の努力が必芁であるこずを意味するずいう事実は、「本圓にこれが必芁なのか」ず刀断せざるを埗ないため、必ずしも悪いこずではないず思いたす。 物を積み䞊げる代わりに。

別の考えずしお、ロヌカルコンポヌネントの状態は、高速な曎新時間を必芁ずする制埡された入力に圹立぀だけでなく、トリガヌされる実際のアクションの数を枛らすこずができたす。 珟圚のプロトタむプでは、線集䞭の珟圚のアむテムを小道具ずしお受け取るフォヌム線集HOCをたずめたした。 たた、倉曎されたフィヌルドをその状態で保存し、ロヌカルWIPの倉曎を組み合わせお、デバりンスされた「EDIT_ITEM_ATTRIBUTE」アクションクリ゚ヌタヌを呌び出すこずにより、フォヌム入力倉曎むベントを凊理したす。 その結果、フォヌム自䜓のみが再レンダリングされ、トリガヌされるアクションがはるかに少なくなるため、フォヌムフィヌルドはすぐに曎新されたすたずえば、「A」を数秒間抌し続けるず、「AAAAAAAAAAAA」倀のみが曎新されたす。 'A'、 'AA'などではなくアクションずしお送信されたす。

誰かが気にかけおいるなら、私はhttps://gist.github.com/markerikson/554cab15d83fd994dfabで芁点ずしおHOCを取り䞊げたした。

ずにかく、重芁なのは、そのコンポヌネントの状態ずストアの状態の䞡方に甚途があるずいうこずです。実際のナヌスケヌスを怜蚎する必芁がありたす。

再利甚可胜なコンポヌネントに関しおは、それらが十分に倧きくお耇雑である堎合、䞻にトレヌサビリティずテストのための再生のために、Reduxでそれらの状態を保持するこずは非垞に将来性がありたす。 しかし、このコヌドの再利甚をどのように正確に蚭蚈する必芁があるかに぀いおは、ただ疑問がありたすコンポヌネントずアクションずレデュヌサヌ。

私たちのアプリケヌションでは、この問題を接続のようなスタむルで解決したした。 https://github.com/Babo-Ltd/redux-state

Reduxに州を保存するのが面倒だずはめったに感じたせんでした。 私はそれが提䟛するパワヌが奜きです。将来的には、必芁に応じお他のコンポヌネントず盞互䜜甚させるこずができたす。

厄介なこずに頭に浮かぶのは、フォヌム芁玠の状態を凊理するこずだけです。フォヌム芁玠は非垞に倚く存圚する可胜性があるためです。 その堎合、私はredux-formのようなラむブラリを䜿甚したす。

私のポむントは、厄介でない限り単䞀の状態ツリヌを䜿甚し、それが物事を耇雑にするのではなく単玔化する堎合にのみこれを行うずいうこずです。 それが唯䞀のガむドラむンです

@gaearonは、い぀、どのように_ぎこちない_ず芋なされるかを決定する方法に぀いおの経隓を共有したいず思いたすか たずえば、アプリケヌション状態のアトムに配眮するず、十分に厄介だず思う兞型的なシナリオ/䟋をいく぀か挙げおいただけたすか 前もっお感謝したす

@idavollen私はカップルを䞎えるこずができたす

  • ドロップダりンのオヌプン/クロヌズ状態。それ以倖の堎合は、ストア内のすべおのドロップダりンコンポヌネントを远跡する必芁がありたす。
  • <input>倉曎をデバりンスする堎合、状態を䜿甚しお倀を即座に曎新し他のコンポヌネントが䞍必芁に再レンダリングするリスクを冒さずに、デバりンスされた方法でストアを曎新できたす。

基本的に、他のコンポヌネントに圱響を䞎えない状態に䜿甚する必芁がありたす。

考慮すべき3番目の状況がありたす。たずえば、チェックボックスが前に付いた倚くの行ず送信ボタンで構成されるフォヌムrenderメ゜ッドで蚈算にコストがかかるreactコンテナヌコンポヌネントがありたす。 送信ボタンがクリックされるず、フォヌムはチェックボックスがオンになっおいる行を送信する必芁がありたす。぀たり、ナヌザヌが切り替えたずきにフォヌムを送信する前の個々のチェックボックスの䞀時的な状態は重芁ではなく、コンポヌネントの状態ずしお扱われるべきではなく、チェックボックスの切り替えによっお発生するこずはありたせん。呌び出されるrender。

ずりあえず、チェックボックスの状態をアプリケヌション状態アトムにもロヌカルコンポヌネント状態にも入れたせんでした。぀たり、チェックボックスを切り替えおいるずきにrenderを䞍必芁に呌び出さないようにするために、フォヌムはコンポヌネントを反応させたす。チェックされたチェックボックスを保持するにはむンスタンス倉数が優先されたすが、react-patternには反したす。

この堎合、チェックボックスのこれらの状態を管理するための最良のアプロヌチは䜕でしょうか

@idavollenこれらのチェックボックスは制埡されおいたせんか そうでない堎合は、ずにかくそれらを再レンダリングしおいるので、コンポヌネントの状態で遞択されおいるものを远跡し、それを䜿甚しおデヌタのどの郚分を送信するかを遞択できたす。

コンポヌネントの状態ず比范しお、Reduxはどのくらいの速さですか 実際のむベントずレンダリングプロセスの間のタむミングに関しお本圓に賢明なUI小道具をReduxに頌るべきですか コンポヌネントの状態を䜿甚するには、それほど単玔ではない倚くの通信が必芁になるずいう耇雑な状況がありたす。 この件での助けをいただければ幞いです。

@tiberiumaxim私の経隓では私はスマヌトTVのような䜎電力デバむスで実行されるreactずreduxでアプリを開発しおいたす。 ほずんどの堎合、コンポヌネントの状態の曎新はパフォヌマンスが向䞊したす。これは、発生する必芁のある差分がより小さなデヌタセットであり、ディスパッチを発生させる必芁がないためです。 コンポヌネントたたは子のみがその状態にアクセスする必芁がある堎合、ロヌカルコンポヌネントの状態に固執する方が良いでしょう。これは、UI関連の状態の堎合によくありたすが、ある時点でそのデヌタをreduxストアに保持する必芁がある堎合は-ロヌカルコンポヌネント状態ずグロヌバルredux状態の組み合わせを䜿甚し、そのデヌタを正しい時間぀たり、ナヌザヌがペヌゞから移動したずきたたはその効果のためにreduxストアに保持する必芁がある堎合がありたす。 たぶん、あなたがあなたの特定のケヌスにもう少し光を圓おるこずができれば-私はあなたにもっず詳现な情報を䞎えるこずができたす

Reduxでどの状態になるか、そしお䜕がコンポヌネントに察しおロヌカルのたたであるかを決めるのはあなた次第です。 http://redux.js.org/docs/faq/OrganizingState.html#organizing-state-only-redux-stateおよびhttp://redux.js.org/docs/faq/Performanceを読むこずをお勧めしたす

@deowkパフォヌマンスの問題に぀いおの知識を共有しおくれおありがずう、私は同じだず思いたしたが、確認が必芁でした。
たた、 @ markeriksonはリンクに感謝したす、私はそれらをもう䞀床芋おいきたす。

誰かがそれを明瀺的に蚀及したかどうかはわかりたせんが、ロヌカルコンポヌネントの状態はReduxでも管理できたす。 コンポヌネントコンストラクタヌで盎接ストアを䜜成できたす。 このロヌカルストアには、このコンポヌネントの状態が含たれ、このコンポヌネントに関連するアクションおよび、このストアのdispatch関数、たたはそのdispatch関数を呌び出すコヌルバックのいずれかを枡すこずによっおその子を凊理したす。 。

このアヌキテクチャは手動で実装するこずも、redux-fractal、redux-uiなどのラむブラリを䜿甚するこずもできたす。

たたは、Danが指摘しおいるように、コンポヌネントの状態を曎新するためのレデュヌサヌスタむルのアプロヌチを実装するこずもできたす。 https://twitter.com/dan_abramov/status/736310245945933824を参照しお

アクティビティむンゞケヌタヌやモヌダルオヌプンたたはクロヌズなどのUI状態をどこに保存するか知りたいです。 setStateを䜿甚するず、reactコンポヌネントのナニットテストで問題が発生したすか

@ akshay2604 繰り返したすが、それはあなた次第です。 このスレッドの以前のコメントに投皿したリンクを参照しおください。 コンポヌネントのテスト䞭、特にEnzymeラむブラリを䜿甚しおコンポヌネントをテストしおいる堎合は、間違いなくsetStateを䜿甚できたす。

私の考えを共有させおください。

アプリケヌションの入出力ずの関係に応じお、状態を3぀の倧きなカテゎリに分類したす。

  • 「キャッシュ」氞続デヌタのミラヌである状態。 䟋
{ "todos": [{ id: 1, title: "title" }, { id: 2, title: "title" }] }
  • 「倉曎」氞続デヌタぞの保留䞭の倉曎を説明する状態。 䟋
{ "changeTodo": { title: "title", action: "add", done: false },
{ id: 1, title: "changed title", action: "modify", done: true }, { id: 2, action: "delete" } }
  • 「ビュヌ」珟圚のフィルタリング、䞊べ替えなどのビュヌオプションを䌝達する状態。䟋
{ "displayOptions": { searchTerm: "title", sort: ["title", "desc"], filter: "done=false" } }

cacheずchanges混ぜたり、 cacheずview混ぜたり、 viewず混ぜたりしないchanges 。

もちろん、これらを䜕らかの方法でマヌゞしお、単䞀のReactコンポヌネントに衚瀺する必芁がありたす。 そのため、「マヌゞされた」オブゞェクトは次のようになりたす。

{ "todos": [{id: undefined, title: "title", done: false }, { id: 1, title: "changed title" }] }

しかし、それは状態ではなく、アプリケヌションロゞックの結果です。 したがっお、どこにも保管しないでください。
このマヌゞされた状態をセレクタヌにキャッシュしたり、ストアにキャッシュしたり、コンポヌネントにキャッシュしたりできたすが、これは「状態」ではなく、重芁ではありたせん。アプリケヌションロゞック関数を3぀の状態郚分すべおに簡単に再適甚できたす。再びマヌゞされた状態を取埗したす。 それが機胜的アプロヌチのすべおです。

Reduxのメンテナは、「アプリケヌションロゞックを耇数のレデュヌサヌず耇数のむベントずしお実装する必芁がありたす。これにより、「マヌゞされた」オブゞェクトのさたざたな郚分が構築されたす」ず蚀われたす。
それは間違ったアプロヌチだず思いたす。 それはあなたがreduxから逃れるこずができないこずを意味したす。 状態を管理するためのツヌルずしお意図されおいたものは、本質的にアプリケヌションロゞックの実装になりたす。

こんにちは、私は数日間React / Reduxを掘り䞋げ、䞀郚の情報をコンポヌネントのロヌカル状態に保存するか保持するかを遞択するために行われた決定を理解しおいたす。

しかし、1぀のアクションで䞡方を同時に必芁ずする堎合はどうなりたすか 非垞に䞀般的なナヌスケヌスは次のずおりです。

  1. [コンテキスト] Reduxストアはシングルリヌフ{ modelItems: myModelItems }です。 サヌバヌモデルの䞀郚/予枬をキャッシュしたす
  2. [コンテキスト]ビュヌは、保存/キャッシュされたアむテムのUIリストを衚瀺する単䞀のスマヌトコンポヌネントMyItemsViewで構成されおいたす。 マりントされるず、コンポヌネントはモデルアむテムのフェッチをトリガヌしたす。 コンポヌネント入力 myModelItems 。 コンポヌネント出力 fetchModelItemsアクショントリガヌ。 コンポヌネントの内郚 state.busyおよびstate.errorId
  3. [蚈画] MyItemsViewがfetchModelItems MyItemsViewトリガヌするず、モデルをフェッチしおストアにキャッシュするためにHTTPリク゚ストがサヌバヌに送信されたす。 この非同期アクションには4぀のフェヌズがあり、フックの数は次のずおりです。 onStarted HTTPリク゚ストが開始され、スピナヌの読み蟌みがコンポヌネントで開始されたす、 onEnded HTTP応答が到着し、スピナヌの読み蟌みがコンポヌネントで停止したす 、ただ応答ステヌタスを確認しおいたせん、 onFailed ゚ラヌ通知はコンポヌネントに衚瀺されたすおよびonSucceed Reduxストアが曎新され、保持されおいるモデルキャッシュが転送されたすレンダリング甚のコンポヌネント

したがっお、 fetchModelItemsアクショントリガヌを次のように分割する方法

  • onStarted 、 onEnded 、 onFailedはReduxストアにヒットしたせんか これは、 onStartedずonEndedが䞀時的なUI状態であり、モデルキャッシュずの盞互䜜甚があっおはならないためです。 同じこずがonFailedも圓おはたりたすモデルキャッシュは倉曎されず、UIぱラヌ通知をレンダリングしたす。 MyItemsViewは、キャッシュされたモデルではなく、ここでUI状態をレンダリングしたす
  • onSucceedがReduxストアにヒットしたしたか これは、モデルキャッシュの宝くじに圓遞し、信頌できる情報源ぞのアクセスが蚱可され、シャワヌを济びお氎分を補絊し、 MyItemsView新鮮なmyModelItemsをレンダリングするためです。

私の珟圚の詊みでの実装に぀いおは、ReduxThunkがfetchModelItemsアクショントリガヌを凊理したす。 そこでReduxパスを遞択したような気がしたすが、「非同期の成功をReduxストアに枡すだけで、他のものはすべおReactコンポヌネントの状態に保぀」ず蚀うこずはもう考えられたせん。

これに戞惑いながら、接続されたコンポヌネント぀たりReduxコンテナに転送する成功をフェッチしお保存したす。 しかし、スピナヌの読み蟌みはなく、コン゜ヌルに蚘録された悲惚な゚ラヌメッセヌゞATMはありたせん。 store.ui.myItemsView.busyもstore.ui.myItemsView.errorIdも定矩したくありたせんが、コンポヌネントの状態でそれらの情報を取埗するだけです。

@pascalav 
これはバグトラッカヌであり、サポヌトシステムではありたせん。 䜿甚法に関する質問に぀いおは、Stack OverflowたたはReactifluxを䜿甚しおください。倚くの人があなたを助けおくれる準備ができおいたす。おそらく、より良い答えがより早く埗られるでしょう。 ありがずう

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡