ReactJS修炼之路(五):Immutable.js的使用及setState的一个误区

手把手教你用smarteye搭建免费GB28181监控平台(含海康设备接入避坑指南) 本文提供了一份基于SmartEye搭建免费GB28181视频监控平台的实战指南。详细介绍了从服务器部署、GB28181协议核心配置,到海康威视等主流设备接入的完整流程,并重点分享了设备注册失败、无法预览等常见问题的深度排错方法,旨在帮助中小企业及开发者低成本实现多品牌监控设备的统一管理。 阅读详情

问题

这篇博客仅作为学习笔记,没有多少自己的东西,只有一个小误区,记录下来当做备忘。

学习资料:

关于Immutable.js如何整合进React中,推荐阅读官方的文档和上面第二篇博客,下面不会说具体的使用方法,所以阅读到这里这篇博客算是结束了。

下面说说我以前在setState中踩的坑,同时也回答了一个问题,为什么需要Immutable.js这个轮子。

年少时不小心犯下的错

最近会启动一个新的项目,在进行技术选型的时候特地看了Immutable.js,才发现自己以前写码有些错误的地方。

上代码:

    let data = this.state.data;
    data.times = data.times + 1;
    this.setState({ data: data });
    // 下面打印的结果会是已经加 1 后的值。
    console.log(this.state.data.times);

还记得该系列的上一篇文章ReactJS修炼之路(四):组件的性能优化及开发思路中提到的shouldComponentUpdate: function(nextProps, nextState),因为上面的操作直接改变了this.state.data的值,所以在shouldComponentUpdate中nextState.data和this.state.data其实是同一个对象(2016-12-03更新:这里容易产生误区,再说得详细一点,因为我们在调用this.setState({ data: data })时,把原来的state中的state赋给了新的state,所以下面的nextState.data和this.state.data是同一个对象,既然是同一个对象的两个不同引用而已,那么无论怎么比较得出的结果都是nextState.data和this.state.data相同,所以返回false),因此无论怎么比较都会返回false,导致组件不更新。

正确的做法应该如下:

    let data = _.cloneDeep(this.state.data);
    data.times = data.times + 1;
    this.setState({ data: data });
    // 如果上面不做 cloneDeep,下面打印的结果会是已经加 1 后的值。
    console.log(this.state.data.times);

这样的话,没有改变this.state.data的值,通过调用setState,使得在shouldComponentUpdate中nextState.data是新的值,可以与this.state.data比较,根据比较结果判断是否更新组件。

那么为什么需要Immutable.js?

let data = _.cloneDeep(this.state.data);这行代码可以看出,为了新建一个对象,我们在原对象的基础上进行了深度拷贝,然后改变新对象的值,深度拷贝的坏处很明显,对象越复杂,性能开销越大,而Immutable.js能通过不可变对象来避免这个问题,具体原理看上面的学习资料可以求解:

else

有一段时间没更新博客了,跟国庆假期有关,但主要原因还是遇到的问题少了,倒不是说自己水平提升了很多,而是自己实际编码的时间少了(话说最近看了《易中天中华史》,十分推荐)。

只有coding能产生问题,也只有coding能解决问题,提升自己。

加油。

OI 生涯回忆录 《Pilgrimage》 前言 于 NOI2020 后写下本文。 本文简单提及了在写作时尚能回忆起来的,在我的 OI 生涯中对我的影响重大的人、事、比赛等。 写作本文,旨在在回忆允许的范围内,对 OI 生涯进行一定程度上的梳理,总结。 开端 入门 我最早接触计算机程序设计,是在小学。 那时候,我的数学成绩不错,就被老师推荐去学习编程。 就这样,我在局前街小学的何静老师的指导下,走上了编程的道路。 小学时的编程,与其说是 “竞赛” ,不如说是 “兴趣班” 。 当时,包括我在内,很多小孩子天性是浮躁的。支撑我对着无聊的代码学下去的,并不 阅读详情

