首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >redux-toolkit --类型错误:"unit“是只读的

redux-toolkit --类型错误:"unit“是只读的
EN

Stack Overflow用户
提问于 2021-07-10 16:21:28
回答 2查看 143关注 0票数 0

我在这个项目中使用react-redux和redux-toolkit。我想把商品加到购物车里。如果购物车中已经有相同的物品,只需增加单位即可。错误发生在切片上,所以我将在这里显示切片。

代码语言:javascript
复制
const CartListSlice = createSlice({
    name: 'cartItem',
    initialState,
    reducers: {
      addToCart: (state, action) => {
        let alreadyExist = false;
// get a copy of it to avoid mutating the state
        let copyState = current(state.cartItem).slice();
        // loop throught the cart to check if that item is already exist in the cart
        copyState.map(item => {
              if (item.cartItem._id === action.payload._id) {
                alreadyExist = true;
                item.unit += 1  // <--- Error occurs here
              }
            })
        
// If the item is not exist in the cart, put it in the cart and along with its unit
        if (alreadyExist === false) {
          state.cartItem.push({
            cartItem: action.payload, 
            unit: 1
          });
        }
      },
    }
});

我得到一个类型错误,告诉我unit是只读的。我如何更新"unit“变量,使它在应该递增的时候递增。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-10 19:57:23

在React Toolkit的createSlice中,您可以直接修改state,甚至应该这样做。所以不要创建副本,只需修改它即可。实际上,这个错误可能在某种程度上源于使用current进行复制。

See the "Writing Reducers with Immer" documentation page on this

同时,还有一个建议:

代码语言:javascript
复制
const CartListSlice = createSlice({
    name: 'cartItem',
    initialState,
    reducers: {
      addToCart: (state, action) => {
        const existingItem = state.find(item => item.cartItem._id === action.payload._id)
        if (existingItem) {
          item.unit += 1
        } else {
          state.push({
            cartItem: action.payload, 
            unit: 1
          });
        }
      },
    }
});
票数 2
EN

Stack Overflow用户

发布于 2021-07-11 01:17:38

你不需要行:

代码语言:javascript
复制
let copyState = current(state.cartItem).slice();

只需使用state.cartItem.map,而不是copyState

正如@phry所说,你应该直接突变state,因为redux-toolkit在后台使用immerJS来处理突变。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68326030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档