【React】setState原理,SCU,不可变对象,Ref,受控组件,高阶组件

news2024/12/23 17:30:01

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

文章目录

  • setState原理
    • setState异步更新
  • SCU
  • 不可变对象
  • Ref
    • Ref获取DOM
    • Ref获取组件
  • 受控组件
  • 高阶组件(HOC)
    • 作用一:进行函数增强功能
    • 作用二:鉴权登录
  • Portals
  • React严格模式

setState原理

  • react没有做数据劫持,需要调用setState告诉react数据发生改变了,之后再调用render函数进行页面更新
  • 我们修改了state之后,希望React根据最新的State来重新渲染界面,但是这种方式的修改React并不知道数据发生了变化,React并没有实现类似于Vue2中的Object.defineProperty或者Vue3中的Proxy的方式来监听数据的变化,我们必须通过setState来告知React数据已经发生了变化

setState异步更新

  • setState的基本使用就是首先通过Object.assign将新数据替换掉原数据,之后在合适的位置重新调用render函数刷新页面
    在这里插入图片描述
  • 第二种写法是里面写一个箭头函数,返回一个对象,这样写有好处1:里面是一个回调函数,在里面可以写一些函数逻辑;好处2:当前的回调函数会将之前的state和props传递进来
    在这里插入图片描述
  • setState在React的事件处理中是一个异步调用,异步调用:并不会阻塞接下来代码的执行,操作并不会立刻完成,而是经过一些时间之后才会完成;如果希望数据更新之后立刻获取数据更新后的参数,可以在setState中传入第二个参数,callback函数
    在这里插入图片描述
  • 为什么setState设计为异步?
  • setState设计为异步在GItHub的issue上个也有很多的讨论,Redux的作者也有对应的回复,我用看完之后主要是由这两个问题
    第一可以显著的提升性能,如果每次调用setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新渲染,这样效率是很低的,最好的办法是获取到多个更新,之后进行批量更新
    第二如果我们同步更新state,但是还没有执行render函数的时候,那么state的值和props里面的值就不能保持同步,在开发中会产生很多问题
  • 那么setState一定是异步吗?在这里插入图片描述
    在React18之前,这样写是同步代码(或者直接写DOM原生的click操作),在React18之后,就算是setTimeout中setState也是异步操作,进行批量处理,如果要在18之后做同步处理,在React-dom包中,有一个flushSync函数,里面传一个回调函数写setState即可
    在这里插入图片描述

SCU

  • diff算法更新:同层结点之间相互比较,不会跨节点比较;不同类型的节点,产生不同的树结构,开发中可以通过key来指定哪些节点在不同的渲染下保持稳定
  • 在react中,如果父组件的renden函数调用了,那么子组件的所有render函数也会调用,事实上很多组件没有必须要重新render,如果想让子组件中render不想更新,通过生命周期中shouldComponentUpdate方法
  • 该方法有两个参数
    在这里插入图片描述
    在这里插入图片描述
  • 如果当前组件是一个类组件,React提供了一个PureComponent;如果所有的类,我们都需要手动实现shouldComponentUpdate,那么会给我们开发者增加非常多的工作量,因此提供了一个pureComponenetUpdate
    在这里插入图片描述
  • 但是如果是一个函数组件,我们可以通过memo进行调用,通过判断props有没有改变来决定是否更新render函数
    在这里插入图片描述

不可变对象

  • 如果想在state中的对象添加一个元素,需要创建一个新的对象覆盖原对象,而不是直接修改原对象
    在这里插入图片描述
    在这里插入图片描述

Ref

Ref获取DOM

  • 在React包中引入createRef,然后在constructor中创建ref,在元素上写一个ref属性,之后通过current获取值
    在这里插入图片描述

Ref获取组件

  • 通过forwardRef包裹函数,然后通过ref传递获取
    在这里插入图片描述

受控组件

  • 一般input默认是非受控组件,只有我们可以动态修改值之后才是受控组件,如果input有默认值,我们通过输入框是无法修改值的,也就是所谓的非受控,当我们添加了onChange事件之后,可以修改值了,就变成受控组件了。类似于v-model
  • 如果input类型是checkbox,值是checked,事件是onChange

