在 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)
}
我的 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)
}