在 Redux 中更新嵌套对象的 属性

Update nested object's property in Redux

我的 Redux 状态具有以下结构:

const state = {
 transactions: {
    1: {
       TransactionId: 1, Status: "Pending", Type: "Withdrawal", ClientName: "Paul Carter", Amount: ".43"
    },

    2: {
      TransactionId: 2, Status: "Completed", Type: "Refill", ClientName: "Caldwell Reid", Amount: ".16"
  },
...
}

鉴于我有一个 id,update/delete 来自 transactions 的对象的正确方法是什么?

以下是我尝试在 reducer 中更新 Status 属性 的方法,但它似乎没有用,我的状态保持不变。

const transactionsReducer = (state, action) => {
    case CHANGE_TRANSACTION_STATUS:
      return {
        [state.transactions[action.id].Status]: action.status
       }
}

给你,它应该看起来像这样:

如果您直接在 state 中获取 transactions 对象 :

return {
    ...state,
    [action.id]: {
        ...state[action.id] ,
        Status : action.status
    }
}

如果没有那么,你需要使用这个:

return {
    ...state,
    transactions : {
        ...state.transactions ,
        [action.id]: {
            ...state.transactions[action.id] ,
            Status : action.status
        }
    }
}

你可以这样做:

const transactionsReducer = (state, action) => {
  switch (action.type) {
    case CHANGE_TRANSACTION_STATUS:
      return {
        ...state,
        transactions: {
          ...state.transactions,
          [action.id]: {
            ...state.transactions[action.id],
            Status: action.status
          }
        }
      }
  }
}

另外,我个人认为,这里属性的名字最好使用小写,以免出错。示例:

transactionId: 1, status: "Pending", type: "Withdrawal", clientName...

transactions 应该是一个数组(它是实体的集合)。 'id' 键是多余的,它已经由 'TransactionId' 表示(单一事实来源)。 像这样:

const state = {
 transactions: [
     {
       TransactionId: 1, Status: "Pending", Type: "Withdrawal", ClientName: "Paul Carter", Amount: ".43"
    },

     {
      TransactionId: 2, Status: "Completed", Type: "Refill", ClientName: "Caldwell Reid", Amount: ".16"
  },
...
]

那么你可以简单地使用过滤器删除和映射更新:

return {
    ...state,
    transactions: state.transactions.filter(txn => txn.TransactionId !== action.deletedId)
}