如何从传奇中获取action.params

时间:2016-07-27 06:36:27

标签: javascript redux state redux-saga

我正在使用redux-saga。在代码yield* ReduxSaga.takeEvery('MY_ACTION', updatePorts);中,如何访问action以获取其字段。

例如,我有一个动作创建者:

function status(){
  type: 'MY_ACTION',
  status: true
} 

如何从我的传奇中访问action.status?或者我是否必须仅通过getState()select访问数据?

3 个答案:

答案 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),
    ]);
}