无法从Redux store中删除对象,报错state.transactions为undefined
问题原因
你的transactionSlice的初始状态直接定义为交易记录数组,而非包含transactions属性的对象,state本身就是交易数组,不存在state.transactions字段,因此调用state.transactions.filter时会抛出未定义错误。同时deleteTransaction返回了带transactions属性的对象,会直接篡改后续state的结构,和addTransaction里直接调用state.push的逻辑也存在冲突。
修复方案
方案1:保持初始状态为数组结构(推荐,适配现有addTransaction逻辑)
直接修改deleteTransaction的逻辑,直接返回过滤后的新数组即可,无需包裹对象:
import { createSlice } from "@reduxjs/toolkit"; const transactionSlice = createSlice({ name: 'transactions', initialState: [ {id: 1, text: 'shady', amount: 55}, {id: 2, text: 'shady', amount: 55}, {id: 3, text: 'shady', amount: 55} ], reducers: { addTransaction: (state, action) => { const newTransaction = { id: Math.floor(Math.random() * 100000), text: action.payload.text, amount: +action.payload.amount } state.push(newTransaction); }, deleteTransaction: (state, action) => { // 直接返回过滤后的新数组即可 return state.filter(transaction => transaction.id !== action.payload.id) } } }) export const { addTransaction, deleteTransaction } = transactionSlice.actions; export default transactionSlice.reducer;
方案2:调整初始状态为对象结构(适合后续扩展其他状态字段)
如果后续需要在该slice下添加其他状态字段,可以把初始状态改为对象格式,同步修改两个reducer的逻辑:
import { createSlice } from "@reduxjs/toolkit"; const transactionSlice = createSlice({ name: 'transactions', initialState: { transactions: [ {id: 1, text: 'shady', amount: 55}, {id: 2, text: 'shady', amount: 55}, {id: 3, text: 'shady', amount: 55} ] }, reducers: { addTransaction: (state, action) => { const newTransaction = { id: Math.floor(Math.random() * 100000), text: action.payload.text, amount: +action.payload.amount } state.transactions.push(newTransaction); }, deleteTransaction: (state, action) => { state.transactions = state.transactions.filter(transaction => transaction.id !== action.payload.id) } } }) export const { addTransaction, deleteTransaction } = transactionSlice.actions; export default transactionSlice.reducer;
注意:使用该方案后,你读取交易列表的逻辑也要对应修改为state.transactions.transactions,第一级是slice的name对应的key,第二级是状态里的transactions字段
内容的提问来源于stack exchange,提问作者Saady Ashraf
相关产品推荐
相关产品推荐

