これはさまざまな方法で実現できますが、どのようにアプローチすればよいか教えてください。のは、右のバットを離れてあなたの状態を見てみましょう - あなたが使用しているので、あなたがそのようなあなたの状態を分割しているレデューサーを組み合わせる:あなたは「サブ状態」のようなものにあなたのアプリを分割したいとき
{
pushMessages: { pushMessages state in here }
}
のでcombineReducersは素晴らしいですが、考えreduxはこのインスタンスではまだ単一のストアです。今のところ、pushMessages
の単一のサブ状態があります。
私はコンポーネントを取り上げて、それにメッセージを追加するアクションを設定します(最終的にはメッセージを削除するアクション)。私はimmutable.js
を使用しています。私はIMOと一緒に仕事をすることが好きです。IMOは、状態が不変でなければならないので、仕事をするのがいいです。だからここ
はあなたのレデューサーは以下のとおりです。
var pushMessageReducer = function(state = immutable.Map(), action) {
if (action && action.type) {
switch (action.type) {
case actions. RECEIVED_PUSH_MESSAGE:
return state.update('messages', immutable.List(),
(oldMessages) => oldMessages.push(action.PushMessage)
);
default:
return state;
}
}
return state;
}
それでは、これがそうのようにあなたの状態を設定されているん:
{
pushMessages: {
messages: [ ... all your messages pushed in here]
}
}
あなたが組み合わせを使用しているのでことはあなたのコンテナがそれのサブ状態に加入する必要がありますリデューサーあなたのコンポーネントにはメッセージの配列を持つthis.props.messages
があります。 (サブステートを購読していない場合はthis.props.pushMessages.messages
です。最後のアイテムを表示するには、このようなものが必要です(これはロダッシュを使用しています)。
constructor(props) {
super(props);
this.getLastMessage = this.getLastMessage.bind(this);
}
getLastMessage() {
return _.last(this.props.messages);
}
render() {
return(
<div>
Last Message : {this.getLastMessage())
</div>
);
}
リストにはすべてが含まれていて、最後のものだけが表示されることはありませんが(正確なビジネスロジックがわかりません)、簡単にREMOVE_PUSH_MESSAGE
アクションを追加してポップまたはスプライス(そして、_.lastなしでthis.props.messageを表示するだけでよい)。
編集:
ここでは、私はあなたのコンテナを設定する方法を示します。
import immutable from 'immutable';
import { connect } from 'react-redux';
import Component from './component';
import * as actionCreators from './action-creators';
function mapStateToProps(state) {
const normalizedState = state.get('pushMessageReducer', immutable.Map()).toJS();
return {
messages: normalizedState.messages
};
}
function mapDispatchToProps(dispatch, ownProps) {
return {
myAction: actionCreators.myAction.bind(null, dispatch)
};
}
export default function(component = Component) {
return connect(mapStateToProps, mapDispatchToProps)(component);
}
アプリがない限り、私は、私はこのコンテナで使用する状態の部分をつかむためにこれを使用、mapStateToPropsでnormalizedState
に気付くでしょうスマートコンポーネントが1つしかない場合、おそらくこれは行いません。これは、私がこのコンテナで使用している状態の部分(不変から)を取得します。あなたのケースでは、それはpushMessages
です。今接続したこのコンポーネントでは、あなたの商品にthis.props.messages
があるはずです。私はmapDispatchToProps
を使って自分のアクションをバインドします。なぜなら、アクションクリエイターにディスパッチできるからです。
結合コードが適切に接続されている(私はここでアクションを実行することがわかりませんでした)、RECEIVED_PUSH_MESSAGE
アクション作成者に新しいメッセージaction.PushMessage
を発射する必要があります。これは、コンポーネントのthis.props.messages
を更新するmapStateToPropsに接続します。これは、リスト内の最後の項目のみをレンダリングする必要があります。
ストアをクリアする必要はありません。あなたはPushMessageの減速機のコードを表示できますか? –
私はレデューサーを追加するように編集しました。ありがとう。 – LivingRobot
@ user5407287あなたは本当にあなたが盲目的にアクションの結果を渡すのではなく、あなたのレデューサーの状態で構造を持っている必要があります。減速機のポイントは、アクション結果をダンプする場所だけでなく、アクションにスマートに応答する明確な構造を持つことです。 –