- 此问题在此处已有答案**:
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);
},
1条答案
按热度按时间e3bfsja21#
您直接命中
state
。这不是一个好的做法:const newState = state
您总是必须对状态进行浅拷贝,然后更新它,并设置新状态。
以下是更新数量的示例: