typescript State是一个数组,但我无法在redux中读取它或基于此数组的值进行更新,它输出Proxy而不是[duplicate]

oxf4rvwz  于 2023-01-10  发布在  TypeScript
关注(0)|答案(1)|浏览(136)
    • 此问题在此处已有答案**:

How do I see state when logging to the console instead of Proxy object inside reducer action?(4个答案)
昨天关门了。
因此,我有一个需要更新状态数组的reducer。状态数组应该是:

[{productId: number; quantity: number}, ...]

在这里,我匹配对象id,如果它已经存在,我需要更新数量,如果不存在,我需要将整个对象推入数组。为了实现这一点,我尝试了map、filter等多种方法。推入状态中的第一个元素总是可以的,但要更新计数或添加新元素,无论我尝试了什么,都不会将状态作为对象数组,相反,它代理数组。
对象变为:

Proxy{
 [[Handler]]: null
 [[Target]]: null
 [[IsRevoked]]: true
 [[Prototype]]: Object
}

以下是最新的尝试:

const initialState: CartProduct[] = [];

const updateCart = (state: CartProduct[], payload: CartProduct) => {
  const tempState = [...state, payload];
  console.log({ tempState });
  return tempState;

export const countReducer = createSlice({
  name: "cart",
  initialState,
  reducers: {
    increaseQuantity: (state, action) => {
      if (!state.length) {
        return updateCart(state, action.payload);
      }
      const index = state.findIndex(
        (item) => item.productId === action.payload.productId
      );
      const newState = state;
      newState[index].quantity = newState[index].quantity + 1;
      console.log(newState); //gives Proxy again

      // updateCart(newState, action.payload); //gives proxy as object in array
     
    },
  },
});

我之前尝试过:

increaseQuantity: (state, action) => {
      if (!state.length) {
        return updateCart(state, action.payload);
      }
      const newState = state.map((product) => {
        if (product.productId === action.payload.productId) {
          console.log("i increase count");
          return { ...product, quantity: product.quantity + 1 };
        }
        return product
      });
      return updateCart(newState, action.payload);
    },
e3bfsja2

e3bfsja21#

您直接命中state。这不是一个好的做法:const newState = state
您总是必须对状态进行浅拷贝,然后更新它,并设置新状态。
以下是更新数量的示例:

const newState = state.map((item) => {
  if (item.productId === action.payload.productId) {
    return {
      ...item,
      quantity: item.quantity + 1,
    };
  }
  return item;
});

相关问题