_redux-saga
_を使用しています。コードyield* ReduxSaga.takeEvery('MY_ACTION', updatePorts);
でaction
にアクセスしてフィールドを取得するにはどうすればよいですか。
たとえば、アクションクリエーターがいます。
_function status(){
type: 'MY_ACTION',
status: true
}
_
佐賀から_action.status
_にアクセスするにはどうすればよいですか?または、getState()
および select を介してのみデータにアクセスする必要がありますか?
const actionCreator=()=>({
type: 'MY_ACTION',
status:true
})
function* updatePorts(action) {
console.log(action.status)
}
function* watchUpdatePorts() {
yield* takeEvery('MY_ACTION', updatePorts)
}
https://github.com/redux-saga/redux-saga/tree/master/docs/api#takeeverypattern-saga-args
const actionCreator = () => ({
type: 'MY_ACTION',
status: true
})
function* updatePorts() {
while (true) {
const { status } = take('MY_ACTION');
// ...
}
}
このようなこともできます。 redux-sagaのドキュメントには、利点に関する優れた説明があります。
Takeの使用は、コードの記述方法に微妙な影響を及ぼします。 takeEveryの場合、呼び出されたタスクは、いつ呼び出されるかを制御できません。それらは、一致するアクションごとに何度も呼び出されます。また、いつ観測を停止するかについても制御できません。
テイクの場合、コントロールが反転します。アクションがハンドラータスクにプッシュされる代わりに、佐賀はそれ自体でアクションをプルしています。 Sagaが通常の関数呼び出しaction = getNextAction()を実行しているように見えます。これは、アクションがディスパッチされると解決されます。
詳細はこちら: https://redux-saga.js.org/docs/advanced/FutureActions.html
通常、ルートサガまたはインデックスサガがあり、次のようにすべてのyieldを持つinitジェネレーターを使用できます。
//in your action creator
const actionCreator = () => ({
type: 'MY_ACTION1',
status: true
});
//in your saga file, you will receive 'action' and then you can destructure it to status if you want.
function* updateDataForAction1({ status }) {
//use value of status
}
//in your root saga file
export function* watchInit() {
yield all([
takeEvery('MY_ACTION1', updateDataForAction1),
takeEvery('MY_ACTION2', updateDataForAction2),
takeEvery('MY_ACTION3', updateDataForAction3),
]);
}