reactjs immutable.js如何与RTK(redux toolkit)一起使用?

drkbr07n  于 2023-06-22  发布在  React
关注(0)|答案(1)|浏览(152)

我正在将Redux代码迁移到RTK。
对于我的遗留代码库,我使用Immutable.js(出于不变性目的),我不再需要它来编写我将要编写的新代码,但我希望遗留代码在不接触它的情况下继续工作,同时使用RTK的configureStore。但我的应用程序抛出:
不变式失败:在路径“app._values._tail.array.0._values._root.array.0.array.16._defaultValues.gcm.__hash”中,在调度之间检测到状态突变。这可能会导致不正确的行为。(https://redux.js.org/style-guide/style-guide#do-not-mutate-state)
我明白了,这是因为我改变了对象示例,我可以禁用错误这样做:

immutableCheck: false,
serializableCheck: false,

但是IMO它禁用了太多,我想保持这些设置,但是对于Immutable.js来说,要绕过不变性检查。我发现了这段过时的代码,看起来像我想实现的

// Augment middleware to consider Immutable.JS iterables serializable
const isSerializable = (value) =>
  Iterable.isIterable(value) || isPlain(value)
const getEntries = (value) =>
  Iterable.isIterable(value) ? value.entries() : Object.entries(value)
const serializableMiddleware = createSerializableStateInvariantMiddleware({
  isSerializable: () => true // all values will be accepted
  isSerializable,
  getEntries,
})
const store = configureStore({
  reducer,
  middleware: [serializableMiddleware]
})

这里是https://github.com/reduxjs/redux-toolkit/pull/141/files,但它不工作,Iterable现在是Collection,没有isIterable功能,我试过isImmutable,但它也不工作。
现在文件看起来像这样:https://github.com/reduxjs/redux-toolkit/blob/master/docs/api/otherExports.mdx,没有Immutable.js的踪迹。
我该怎么办?

iklwldmw

iklwldmw1#

@EskiMojo14,RTK上的一个维护者能够为我找到一个解决方案:
serializableCheck和immutableCheck是两个独立检查,我们希望您使用getDefaultMiddleware对它们进行自定义。
例如,下面的代码(未经测试)可能会工作:

import { configureStore, isImmutableDefault, isPlain } from "@reduxjs/toolkit";
import { isImmutable } from "immutable";

const store = configureStore({
  reducer,
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      immutableCheck: {
        isImmutable: (value) => isImmutable(value) || isImmutableDefault(value),
      },
      serializableCheck: {
        isSerializable: (value) => isImmutable(value) || isPlain(value),
        getEntries: (value) =>
          isImmutable(value) ? value.entries() : Object.entries(value),
      },
    }),
});

相关问题