-
在这里插入图片描述

  • 如果是select的多选,需要这么写
    在这里插入图片描述

高阶组件(HOC)

  • 高阶组件是参数为组件,返回值为新组件的函数
  • 利用高阶组件就是对某个组件进行了封装,包裹之后加了一些通用功能
    在这里插入图片描述

作用一:进行函数增强功能

在这里插入图片描述

作用二:鉴权登录

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

Portals

  • 某些情况下,我们希望渲染的内容独立于父组件,甚至独立于当前改在到DOM元素中(默认都是挂载到id为root的DOM元素上)
    在这里插入图片描述在这里插入图片描述

React严格模式

  • StrictMode是一个组件,为其后代的元素触发额外的检查和警告

1.使用不安全生命周期会报警告
在这里插入图片描述

2.使用不安全的ref会报警告
在这里插入图片描述
3.检查意外的副作用
设置严格模式之后,这个组件的constructor会被调用两次,这是严格模式下故意进行的操作,让你来查看在这里写的一些逻辑代码被调用多次时,是否会产生一些副作用,在生产环境中,是不会被调用两次的
4.会检测过时的context API,早期Context是通过static属性声明Context对象,通过getChildContext返回Context对象等方式使用Context,目前这种方法已经不推荐使用了

————————————————————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

告别 Spread 运算符:使用默认 Composer

在 JavaScript 中处理对象时,通常需要为空的strings// objects、或属性设置默认值。在处理嵌套对象时,这会变得更加复杂并且需要复杂的编程逻辑。然而,有了“ default-composer ”库,这项任务变得简单易行。arraysnullundefined …

零瑕疵全核心,这份RocketMQ笔记仅用330页直接封神

RocketMQ天生为金融互联网领域而生,追求高可靠、高可用、高并发、低延迟 RocketMQ在阿里集团也被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景 其主要功能有&am…

怎样快速选择正确的可视化图表?

数据可视化的图表类型十分丰富,好的图表可以有效、清晰地呈现数据的信息。对于用户而言,选择正确的图表是十分关键的,不仅可以达到“一图胜千言”的效果,而且会直接影响分析的结果。 用户选择正确的数据可视化图表前,…

银河麒麟服务器ZYJ操作系统,文件储存inode节点占用根目录/空间满了解决办法

【问题描述】 今天发现业务系统运转异常,df -h 检查服务器发现磁盘根目录空间未满,df -i 检查发现根目录文件满了。inode节点中,记录了文件的类型、大小、权限、所有者、文件连接的数目、创建时间与更新时间等重要的信息,还有一个…

蓝奥声核心技术分享——无线同步数据传输技术

1、技术背景 无线同步数据传输技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策,属于蓝奥声核心技术--边缘协同感知(EICS)技术的关键支撑性技术之一。该项技术主要涉及网络服务节点与目标对象设备之间的无线通信方式及服务机制与流…

flask做图书管理系统

一.Flask框架是一个轻量级的Web应用程序框架,它提供了一种简单的方法来创建Web应用程序。在本文中,我们将使用Flask框架来开发一个图书管理系统。在使用 Flask 开发时,建议使用虚拟环境来隔离不同项目的依赖关系,避免冲突。 摘要 …

阿里元境郭旷野:多端时代,云渲染在为元宇宙开发降本

当“AI进入iPhone时代”时,创造iPhone的苹果带着Vision Pro来了。在元宇宙初创企业今年上半年融资(6.64亿美元)较去年同期(29.3亿美元)大幅下降的背景下,苹果硬件新产品的问世被视作元宇宙赛道的“提气”之…

【MySQL】JDBC编程 (Java的数据库编程:JDBC 导入驱动包 MySQL Connector Java 编写JDBC代码 插入操作 查询操作)

文章目录 Java的数据库编程:JDBC导入驱动包MySQL Connector Java 编写JDBC代码插入操作查询操作 Java的数据库编程:JDBC 真正在工作中操作数据库,99.9%都是通过代码来操作,很少会手动在客户端里输入sql语句.各种数据库,MySQL,Oracle,SQL Server 在开发的…

