web-dev-qa-db-ja.com

sagaからaction.paramsを取得する方法

_redux-saga_を使用しています。コードyield* ReduxSaga.takeEvery('MY_ACTION', updatePorts);actionにアクセスしてフィールドを取得するにはどうすればよいですか。

たとえば、アクションクリエーターがいます。

_function status(){
  type: 'MY_ACTION',
  status: true
} 
_

佐賀から_action.status_にアクセスするにはどうすればよいですか?または、getState()および select を介してのみデータにアクセスする必要がありますか?

12
Amio.io
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

28
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

2
dmwong2268

通常、ルートサガまたはインデックスサガがあり、次のようにすべての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),
    ]);
}
0
dillip pattnaik