Javascript 尽管Object.assign和Spread语法不同,但对象在Redux中会发生变化

Javascript 尽管Object.assign和Spread语法不同,但对象在Redux中会发生变化,javascript,reactjs,typescript,redux,redux-saga,Javascript,Reactjs,Typescript,Redux,Redux Saga,我在Redux传奇中有一个生成器函数,它获取一个ID,获取一个状态,并发送一个带有状态的操作,而没有包含匹配ID的对象键。它应该替换的减速器中的对象未发生突变,如下所示: function* removeExerciseAsync(action: any) { const { currentDate, currentYear }: DateState = yield select((state: AppState) => state.date); const years = yie

我在Redux传奇中有一个生成器函数,它获取一个ID,获取一个状态,并发送一个带有状态的操作,而没有包含匹配ID的对象键。它应该替换的减速器中的对象未发生突变,如下所示:

function* removeExerciseAsync(action: any) {
  const { currentDate, currentYear }: DateState = yield select((state: AppState) => state.date);
  const years = yield select(selectYears);

  const dayOfYear = currentDate.dayOfYear();


  const newYearState: DaySummaryTypes = {
    ...years[currentYear],
    [dayOfYear]: {
      ...years[currentYear][dayOfYear]
    }
  };

  const exerciseId = action.payload;

  if (!newYearState[dayOfYear][exerciseId]) return;

  delete newYearState[dayOfYear][exerciseId];

  // const newState = omit(newYearState, `${dayOfYear}.${exerciseId}`);

  yield put(updateYearExercises({ [currentYear]: newState }));
}
{
[本年度]:{
[每年的某一天]:{
[应该删除的ID]:{}
},
},
};
当使用注释掉的delete操作符运行此函数时,它将改变redux和所有redux记录器(prev和after change)中的整个状态,并且我的选择器将返回以前的记忆版本,因为未检测到任何更改。我通过使用lodash Omit创建一个新对象来解决这个问题,但是有更快或<21kb的解决方案吗

function*removeExerciseAsync(操作:任意){
const{currentDate,currentYear}:DateState=yield select((state:AppState)=>state.date);
const years=收益率select(selectYears);
const dayOfYear=currentDate.dayOfYear();
const newYearState:DaySummaryTypes=Object.assign({},years[currentYear]);
const exerciseId=action.payload;
如果(!newYearState[dayOfYear][exerciseId])返回;
//删除newYearState[dayOfYear][exerciseId];
const newState=omit(newYearState,${dayOfYear}.${exerciseId});
收益率看跌期权(updateYearExercises({[currentYear]:newState}));
}

对象。assign
对对象进行浅层复制,表示顶层的对象不同,但嵌套对象仍然引用以前的对象。在这里,您正在对嵌套对象进行更改,该对象与位于redux存储中的对象具有相同的引用,因此会改变redux状态。您也可以尝试复制嵌套对象,如下所示:

function* removeExerciseAsync(action: any) {
  const { currentDate, currentYear }: DateState = yield select((state: AppState) => state.date);
  const years = yield select(selectYears);

  const dayOfYear = currentDate.dayOfYear();


  const newYearState: DaySummaryTypes = {
    ...years[currentYear],
    [dayOfYear]: {
      ...years[currentYear][dayOfYear]
    }
  };

  const exerciseId = action.payload;

  if (!newYearState[dayOfYear][exerciseId]) return;

  delete newYearState[dayOfYear][exerciseId];

  // const newState = omit(newYearState, `${dayOfYear}.${exerciseId}`);

  yield put(updateYearExercises({ [currentYear]: newState }));
}