必须了解的不同地区的支付方式FP独立站安全收款方式

跨境收款是跨境电商自建站系统最重要的功能之一,其收款方式一直是众多独立站卖家特别是做fp独立站的最为关注的问题之一,加上chatgpt出现,对fp独立站的检测审核更加严格,那么,你知道要怎么做才能安全收款吗&#xff1f…

深度估计阅读记录

VolSDF(neurips 2021) 题目:Volume Rendering of Neural Implicit Surfaces 链接:https://arxiv.org/pdf/2106.12052.pdf 目标:使用SDF这种表示方式替换NeRF中的MLP,使得在几何形状上获得更准确的结果。我们通过将体密度建模为几…

Python实现Fleiss Kappa一致性分析,并计算Z值和p值等相关统计量

参考资料 Fleiss Kappa的定义 Fleiss Kappa的原论文因为要付费才能阅读,我这里就不放链接了 Fleiss kappa - Wikipediahttps://en.wikipedia.org/wiki/Fleiss%27_kappa Fleiss Kappa相关统计量 Z值,p值,95%置信区间 属性一致性分析 的 …

如何使用切片辅助超推理 SAHI 技术对 YOLOv8 进行推理过程和代码实现

前面章节已经详细描述了 切片辅助超推理(SAHI )技术原理介绍 引入SAHI,这是一种专为小物体检测而设计的尖端流水线。SAHI 利用切片辅助推理和微调技术的力量,彻底改变了检测对象的方式。SAHI 物体检测的与众不同之处在于它与任何物体检测器的无缝集成,无需进行繁琐的微调…

Nmap安装

Nmap 文章目录 Nmap简介下载安装Zenmapnmap 配置环境变量检查是否安装成功界面 简介 Nmap是一款非常强大实用的工具,可用于检测网络上的存活主机,检测目标主机的开放端口,检测端口上相应服务上网版本,主机操作系统等信息&#xf…

基于计量学角度对传感器的灵敏度的理解和举例

基于计量学角度对传感器的灵敏度的理解和举例 灵敏度指标是考察传感器特性的主要指标之一,是对传感器设计、生产和选型过程中非常重要的参数。本文将基于计量学知识对灵敏度进行举例介绍。 一、灵敏度定义 灵敏度是传感器、测量装置或仪器的响应的变化除以对应的…

设计模式(八):结构型之装饰器模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

中国计算机学会CCF推荐的国际会议(图像处理方向)

CCF推荐的国际会议(医学图像处理方向) 1 介绍2 最新目录3 投了会议可以再投期刊吗?4 个人感想 1 介绍 CCF根据论文的质量和影响力,对国际期刊和国际会议进行了评估和分类,以便研究者在选择发表论文或参与学术交流时有…

亚马逊美国站 隐形墨水笔CPC认证 儿童玩具

隐形墨水笔 一种采用透明墨水并集成紫外线灯的笔。 隐形笔是指书写后的字迹在正常光线下不能看见(隐形)的笔,只有在紫外灯的照射下才能看见。一般用来标记物品或写不想轻易让人看见的语句。 市面上的隐形笔分为水性隐形墨水笔、油性隐形墨水…

【CSS 04】Zoro 外边距 外边距合并 内边距 内容高度与宽度 框模型 轮廓

CSS 说在前面外边距 margin外边距合并 margin_collapse内边距 padding高度与宽度 dimension框(盒子)模型 boxmodel轮廓 outline 说在前面 最近发现一个有趣的事情,就是CSDN会把我写在【】中的Zoro当做文章主要技术关键词,尽管我在…

科技政策 | 国家、广东省、深圳市的制造业单项冠军企业(产品)遴选申报指南来啦!

原创 | 文 BFT机器人 近日深圳市工业和信息化局开始了2023年技术创新项目扶持计划制造业单项冠军奖励项目申报。 那么制造业单项冠军,国家、广东省、深圳市各级申请需要什么条件呢?有那些注意事项呢?今天,一文带大家读懂。 01 申…

设计模式(九):结构型之桥接模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…