链接两个redux动作并在第二个动作中使用更新状态

时间:2018-03-31 18:46:48

标签: javascript reactjs redux react-redux

我认为我遇到了一个简单的问题,为此我也可能有一个解决方案,但我不知道"质量"我的想法。

基本上,在我的状态下,我有一个数组属性,我需要在发送另一个动作之前更新。

让我们假设我的状态是这样的:

const state = {
    arrayProperty: []
}

我有一个像这样的简单动作:

const ADD_VALUE = "ADD_VALUE"
const addValue = value => ({
    type: ADD_VALUE,
    value
})

为了回应这个动作,在我的减速机中,我只有:

...
case ADD_VALUE:
    return update(state, { arrayProperty: { $push: [action.value] }})
...

我还有一个动作可以将这个状态与服务器同步,就像这样(显然我跳过了一些部分):

const SAVE = "SAVE"
const save = model => dispatch =>
    API
      .save(model)
      .then(
          response => dispatch(saved(response))
      )

const SAVED = "SAVED"
const saved = response => ({
    type: SAVED,
    response
})

我的问题是我想调用之前的操作,但我不知道如何在第一个操作之后获取更新后的状态,并将其传递给第二个操作。

我尝试了这个(并且它有效),但我不确定这是否是正确的方法:

const addValueAndSave = value => (dispatch, getState) => {
    dispatch(addValue(value))
    dispatch(save(getState()))
}

结束我的问题......这是正确的做法吗?

谢谢大家!

1 个答案:

答案 0 :(得分:0)

据我所知,你做得对!在您要发送thunks操作时savegetState将调用最新状态,这正是您想要的。现在只是为了它,你可以让整个事情只有一个异步的动作。因此,如果您的API调用失败(如果这是所需的行为),您可以执行乐观更新并还原它们。只是举个例子:

function addValue(value) {
  return (dispatch, getState) => {
    dispatch({
      type: ADD_VALUE,
      value,
    });

    API.save(getState()).catch(() => {
      alert('Something went wrong, try again later.');
      dispatch({
        type: REMOVE_VALUE,
        value,
      });
    });
  };
}

或者您甚至可以创建一个中间件来为您执行特定操作,但这是完全不同的事情。我希望我可以给你一些关于你的选择的观点,但总的来说你做得对;)