相关推荐

sql server安装并SSMS连接

  SQL Server是一种广泛应用于网络业务数据处理的关系型数据库管理系统。SQL Server 2016是微软公司研发的新一代旗舰级数据库和分析平台,突出高级分析和丰富可视化,并融合了关键创新功能。其可提供对企业基础架构最高级别的支持,专门针对关键业务应用的多种功能与解决方案提供最高级别的可用性,并提供更多、更全面的功能以满足不同人群对数据的需求,包括支持来自不同网络环境的数据交互、全面的自助分析等创新功能。百度搜索sql server,在官网下载 地址是:SQL Server 下载| Microso

jiankang66的博客 5184

react 使用的小建议

使用pureRender,setState和Immutable.js来操作state Immutable 中文意思不可变。 不能直接修改state的值,要用setState 和Immutable react 官方要求不要直接修改state,比如this.state.name = "suyuan"是错误的写法,应该用this.setState({name, "suyuan"})...

weixin_34327223的博客 176

Xilinx Vivado LDPC IP core,TSN IP core. 各种IP core

Xilinx Vivado LDPC IP core,TSN IP core. 各种IP core

qq_1432825237的博客 3990

Immutable 常用API简介

本文主要整理了Immutable.js常用API的使用。 Immutable 是什么? 关于Immutable的定义,官方文档是这样说的: Immutable data encourages pure functions (data-in, data-out) and lends itself to much simpler appl...

weixin_34174422的博客 375

从零到一:构建嵌入式Nginx的模块化架构与跨平台部署实战

本文详细介绍了在ARM32架构的RV1126嵌入式设备上,通过交叉编译技术构建模块化Nginx服务器的完整实战流程。涵盖环境配置、依赖库编译、Nginx核心与http_ssl_module等模块集成、性能优化及部署调试,为嵌入式开发提供高效可靠的Web服务器解决方案。

rock5的博客 202

【OpenClaw企业级智能体实战】第11篇:制造业设备预测性维护实战——OpenClaw+DeepSeek+Prometheus从零搭建(附完整代码)

本文聚焦制造业设备预测性维护的核心痛点,基于OpenClaw v2026.2.1、DeepSeek智能诊断、Prometheus监控等工具,拆解“设备状态监控→智能故障诊断→预测性维护”三大核心场景。从技术原理、算法构建、实操流程到完整代码实现,提供“数据采集→模型训练→智能调度→自动处置”的全链路方案。方案遵循工业安全规范,采用“只读优先、权限最小化”原则,适配中小制造企业落地需求。通过虚拟案例验证,可使设备非计划停机时间下降65%、平均修复时间缩短47%,既适合新手快速入门,也为进阶读者提供架构优化思路

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 606

React / Immutable.js 踩坑记录(一) / 有关setState与React事件

有关setState 一、setState是异步的,想要在setState之后立刻得到state中的值,需要使用回调函数 二、setState会引起一次渲染(render),所以可以在render或者componentWillUpdate中截获state的改变,注意render发生在setState回调函数执行前,同时在componentWillUpdate / componentWill...

lANcElOT的博客 615

从零手搓大模型(一)文本如何变成 LLM 的输入

