React redux toolkit: Uncaught Error:[Immer] An immer producer returned a new...
React在写一个购物车的redux toolkit时遇到了问题。核心代码如下:
import { createSlice } from "@reduxjs/toolkit";
const cartSlice = createSlice({
name: 'cart',
initialState: {
cartItems: [],
cartItemCount: 0
},
reducers: {
addProduct(state, action) {
const { imageUrl, name, price } = action.payload
let newCartItems = [...state.cartItems]
let flag = newCartItems.some((item, index, arr) => {
if(item.name == name) {
arr[index].quantity += 1
return true
}
})
if(!flag) {
newCartItems = [
...state.cartItems,
{ imageUrl, name, price, quantity: 1 }
]
}
const cartItemCount = newCartItems.reduce(
(prevTotal, currItem) => prevTotal + currItem.quantity, 0
)
return { cartItems: newCartItems, cartItemCount }
}
}
})
export const { addProduct, deleteProduct, incQuantity, decQuantity } = cartSlice.actions
export default cartSlice.reducer
核心逻辑是,调用addProduct来修改redux所管理的cartItems和cartItemCount,当向购物车中添加一个新的物品时,代码正常运行;但当反复添加一个物品时,代码报出如下错误:
搜下资料发现是因为redux使用immer,不允许在reducer中修改state值后还return,二者只能取其一。
因此,当添加一个新物品时,由于没有修改cartItems,因此可以有返回值,不报错。
但当添加一个重复的物品时,即使在最开始使用了let newCartItems = [...state.cartItems]来创建一个新的对象,但由于state.cartItems数组中保存的不是基本数据类型,而是一个对象,因此newCartItems保存的是state.cartItems中各个对象的引用,即
newCartItems == state.cartItems // false
newCartItems[0] == state.cartItems[0] // true
由此可得,添加一个新物品时,由于既修改了state,又return了新值,因此报出immer错误。
修改后的代码如下:
addProduct(state, action) {
const { imageUrl, name, price } = action.payload
let flag = state.cartItems.some((item, index, arr) => {
if(item.name == name) {
arr[index].quantity += 1
state.cartItemCount += 1
return true
}
})
if(!flag) {
state.cartItems.push({ imageUrl, name, price, quantity: 1 })
state.cartItemCount += 1
}
}
这里只是对state做了修改,而没有return新值,因此代码正常运行。
React redux toolkit: Uncaught Error:[Immer] An immer producer returned a new...的更多相关文章
- webpack+react+redux+es6开发模式---续
一.前言 之前介绍了webpack+react+redux+es6开发模式 ,这个项目对于一个独立的功能节点来说是没有问题的.假如伴随着源源不断的需求,前段项目会涌现出更多的功能节点,需要独立部署运行 ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- react+redux教程(一)connect、applyMiddleware、thunk、webpackHotMiddleware
今天,我们通过解读官方示例代码(counter)的方式来学习react+redux. 例子 这个例子是官方的例子,计数器程序.前两个按钮是加减,第三个是如果当前数字是奇数则加一,第四个按钮是异步加一( ...
- webpack+react+redux+es6
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- React Redux Sever Rendering实战
# React Redux Sever Rendering(Isomorphic JavaScript)  react客户端渲染的一大痛点就是首屏渲染速度慢问题,因为react是一个单页面应用,大多数的资源需要在首次渲染前就加载 ...
- 实例讲解基于 React+Redux 的前端开发流程
原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...
- 【redux】详解react/redux的服务端渲染:页面性能与SEO
亟待解决的疑问 为什么服务端渲染首屏渲染快?(对比客户端首屏渲染) react客户端渲染的一大痛点就是首屏渲染速度慢问题,因为react是一个单页面应用,大多数的资源需要在首次渲染前就加载 ...
- 我的第一个 react redux demo
最近学习react redux,先前看过了几本书和一些博客之类的,感觉还不错,比如<深入浅出react和redux>,<React全栈++Redux+Flux+webpack+Bab ...
随机推荐
- nodejs批量重命名
const fs = require("fs"); // directory path let config = { affix: null, src: null, }; ...
- java: 读取D:\maven\apache-maven-3.6.3\maven-repo\javax\javaee-web-api\8.0.1\ 出现 not a zip file
解决方式 删除图片中指向jar包,然后更新maven即可
- Python MySQLdb连接被多线程共享引发的内核segfault段错误
Python celery Worker exited prematurely: signal 11 (SIGSEGV) --一种解决方案 Python libmysqlclient segfault ...
- VSCode-关于自动格式化问题
Code ->首选项 ->设置 ,在搜索框上输入"格式化" 设置格式化后挂号会自动补齐,关键字会自动添加空格,
- 实验3 C语言分支语句和循环语句编程应用
任务一 #include<math.h> #include<stdio.h> int main() { float a,b,c,x1,x2; float delta,real, ...
- ArcEngine(平板电脑墨迹错误代码。多次调用 RtpEnabled (异常来自 HRESULT:0x80040239))问题未有效解决
测试数据库中的要素无法执行ITopologicOperater接口下的方法,错误如图 暂记,错误未解决 tip: 1.随便移动一个节点 也不报错/ 2.手动按照他的节点画一个也不报错 3.bufer参 ...
- Windows软件堆栈溢出(stack overflow)的一些解决方法
欢迎访问我的个人博客:xie-kang.com 原文地址 Windows平台下,有三种方法调整堆栈大小(适用于MSVC编译器): 1)添加编译参数:/F size #其中size的单位是byte可设 ...
- v2即时通讯的应用
1.建立webscoket.js: import Vue from 'vue' import { Message } from 'element-ui' let v = new Vue() v.$me ...
- 使用RPA有什么好处
通过本章学习,您将了解到: 什么是RPA RPA能为我们做些什么 使用RPA有什么好处 RPA的体系结构是什么 应用RPA是否需要深入了解这项技术 RPA的未来趋势怎么样 什么是RPA? RPA即Ro ...
- Fiddler一些用法学习记录
最近项目中用Fiddler较多,只会之前掌握的一些最简单的用法显得有点不太够.记录一下学习到的新用法. 一.需要mock.打开AutoResponder,Add Rule,填上需要mock的网址,需要 ...