私はReduxを1ヶ月間使っていましたが、プロジェクトが本当に大きくなった場合、すべてのReducerのすべての値にアプリ全体を公開する必要はありません。一時的な状態を作成するか、コンポーネントの個別の状態を作成する良い方法はありますか?ReactReduxで一時的な状態を作成する方法は?
私はこれをすべて間違っていると思っていますか、それとも理由のためにこのように構成されていますか? Redux docsによれば
私はReduxを1ヶ月間使っていましたが、プロジェクトが本当に大きくなった場合、すべてのReducerのすべての値にアプリ全体を公開する必要はありません。一時的な状態を作成するか、コンポーネントの個別の状態を作成する良い方法はありますか?ReactReduxで一時的な状態を作成する方法は?
私はこれをすべて間違っていると思っていますか、それとも理由のためにこのように構成されていますか? Redux docsによれば
私は「すべての還元剤の価値」とみなして、アプリ状態全体を指しています。
あなたは確かにあなたの状態をスライスし、必要な部分だけを特定のコンポーネントに公開することができます。これは、react-redux
バインディングからのconnect
メソッドの目的です。 connect
は関数(例:mapStateToProps
)を受け取り、アプリ状態全体を取得し、プロキシとして指定した部分だけをreduxに「接続」しているコンポーネントに公開します。例えば
、あなたはシンプルで、ユーザーの名前とアドレスを示し、このようなコンポーネントリアクトがあるとします。
var myComponent = React.createClass({
render: function() {
return (
<div>{Name from redux state goes here}</div>
<div>{Address from redux state goes here}</div>
);
}
});
明らかにあなただけの作品、このコンポーネントにあなたの全体のアプリケーションの状態を送信する必要はありませんがユーザーの名前と住所を入力します。
// the "state" param is your entire app state object.
function mapStateToProps(state) {
return {
name: state.name,
address: state.address
}
}
var connectedComponent = connect(mapStateToProps)(myComponent);
が包まれmyComponent
が今効果的に次のようになります:
var myComponent = React.createClass({
propTypes: {
name: React.PropTypes.string // injected by connect
address: React.PropTypes.string // injected by connect
},
render: function() {
return (
<div>{this.props.name}</div>
<div>{this.props.address}</div>
);
}
});
:
アプリケーション全体の状態は 単一のストア内のオブジェクト・ツリーに格納されています。
1つの状態。 1つの店。それでおしまい。個々のコンポーネントには、より大きなアプリケーション状態によって通知されるローカル状態を作成できますが、その時点ではすでに存在するより大きな状態の一部をコピーするだけです。
複雑なアプリケーションでは、「スマート」コンポーネント全体を状態にすることはできません。あなたが100の減速機能を持っていても、connect a component to the storeの場合は、mapStateToProps
を使って、必要なアプリケーション状態の部分だけを選んでそれらのコンポーネントの小道具を作ることができます。だから、たとえあなたの心の裏に彼らが存在することを知っていても、あなたが使用していない国の部分すべてを見ることは決してありません。
これは本当に素晴らしいアーキテクチャパターンです。ある州ではsingle source of truthがあります。このため、アプリのどの部分でも古いデータがあることは不可能です。アプリケーションの状態を初期化し、すべてデータをロードしていないときは、の構造体のみを定義することに注意してください。したがって、開始時に構造全体を初期化することで、パフォーマンスが低下することはありません。また、アプリケーションの状態全体を単一のコンポーネントにロードすることは決してありません(必要がない限り)ので、あなたの小道具は常に管理しやすくなります。
いや、私は非常に多くの減速ファイルを避けるためにしようとしているので、あなたはそうのようconnect
を使用しています。私は1つの変数を格納する必要がある場合は、1つの場所でのみ使用されるこの些細な変数のための減速機を作成するために過剰な感じです。 –
tkiethanom
それは、些細な変数が何であるかによって異なります。それが本当にデータではないような旗や何かのものなら、それをローカルコンポーネント状態として作成することには害はありません。その日の終わりに、それはすべてjavascriptなので、あなたが望むものを何でも追加することができます。 Redux警察はありません。ただし、実際の*データ*を扱うときはいつでも、アプリケーション状態から細分化するのが最も理にかなっています。小さなアプリでは過度の気持ちだと思うかもしれませんが、私を信じて、これは本当にうまくスケーリングされ、あなたのデータはいつまでも新鮮でなければならないことを保証します。 –
まあ、Reduxの警察はありませんが、人々がそれを行うための適切な方法であると思うものについての示唆を得ることは有益です。だから私はおそらくちょうど 'setState'を私のコンポーネントでこれ用に使用します。 – tkiethanom
ええ、私はすでにこれをやっています。私は非常に多くのレデューサーファイルを避けようとしています。 1つの変数を1つのコンポーネントに格納する必要がある場合は、1つの場所でしか使用されないこの簡単な変数のための減速器を作成するには、過剰な使用のように感じます。 – tkiethanom
その問題に対処するには、コンポーネント自体にローカルで一時的な状態を保存し、 'setState'を使用することに戻りました。フライアウトが開いているかどうかのような些細なことを含め、アプリケーションの状態全体をあなたのレデューサー/店舗に入れてみると、理論的には素晴らしいように聞こえますが、物事がすぐに扱いにくくなることがわかりました。私は今、アプリ全体で共有する必要がある状態の店舗を使用しています。 –
はい、残りのアプリケーションと通信する必要のないコンポーネントに対しても 'setState'を使い始めると思います。 – tkiethanom