我正在使用redux-saga
。在代码yield* ReduxSaga.takeEvery('MY_ACTION', updatePorts);
中,如何访问action
以获取其字段。
例如,我有一个动作创建者:
function status(){
type: 'MY_ACTION',
status: true
}
如何从我的传奇中访问action.status
?或者我是否必须仅通过getState()
和select访问数据?
答案 0 :(得分:26)
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
答案 1 :(得分:2)
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 :(得分:0)
通常你可能有一个根传奇或索引传奇,并且你可以拥有一个带有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),
]);
}