我正在使用redux-saga
. 在代码yield* ReduxSaga.takeEvery('MY_ACTION', updatePorts);
中,我如何访问action
以获取其字段。
例如,我有一个动作创建者:
function status(){
type: 'MY_ACTION',
status: true
}
如何action.status
从我的传奇访问?还是我只能通过getState()
和select访问数据?
我正在使用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 不是将操作推送到处理程序任务,而是自行拉动操作。看起来 Saga 正在执行一个正常的函数调用 action = getNextAction() ,它将在调度操作时解决。
在这里阅读更多:https ://redux-saga.js.org/docs/advanced/FutureActions.html
通常你可能有一个 root saga 或 index saga,你可以有一个带有 yield all 的 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),
]);
}