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

TypeScript中Redux数组对象更新:解决Proxy访问无法查找的问题

Redux Toolkit中Proxy数组的更新方案

Redux Toolkit里的state是Immer包装的Proxy对象,控制台显示Proxy(Array)是正常现象——这是Immer用来实现「可变写法做不可变更新」的机制,不用把它转成普通数组再操作,直接按常规数组逻辑修改就行。

正确编写updateItem reducer

假设你要根据Id匹配更新数组里的对象,或者不存在就添加,代码可以这么写:

import { createSlice, PayloadAction } from '@reduxjs/toolkit';

interface iItem {
  Category: string;
  Id: string;
}

interface iDataState {
  Items: Array<iItem>;
}

const initialState: iDataState = {
  Items: [],
};

const dataSlice = createSlice({
  name: 'data',
  initialState,
  reducers: {
    updateItem: (state, action: PayloadAction<iItem>) => {
      // 找到目标项的索引
      const targetIndex = state.Items.findIndex(item => item.Id === action.payload.Id);
      
      if (targetIndex !== -1) {
        // 存在则替换
        state.Items[targetIndex] = action.payload;
      } else {
        // 不存在则追加(按需选择)
        state.Items.push(action.payload);
      }
    },
  },
});

export const { updateItem } = dataSlice.actions;
export default dataSlice.reducer;

关于Proxy的说明

Immer会把state包装成Proxy,让你可以用state.Items[xxx] = ...或者push这种「可变」写法,底层自动转换成符合Redux要求的不可变更新。你完全不需要手动处理Proxy,直接操作state.Items即可。

如果想在控制台看真实的数组内容,可以用console.log(JSON.parse(JSON.stringify(state.Items))),但开发中没必要这么做,按正常逻辑写更新代码就好。

内容的提问来源于stack exchange,提问作者Heath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:25:27