React-Redux:すべてのコンポーネントの状態をReduxストアに保持する必要があります


89

簡単な切り替えがあるとしましょう:

ボタンをクリックすると、色コンポーネントが赤と青の間で変化します

私はこのようなことをすることによってこの結果を達成するかもしれません。

index.js

Button: onClick={()=>{dispatch(changeColor())}}
Color: this.props.color ? blue : red

container.js

connect(mapStateToProps)(indexPage)

action_creator.js

function changeColor(){
 return {type: 'CHANGE_COLOR'}
}

reducer.js

switch(){
case 'CHANGE_COLOR':
return {color: true}

しかし、これは、jQuery、いくつかのクラス、および一部のcssを使用して5秒で達成できた何かのために作成する多くのコードの地獄です...

だから私が本当に求めていることは、ここで何が間違っているのでしょうか?


6
react-reduxはjqueryよりも短いものとして販売されていません。起動して実行するには、間違いなくコードが必要です。
zerkms 2016

1
こちらをご覧ください:github.com/rackt/redux/issues/1287この件に関しては多くの良い議論があります。
m0meni 2016

1
ありがとう@ AR7それは完璧です
l2silver

1
@ l2silver問題ありません。基本的には、そのコンポーネントの色が他の誰にとっても重要でない場合は、その状態をコンポーネント自体の内部に保持するという考え方です。
m0meni 2016

2
言及されたAR7の問題は移動しました:github.com/reactjs/redux/issues/1287
ptim

回答:


154

Reduxは主に「アプリケーションの状態」を対象としています。つまり、アプリケーションロジックに関連するすべてのものです。その上に構築されたビューはその状態を反映したものですが、その状態のコンテナーをすべてのために排他的に使用する必要はありません。

これらの質問をするだけです:この状態はアプリケーションの残りの部分にとって重要ですか?アプリケーションの他の部分は、その状態に基づいて異なる動作をしますか?多くのマイナーなケースでは、そうではありません。ドロップダウンメニューを使用します。開いているか閉じているかは、アプリの他の部分には影響しません。だから、あなたの店にそれを配線することはおそらくやり過ぎです。これは確かに有効なオプションですが、実際に利益をもたらすわけではありません。あなたはthis.stateそれを1日使ってそれを呼ぶほうがいいです。

あなたの特定の例では、アプリケーションの他の部分に違いをもたらすために、そのボタンの色が切り替えられていますか?それがアプリケーションの主要部分のある種のグローバルなオン/オフの切り替えである場合、それは間違いなくストアに属しています。ただし、ボタンをクリックしたときにボタンの色を切り替えるだけの場合は、色の状態をローカルで定義したままにすることができます。ボタンをクリックするアクションには、アクションディスパッチを必要とする他の効果が含まれる場合がありますが、それは、どの色にするかという単純な問題とは別のものです。

一般に、アプリケーションの状態をできるだけ小さく保つようにしてください。そこにすべてを押し込む必要はありません。あなたがしなければならないとき、または何かをそこに保持することが非常に理にかなっているときにそれをしてください。または、Dev Toolsを使用するときに生活が楽になる場合。しかし、その重要性に過度の負担をかけすぎないでください。


ねえ、私はこの質問に対する決定的な答えは決してないだろうことを知っていますが、あなたの論理はここで非常に健全であると思います
l2silver

3
正直に言って、私はそのフラックス/ reduxのものを使う意味が全くわかりません。イベント駆動型モデルの何が問題でしたか?
jayarjo

IMO、それは完璧な答えではありません。場合によります。UI状態を反応状態に格納すると、Reduxストアがクリーンになりますが、テストが困難な非機能コンポーネントになります。ui状態をreact状態に保存すると、追加のレデューサーを作成する必要があるため、開発に多くの労力が追加されます。ただし、UIの状態を格納しやすくするために役立つ多くのパッケージがあります。詳細については、redux.js.org / docs / faq / OrganizingState.htmlを確認してください。
Ron

19

Redux FAQ:組織の状態Redux
公式ドキュメントのこの部分は、あなたの質問によく答えました。

ローカルコンポーネントの状態の使用は問題ありません。開発者は、アプリケーションを構成する状態の種類と、各状態をどこに置くかを決定するのがあなたの仕事です。あなたのために働くバランスを見つけて、それで行きます。

Reduxに入れるデータの種類を決定するための一般的な経験則:

  • アプリケーションの他の部分はこのデータを気にしますか?
  • この元のデータに基づいて、さらに派生データを作成できるようにする必要がありますか?
  • 同じデータが複数のコンポーネントの駆動に使用されていますか?
  • この状態を特定の時点に戻すことができる(つまり、タイムトラベルデバッグ)ことに価値はありますか?
  • データをキャッシュしますか(つまり、データを再要求するのではなく、すでに存在する場合はその状態を使用します)?

6

@ AR7によって提供される素晴らしいリンクを強調する目的で、そのリンクが少し前に移動したため:

Reactは、アプリ全体に関係なく、複雑な方法で変化しない一時的な状態に使用します。たとえば、一部のUI要素のトグルはフォーム入力状態です。Reduxは、グローバルに重要な状態または複雑な方法で変化する状態に使用します。たとえば、キャッシュされたユーザーや投稿の下書き。

Redux状態からReact状態(何かをReduxに格納すると厄介になる)に、またはその逆(他のコンポーネントがローカルであった状態にアクセスする必要がある場合)に移動したい場合があります。

経験則としては、扱いにくいものは何でもしてください。

ダンアブラモフ:https : //github.com/reactjs/redux/issues/1287#issuecomment-175351978


-7

はい、すべてのコンポーネントの状態をRedux格納するように努力する価値があります。そうすることで、タイムトラベルデバッグや再現可能なバグレポートなど、Reduxの多くの機能を利用できます。そうしないと、それらの機能が完全に使用できなくなる可能性があります。

コンポーネントの状態の変更をReduxに保存しない場合、その変更はReduxの変更のスタックから完全に失われ、アプリケーションUIはストアと同期しなくなります。これが重要でない場合は、なぜReduxを使用するのかを自問してみてください。それがなければ、アプリケーションはそれほど複雑ではなくなります。

パフォーマンス上の理由から、this.setState()多くのアクションを繰り返しディスパッチするものにはフォールバックしたい場合があります。たとえば、ユーザーがキーを入力するたびにReduxに入力フィールドの状態を保存すると、パフォーマンスが低下する可能性があります。これはトランザクションのように扱うことで解決できます。ユーザーアクションが「コミット」されたら、最終状態をReduxに保存します。

元の投稿では、Reduxの方法が「大量のコードを書く地獄」であることに言及しています。はい。ただし、ローカルコンポーネントの状態などの一般的なパターンには抽象化を使用できます。


デバッグの改善はreduxの便利な目標であり優れた機能ですが、S / N比も重要だと思います。コードベース内のすべての変数をログに記録することもできますが、これにより多くのコードが追加されて実際のコードが読みにくくなり、ログを探すのが難しくなります。reduxを使用する場合も同じだと思います。すべての状態をreduxにすることでデバッグを改善できますが、追加のコードと抽象化には、コードの読み取りを困難にし、一部のデバッグタスクをさらに困難にするコストがかかります。(そして、redux開発ツールがクラッシュすると、デバッグの多くの
利点

1
では、なぜReduxを使用するのでしょうか。Reduxにすべてを入れないと、devtoolsなどのすべての機能が失われます。それは本当に全部か無かです。この投稿へのトップアンサーのように、ドロップダウンメニューにsetState()を使用する場合、ユーザーがドロップダウンメニュー内で発生する可能性のある問題をdevtoolsを使用してデバッグすることはできません。オーバーレイが表示される前と後にタイムトラベルする方法がないため、オーバーレイにsetState()を使用する場合はさらに悪くなります。ここにsetState()を振りかけると、開発者は何が壊れるかについて常に考えなければならないため、エラーが発生しやすくなります。
kumar303

質問が使用するかどうかについてですので、コードベース内のすべての変数をログに記録するなど、より具体的な回答は、役に立つ比喩ではありませんthis.setState()dispatch(action...)this.setState()どこでも使用する必要はありませんが、必要な場合は、代わりにReduxを99%のケースで使用し、this.setState()パフォーマンスの問題に基づいて1%にフォールバックすることをお勧めします。
kumar303

すべての変数をログに記録することは、すべてをReduxに配置することと類似しており、原則として同様に推奨されないようです。Reduxののうち、いくつかのことをままにしておくと、すべてのための機能を否定しない、長い状態が分離されるようReduxのでは。つまり、選択ボックスの状態がそうでない場合でも、Reduxを介してパイプされるAPI呼び出しロジックをデバッグできます。OPには要点があります。Reduxを使用するには複数の場所でより多くのコードが必要であり、リストされている特定の例ではそれが正当化されていない可能性があります。
JD Sandifer

実際には、APIロジックをデバッグできない場合があります。それが私のポイントです。タイムトラベルを中断するシナリオを予測するのは非常に難しいので、パフォーマンスの問題が発生するまで、すべての状態(選択ボックスの状態を含む)をReduxに置くことをお勧めします。
kumar303
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.