Reactjs 为什么伊默没有';即使我修改了草稿,你也不能给我一个新的状态吗?
我不知道为什么即使我修改了草稿,伊默尔也没有给我提供一个新的状态,而是提供了一个包含修改内容的旧状态实例Reactjs 为什么伊默没有';即使我修改了草稿,你也不能给我一个新的状态吗?,reactjs,redux,immer.js,Reactjs,Redux,Immer.js,我不知道为什么即使我修改了草稿,伊默尔也没有给我提供一个新的状态,而是提供了一个包含修改内容的旧状态实例 import CartItem from "../../models/cart-item"; import * as actions from "../actions/actionTypes"; import produce from "immer" const initialState = []; const reducer
import CartItem from "../../models/cart-item";
import * as actions from "../actions/actionTypes";
import produce from "immer"
const initialState = [];
const reducer = (state=initialState, action) => {
switch (action.type) {
case actions.ADD_TO_CART:
const {id, title, price} = action.product;
const itemIndexInCart = state.findIndex(item => item.id === id);
const nextState = produce(state, draftState => {
if (itemIndexInCart === -1) {
draftState.push(new CartItem(id, 1, price, title, price));
} else {
draftState[itemIndexInCart]['quantity']++;
draftState[itemIndexInCart]['sum'] += price;
}
});
console.log(state === nextState);
return nextState;
default:
return state;
}
};
export default reducer;
当新项被推入数组时,它会工作,但当我想要修改数组项的数量和总和时,它不会像预期的那样工作。日志告诉我在这种情况下它是同一个对象。根据。 请注意,console.logging草稿可能会打印“null”,即使该对象不是null
import {immerable} from "immer"
class Foo {
[immerable] = true // Option 1
constructor() {
this[immerable] = true // Option 2
}
}
Foo[immerable] = true // Option 3
工作演示:请注意
此外,您应该使用,这将使您简化现有的Redux逻辑。例如,此减速器可以写成:
const cartSlice=createSlice({
名称:“购物车”,
初始状态:[],
减速器:{
addToCart(州、行动){
const{id,title,price}=action.payload;
const item=state.find(item=>item.id==id);
如果(项目){
项目.数量++;
项目金额+=价格;
}否则{
state.push({id,价格,标题,数量:1});
}
}
}
})
也许您应该在product
回调中的draftState
中找到项目id。在product
回调中,尝试const-itemIndexInCart=draftState.findIndex(item=>item.id==id)代码>就在条件之前否,它不工作,实际上nextState已更新,但不知何故它共享对状态的内存引用。