Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 为什么伊默没有';即使我修改了草稿,你也不能给我一个新的状态吗?_Reactjs_Redux_Immer.js - Fatal编程技术网

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已更新,但不知何故它共享对状态的内存引用。