为了账号安全,请及时绑定邮箱和手机立即绑定

调度新的 redux 操作时如何正确删除对象子字段?

调度新的 redux 操作时如何正确删除对象子字段?

慕斯王 2023-07-29 16:04:17
我想知道删除 redux 操作中的嵌套字段的正确方法是什么。例如,我有这样的代码:const SUBSCRIBE = 'SUBSCRIBE';const UNSUBSCRIBE = 'UNSUBSCRIBE';export default function reducer(state = {}, action) {  const {    productName,    products,    componentName  } = action;  switch (action.type) {    case UNSUBSCRIBE: {      if (state[productName]?.[componentName]) {        const newState = { ...state };        delete newState[productName][componentName];        return newState;      } else {        return state;      }    }    default:      return state;  }}export function unsubscribe(productName, componentName) {  return {    type: UNSUBSCRIBE,    productName,    componentName  };}在UNSUBSCRIBE操作中,我删除了newState[productName][componentName]字段,但这也将删除“旧”状态的字段。因此,从理论上讲,如果有其他操作使用该字段,则它们可能会丢失,因为状态已发生突变。我应该将旧状态深度复制到newState然后删除吗newState[productName][componentName]?
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

您可以执行以下两项操作之一:


创建状态的副本并从该副本中productName删除componentName

if (state[productName]?.[componentName]) {

  const newProductState = { ...state[productName] };

  delete newProductState[componentName];

  return {

    ...state,

    [productName]: newProductState

  };

} else {

  return state;

}

您可以将其标记为未定义,而不是删除componentName(我个人更喜欢这样做)

if (state[productName]?.[componentName]) {

  return {

    ...state,

    [productName]: {

      ...state[productName],

      [componentName]: undefined,

    },

  };

} else {

  return state;

}


查看完整回答
反对 回复 2023-07-29
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信