【问题标题】:Redux, storing data outside of redux storeRedux,将数据存储在 redux store 之外
【发布时间】:2016-10-17 02:55:52
【问题描述】:

我正在制作一个日历应用程序。

当用户导航到下个月时, 我想启动操作来获取数据。

要触发的动作列表本质上是动态的,它取决于当前安装的组件。

我目前正在将要触发的操作列表存储在列表中(在模块中)

我觉得通过将数据存储在 redux 存储之外,我正在做一些不传统的事情。
但我在某处读到 redux 商店应该保存可序列化的东西。而且我的动作(实际上是 redux-thunk 将使用的动作创建者)不可序列化。

所以问题是,

  1. 将数据存储在 redux 存储之外是不是一个坏主意,如果是,为什么?
  2. 为什么在 redux 存储中存储不可序列化的数据是个坏主意?

动作创建者(我存储在列表中)如下所示

function foo(params) {
  var url = "some-url"
  return (dispatch, getState) => {
     fetch(url, params).then(..).then(dispatch(someAction))
  }
}

【问题讨论】:

    标签: redux redux-thunk


    【解决方案1】:

    您的列表不是数据,而是代码。这是一个命令列表,实际上是所有代码。您可以将其存储在州外。

    但您的列表应该是 JavaScript。您可以使用if 进行分支,并使用switch 实现复杂的图灵完备动态。它可能应该只是一个 thunked 动作创建者。

    至于为什么你的状态应该是可序列化的:这样你就可以序列化它。有些工具和模块需要状态可序列化,但它是可选的。但是,它会强制您的状态为数据。

    也就是说,当使用 Immutable.js 时,状态现在是一个复杂的对象。你仍然可以序列化它,但不能使用JSON.stringify。因此,如果您可以编写一个函数,任何可以序列化状态的函数,您就可以声称状态是可序列化的。

    【讨论】:

      【解决方案2】:

      虽然从技术上讲,您当前采用的方法没有任何“错误”,但它有点反模式。通常,如果您想根据某些条件执行某些逻辑,您不会将要调用的函数存储在数组中。你当然会使用ifswitch,正如上面的答案所指出的那样,所以你不应该在这里这样做。

      为什么不为异步操作添加一个中间件,并让它在用户导航到下个月时接收调度的操作。这个中间件会为这个动作调用一个处理程序,你可以在其中调度你想要的其他动作。无论如何,这对我来说似乎更干净。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-10
        • 2018-06-12
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 2019-08-16
        相关资源
        最近更新 更多