redux toolkit 1.5.1 进行深度复制,但是从 8.0.4 immer 生成的 calling produce 在 react-native 中不起作用 android

redux toolkit 1.5.1 does deep copy, but caling produce from 8.0.4 immer not working in react-native android

我测试了 immer 库中的 produce 方法,并尝试使用未导入的导入 immer/es5。执行 import immer 工作正常,但深层复制失败,因为以下代码“修改了初始对象”

const child = new Child("dean", "child")
const initialState = new Person("John", "Doe", 50, "blue", child);

const nextState = produce(initialState, draft => {
  initialState.child.firstName = "Bob"
})

console.log("compare object identity="+ (nextState === initialState))

console.log("next="+JSON.stringify(nextState))
console.log("initial="+JSON.stringify(initialState))

现在,然后我使用 redux-toolkit 的 createReducer 函数,这个函数工作正常并且在不修改原始初始数据的情况下进行深度复制

  const child = new Child("dean", "child")
  const initialState = new Person("John", "Doe", 50, "blue", child);

  const modifyAction = createAction('modify2')

  const counterReducer = createReducer(initialState, (builder) => {
    builder
      .addCase(modifyAction, (state, action) => { state.child.firstName = "Bob" })
  })

  const nextState = counterReducer(initialState, { type: 'modify2' })

  console.log("compare object identity="+ (nextState === initialState))

  console.log("next="+JSON.stringify(nextState))
  console.log("initial="+JSON.stringify(initialState))

我希望能够使用有时 'outside of reducers' 有效的生产方法,以防我需要修改状态。我不确定在哪里可以找到正确的。我试着查看 redux-toolkit 代码,但不确定如何追踪它(这是一个很高兴知道的另一个问题)。

谢谢, 院长

const nextState = produce(initialState, draft => {
  initialState.child.firstName = "Bob"
})

您正在更新错误的变量。您需要更新 draft,但您正在更新 initialState。应该是:

const nextState = produce(initialState, draft => {
  draft.child.firstName = "Bob"
})