本文介绍了从原始文本到LLM输入向量的完整处理流程。主要内容包括: 文本预处理:通过正则表达式将原始文本分割成token列表,处理标点和空格。 词表构建:创建token到ID的映射字典(vocabulary),这是文本数字化的关键步骤。 简单tokenizer实现:封装了编码(encode)和解码(decode)功能,完成文本与token ID的相互转换。 处理流程:原始文本 → 分词 → token ID → 嵌入表示 → 最终输入向量。 数据形状变化:从字符串逐步转换为(batch_size, cont

echo的博客 998

Immutable.js 以及在 react+redux 项目中的实践

作者介绍:邹弓一,美团点评前端工程师,5年 Web 前端开发经验,现在是美团点评点餐团队的一员。 前言   本文主要介绍facebook推出的一个类库immutable.js,以及如何将immutable.js集成到我们团队现有的react+redux架构的移动端项目中。 本文较长(5000字左右),建议阅读时间: 20 min 通过阅读本文,你可以学习到: 什么是immutable.js,...

weixin_33728268的博客 839

从原理到落地:Java+TensorRT打造YOLO模型GPU极致推理方案

Java+TensorRT的YOLO模型GPU加速方案,核心是通过JNI桥接实现Java与TensorRT的高效交互,结合TensorRT的底层优化能力,最大化GPU算力。该方案既保留了Java后端的工程化优势(如易维护、生态完善),又解决了AI模型推理的性能瓶颈,可落地于实时视频分析、智能监控、工业质检等场景。基于TensorRT Dynamic Shape实现多尺寸输入的自适应优化;结合Java的协程(Virtual Thread)提升异步推理的并发效率;

2601_94871597的博客 766

uniApp微信小程序:error: 60001 request:fail errcode:-101 cronet error code:-101error_msg:net::ERR CONNECTI

uni-app微信小程序域名访问报error 60001 request:fail errcode:-101,解决Uniapp微信小程序报600001错误,uni.request()接口请求报错,服务器更换SSL证书后,uniapp微信小程序出现`request:fail errcode:-101`问题分析与解决,服务器更换ssl证书后,手机访问微信小程序异常,微信小程序更换SSL证书后出现请求报错,服务器更换SSL证书,微信小程序报600001,小程序反应偶尔出现request:fail errcode:

✅ 精选推荐文章 4582

immutable 中对象的修改 删除 合并

//修改 – 任何的修改都会返回一个新的对象 //set/setIn/update/updateIn let obj = { id: 1, name: '张三', user: { age: 20 } } let istate = fromJS(obj) let newState = istate.set('name', '李四') //李四 //toJS方法 就是把immutable对象转为原生js对象 console.log(newState.toJS()); // set 设置值 不需要原值 upd

weixin_43791774的博客 565

【人工智能】大模型可以分为L0层:基础大模型/通用大模型、L1层:行业大模型、L2层:细分场景模型三个层级

大模型确实可以分为L0、L1、L2三个层级,这种分层架构不仅有助于提升模型的泛化能力和适应性,还能更好地满足不同行业和场景的需求。华为盘古大模型的分层架构(L0、L1、L2)在多个证据中得到了详细描述和验证。例如,华为云盘古大模型3.0明确分为L0基础大模型、L1行业大模型和L2场景模型三层架构。此外,其他来源也一致支持这一分层架构,如用友网络的企业服务大模型、智谱AI的GLM-4系列等。

奶爸的编程之路,也就一周冷个三天 3979

React中Immutable的使用

假设当前 redux 的大小为 1G,现在要修改 redux 树中的某个节点(节点的大小很小),我们就需要深复制整棵 redux 树,只为了修改很少的数据,这样对于性能的损耗是非常大的。于是我们使用 Immutable 来对这一现象进行优化,Immutable 只会深复制发生改变的节点及其祖先节点,然后修改后返回新数据。Immutable.js 出自 Facebook,是非常流行的不可变数据结构的实现之一。它实现了完全的持久化数据结构,使用结构共享。

月光晒了很凉快的博客 2870

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

对immutable的理解?如何应用在react项目中?

其出现场景在于弥补 Javascript 没有不可变数据结构的问题,通过 structural sharing来解决的性能问题。内部提供了一套完整的 Persistent Data Structure,还有很多易用的数据类型,如。如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。Immutable,不可改变的,在计算机中,即指一旦创建,就不能再被更改的数据。也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变,同时为了避免。性能优化的时候,为了避免重复渲染,会在。

zz130428的博客 980

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

React的Immutable特性及使用Immer优化开发体验

React的Immutable特性及使用Immer优化开发体验

weixin_53068161的博客 1664

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Immutable的基本使用

一、Immutable简介 功能用法:Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。 Immutable 实现的原理:是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy ...

qq_44472790的博客 1714

immutable的理解与使用

immutable的运用与理解

学思QAQ的博客 251

react- immutable

- 不可变数据 数据一旦被创建就不修改 - 对 immutable 数据做操作的时候都会返回一个新的 immutable 对象, 修改对象的值和原值一样 相当于是没修改 - https://immutable- js.com/docs/v4.1.0 - js 中原生的数据结构 obj arr 实现队列 堆 栈 - 数据修改的时候 只有修改的节点的父级会产生影响,其他的都是复用 效率高 - 优点 - 节省内存 优化代码 深拷贝 - 函数式编程 - 可以溯源,所有改变数据的操作都会记录 - 缺点 - 需要学习新

weixin_46087056的博客 276

浅谈react中的immutable

immutable不可变对象 介绍一下基本概念: facebook工程师历时三年时间打造,与react同期出现,但是没有被默认放到React工具集中,它内部实现了一套完整的数据持久化,里面有很多常见的数据类型 Collection List Map Set等。 里面有三种重要的数据解构: Map:键值对集合,对应Object ES6中也有专门的Map对象 List:有序可以重复的列表,对应于Array Set:无序并且不可重复key的数组 immutable原理 immutable实现的原理是(持久化数

Shmily的博客 2035

React中immutable的使用(优化级深拷贝)

一、作用 immutable 对象是不可直接赋值的对象,它可以有效的避免错误赋值的问题 二、安装 $ npm install immutable 三、使用 在react中,immutable主要是防止state对象被错误赋值。 将js对象转成immutable对象 import { fromJS } from 'immutable'; const defaultState = fromJS({ todoList: [] }); 获取属性 state.get('todoList'); // 获取sto

Mr-yang的随笔 1123

浅谈React项目中 Immutable Data(1),前端开发平台

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽" />

2401_84093860的博客 852

react和immutable偶遇的那些事

概要 在项目中经常会遇到一些问题,比如把一个对象赋值给另外一个对象后,如何实现修改被赋值的对象而原对象不变;一般做法是copy,而copy又分为shallowCopy(浅拷贝)和 deepCopy(深拷贝);shallowCopy对于层级比较深的对象来说然并*用,那么只能用deepCopy来避免上面遇到的情况,但deepCopy是一个很耗性能的操作。再比如使用react技术栈来做项目时,经常需要我...

weixin_33805557的博客 164

面试官:说说你对 Immutable Data的理解?如何应用在React项目中?

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!024c (备注前端)**[外链图片转存中…(img-jtsNwgIw-1712968060791)][外链图片转存中…(img-33DPeEwr-1712968060792)]一个人可以走的很快,但一群人才能走的更远。

m0_61408947的博客 743

JS immutable组件

介绍 更多信息 immutable中文:不变的,不可改变的 每次修改一个Immutable对象时都会创建一个新的不可变的对象,在新对象上操作并不会影响到原对象的数据。 安装 npm i immutable 一、Immutable优化性能的方式 Immutable实现的原理是持久化数据结构,也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免deepCopy把所有节点都复制一遍带来的性能损耗,Immutable使用了结构共享,即如果对象树中一个节点发生变化,只修改这个节点和受它影响的

ma33xiao的博客 3439

JavaScript中的可变(Mutable)、不可变(Immutable)和变量的赋值介绍

JavaScript中的不可变(Immutable)与可变(Mutable)和变量的赋值介绍

cnds123的专栏 1090
上一篇: 前端性能优化:webpack分离 + LocalStorage缓存
下一篇: 渲染性能:读写style对渲染过程的影响
Sheldon_Law
博客等级 码龄11年 44粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值