You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:48:01