【问题标题】:Redux - handling really large state objectRedux - 处理非常大的状态对象
【发布时间】:2021-03-20 21:21:04
【问题描述】:

我有一个简单的 react + flask 应用程序。 我想在用户单击按钮时加载一些数据(~10mb),然后使用这些数据。 因为两个不同的组件必须与这些数据交互,所以我认为使用 redux 将数据保存为全局状态。

我基本上有两个组件:

  1. 有一个按钮,可以调用一个动作来从烧瓶服务器加载大数据(并将该数据保存到全局 redux 状态)
  2. 使用数据(来自全局状态)

一旦我这样做了,我得到“SerializableStateInvariantMiddleware 花费了 509 毫秒,超过了 32 毫秒的警告阈值。”,这让我觉得这不是正确的做法。

处理此类事情的正确方法是什么? 我是否应该保持不同的较小状态(所以我知道单击了“加载数据”按钮),并从第二个组件读取该状态,然后才将数据加载到私有状态? (检查全局状态是否改变,如果改变了,调用一个动作并将数据保存在私有状态?)

【问题讨论】:

  • 使用lazy loadingVitualized Data

标签: reactjs redux


【解决方案1】:

不,没关系。 只有SerializableStateInvariantMiddlewareImmutableStateInvariantMiddleware 在开发模式下处于活动状态,它们会遍历所有这些以检查所有内容是否可序列化,并且没有任何内容被意外修改。

正常大小的状态没问题,在你的情况下显然是这样。但是您可以在存储大量数据的路径中禁用这两个中间件。

https://redux-toolkit.js.org/api/getDefaultMiddleware#customizing-the-included-middlewarehttps://redux-toolkit.js.org/api/immutabilityMiddlewarehttps://redux-toolkit.js.org/api/serializabilityMiddleware

所以你的 configureStore 看起来像


const store = configureStore({
  // ...
  middleware: (getDefaultMiddleware) => getDefaultMiddleware({
    immutableCheck: { ignoredPaths: ['some.nested.path'] },
    serializableCheck: { ignoredPaths: ['some.nested.path'] }
  })
})

【讨论】:

  • 谢谢!只是一个小问题,数据存储在redux全局状态中,那么我怎么知道这些数据的实际路径是什么?
  • 在不知道该路径的情况下如何使其脱离全局状态?
【解决方案2】:

我将详细说明@phry 的出色回答。

您可以增加超时时间,而不是配置忽略的路径:

const store = configureStore({
  // ...
  middleware: (getDefaultMiddleware) => getDefaultMiddleware({
    immutableCheck: { warnAfter: 128 },
    serializableCheck: { warnAfter: 128 },
  })
})

或完全关闭检查:

const store = configureStore({
  // ...
  middleware: (getDefaultMiddleware) => getDefaultMiddleware({
    immutableCheck: false,
    serializableCheck: false,
  })
})

来源:https://redux-toolkit.js.org/api/serializabilityMiddleware

【讨论】:

    【解决方案3】:

    我在解决方案检查文档下面遇到了同样的问题,你可以看到我是如何解决的

        export const store = configureStore({
          reducer: {
            // Add the generated reducer as a specific top-level slice
            [MusicApi.reducerPath]: MusicApi.reducer,
          },
          // Adding the api middleware enables caching, invalidation, polling,
          // and other useful features of `rtk-query`.
          middleware: (getDefaultMiddleware) =>
            getDefaultMiddleware({
              immutableCheck: false,
              serializableCheck: false,
            }).concat(MusicApi.middleware),
        });

    https://www.npmjs.com/package/redux-immutable-state-invariant https://redux-toolkit.js.org/api/serializabilityMiddleware

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多