【问题标题】:How to control a boolean in redux?如何在 redux 中控制布尔值?
【发布时间】:2020-12-13 12:04:04
【问题描述】:

似乎我无法分派布尔值。谁能告诉我我做错了什么?

这是我的状态:

const initState = {
  allSongs: songData(),
  currentSong: { ...songData()[0] },
  isPlaying: false,
};

如何用dispatch函数控制isPlaying当我这样dispatch时,它不起作用:

      dispatch(playAndPause(true));

这是我的动作创建者:

export const playAndPause = (isPlayingBool) => (dispatch) => {
  return {
    type: PLAY_AND_PAUSE,
    payload: {
      isPlaying: isPlayingBool,
    },
  };
};

减速机:

case PLAY_AND_PAUSE:
      return {
        ...state,
        isPlaying: action.payload.isPlaying,
      };

【问题讨论】:

  • 你能告诉我们你改变状态的代码吗?
  • @SinanYaman 是的,我编辑了帖子以包含它。

标签: javascript reactjs redux react-redux switch-statement


【解决方案1】:

playAndPause 不是普通的动作创建者,而是一个 thunk 动作创建者。 最里面的函数将被调用并允许您在实际调度之前执行异步操作。如果您走那条路,那么正确的方式应该是

export const playAndPause = (isPlayingBool) => (dispatch) => {
  // do some stuff here
  dispatch({
    type: PLAY_AND_PAUSE,
    payload: {
      isPlaying: isPlayingBool,
    },
  });
};

但实际上,您可能想要一个普通的动作创建者:

export const playAndPause = (isPlayingBool) => ({
  type: PLAY_AND_PAUSE,
  payload: {
    isPlaying: isPlayingBool,
  },
});

另外,请注意,您在这里编写了一种非常古老的 redux 风格。如果你现在正在学习 redux,请停止你正在学习的任何教程,转而关注the official tutorials。 最后,您将使用当前使用的样式编写大约 1/4 的代码。

例如,现代 redux 不需要您编写任何动作创建器或动作类型常量。它也没有 switch...case 减速器或减速器中的不可变逻辑。

【讨论】:

  • 感谢您让我了解新样式。我查看了它并将我的 redux 文件转换为这种样式。但是实现 thunk 有点令人困惑。你能告诉我你会如何写一个新风格的thunk action creator吗?我应该遵循本教程来达到这个目的吗? redux-toolkit.js.org/api/createAsyncThunk
  • 您仍然可以使用正常的 thunk,这是完全有效的。如果您的 thunk 在开始时发送某种 started 操作并在结尾发送 successerror 操作,createAsyncThunk 将为您执行此操作。
猜你喜欢
  • 2015-06-24
  • 2021-11-03
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多