react补充--hooks

2023-10-27

1. setState

setState更新状态的2种写法

	(1). setState(stateChange, [callback])------对象式的setState
            1.stateChange为状态改变对象(该对象可以体现出状态的更改)
            2.callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用
					
	(2). setState(updater, [callback])------函数式的setState
            1.updater为返回stateChange对象的函数。
            2.updater可以接收到state和props。
            4.callback是可选的回调函数, 它在状态更新、界面也更新后(render调用后)才被调用。
总结:
		1.对象式的setState是函数式的setState的简写方式(语法糖)
		2.使用原则:
				(1).如果新状态不依赖于原状态 ===> 使用对象方式
				(2).如果新状态依赖于原状态 ===> 使用函数方式
				(3).如果需要在setState()执行后获取最新的状态数据, 
					要在第二个callback函数中读取

2. lazyLoad

路由组件的lazyLoad

	//1.通过React的lazy函数配合import()函数动态加载路由组件 ===> 路由组件代码会被分开打包
	const Login = lazy(()=>import('@/pages/Login'))
	
	//2.通过<Suspense>指定在加载得到路由打包文件前显示一个自定义loading界面
	<Suspense fallback={<h1>loading.....</h1>}>
        <Switch>
            <Route path="/xxx" component={Xxxx}/>
            <Redirect to="/login"/>
        </Switch>
    </Suspense>

<h1>loading.....</h1> 如果要使用组件那么组件得引入必须是原始方式引入import Loading  from './components/Loading'

3. Hooks

1. React Hook/Hooks是什么?
(1). Hook是React 16.8.0版本增加的新特性/新语法
(2). 可以让你在函数组件中使用 state 以及其他的 React 特性(之前函数式组件不可以使用this对象,所以很多东西生命周期这些用不了)
2. 三个常用的Hook
(1). State Hook: React.useState()
(2). Effect Hook: React.useEffect()
(3). Ref Hook: React.useRef()
3. State Hook
(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作
(2). 语法: const [xxx, setXxx] = React.useState(initValue)  
(3). useState()说明:
        参数: 第一次初始化指定的值在内部作缓存
        返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
(4). setXxx()2种写法:
        setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
        setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值
4. Effect Hook
(1). Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
(2). React中的副作用操作:
        发ajax请求数据获取
        设置订阅 / 启动定时器
        手动更改真实DOM
(3). 语法和说明: 
        useEffect(() => { 
          // 在此可以执行任何带副作用操作
          return () => { // 在组件卸载前执行
            // 在此做一些收尾工作, 比如清除定时器/取消订阅等
          }
        }, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行
    
(4). 可以把 useEffect Hook 看做如下三个函数的组合
        componentDidMount()
        componentDidUpdate()
    	componentWillUnmount() 
5. Ref Hook
(1). Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
(2). 语法: const refContainer = useRef()
(3). 作用:保存标签对象,功能与React.createRef()一样

4. Fragment

使用

<Fragment><Fragment>
<></>

作用

可以不用必须有一个真实的DOM根标签了


5. Context

理解

一种组件间通信方式, 常用于【祖组件】与【后代组件】间通信

使用

1) 创建Context容器对象:
	const XxxContext = React.createContext()  
	
2) 渲染子组时,外面包裹xxxContext.Provider, 通过value属性给后代组件传递数据:
	<xxxContext.Provider value={数据}>
		子组件
    </xxxContext.Provider>
    
3) 后代组件读取数据:

	//第一种方式:仅适用于类组件 
	  static contextType = xxxContext  // 声明接收context
	  this.context // 读取context中的value数据
	  
	//第二种方式: 函数组件与类组件都可以
	  <xxxContext.Consumer>
	    {
	      value => ( // value就是context中的value数据
	        要显示的内容
	      )
	    }
	  </xxxContext.Consumer>

注意

在应用开发中一般不用context, 一般都用它的封装react插件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z05ViotG-1630724039111)(D:\react\react全家桶资料\react全家桶资料\01_课件\React扩展.assets\image-20210904093228668.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUhdoVEb-1630724039126)(D:\react\react全家桶资料\react全家桶资料\01_课件\React扩展.assets\image-20210904093424043.png)]

对象传值方式:value={{username,age}}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAweRbCn-1630724039130)(D:\react\react全家桶资料\react全家桶资料\01_课件\React扩展.assets\image-20210904093805269.png)]


6. 组件优化

Component的2个问题

  1. 只要执行setState(),即使不改变状态数据, 组件也会重新render() ==> 效率低

  2. 只当前组件重新render(), 就会自动重新render子组件,纵使子组件没有用到父组件的任何数据 ==> 效率低

效率高的做法

只有当组件的state或props数据发生改变时才重新render()

原因

Component中的shouldComponentUpdate()总是返回true

解决

办法1: 
	重写shouldComponentUpdate()方法
	比较新旧state或props数据, 如果有变化才返回true, 如果没有返回false
办法2:  
	使用PureComponent
	PureComponent重写了shouldComponentUpdate(), 只有state或props数据有变化才返回true
	注意: 
		只是进行state和props数据的浅比较, 如果只是数据对象内部数据变了, 返回false  
		不要直接修改state数据, 而是要产生新数据
项目中一般使用PureComponent来优化

所以不建议这样的写法:

const obj = this.state

obj.carName = ‘abc’//或者unshitf,push等

this.setState(obj)//修改失败


7. render props

如何向组件内部动态传入带内容的结构(标签)?

Vue中: 
	使用slot技术, 也就是通过组件标签体传入结构  <A><B/></A>
React中:
	使用children props: 通过组件标签体传入结构
	使用render props: 通过组件标签属性传入结构,而且可以携带数据,一般用render函数属性

children props

<A>
  <B>xxxx</B>
</A>
{this.props.children}
问题: 如果B组件需要A组件内的数据, ==> 做不到 

render props

<A render={(data) => <C data={data}></C>}></A>
A组件: {this.props.render(内部state数据)}
C组件: 读取A组件传入的数据显示 {this.props.data} 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O8bqKBpL-1630724039136)(D:\react\react全家桶资料\react全家桶资料\01_课件\React扩展.assets\image-20210904102433596.png)]


8. 错误边界

理解:

错误边界(Error boundary):用来捕获后代组件错误,渲染出备用页面

特点:

只能捕获后代组件生命周期产生的错误,不能捕获自己组件产生的错误和其他组件在合成事件、定时器中产生的错误

使用方式:

getDerivedStateFromError配合componentDidCatch

// 生命周期函数,一旦后台组件报错,就会触发
static getDerivedStateFromError(error) {
    console.log(error);
    // 在render之前触发
    // 返回新的state
    return {
        hasError: true,
    };
}

componentDidCatch(error, info) {
    // 统计页面的错误。发送请求发送到后台去
    console.log(error, info);
}

9. 组件通信方式总结

组件间的关系:
  • 父子组件
  • 兄弟组件(非嵌套组件)
  • 祖孙组件(跨级组件)
几种通信方式:
	1.props:		(1).children props		(2).render props	2.消息订阅-发布:		pubs-sub、event等等	3.集中式管理:		redux、dva等等	4.conText:		生产者-消费者模式
比较好的搭配方式:
	父子组件:props	兄弟组件:消息订阅-发布、集中式管理	祖孙组件(跨级组件):消息订阅-发布、集中式管理、conText(开发用的少,封装插件用的多)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react补充--hooks 的相关文章

  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • className 属性是否承担 Reactjs 中 id 属性的角色?

    由于 id 属性在 Reactjs 组件中很少使用 因为 id 属性意味着组件不会被重用 那么是否使用 className 属性来代替 id 呢 如果是这样的话 那么 Reactjs 中相当于 HTML 中的 class 属性的是什么 cl
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 如何渲染变量(或 prop)内部的 jsx/html?

    const Footer gt let a b Hey b return div Some bold text a div 这只会呈现为Some bold text b Hey b 如何将粗体文本渲染为粗体 变量内容是我自己的 所以我不必担
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 使用 ApolloClient 从 useContext 挂钩导入一个简单变量

    我的反应相对较新 似乎无法导入client来自上下文的变量 我有一个名为 federation tsx 的文件 其中包含一些代码 我相信这应该是相关部分 const link createHttpLink uri process env U
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • 增程式电动汽车电控系统优化方法【matlab】

    一 主要内容 针对增程式电动汽车的传动系统架构 结合增程式乘用车和增程式电动公交的设计 对传动系统关键部件选型匹配以及电控系统工作模式进行论述 并论述了工况对行驶里程 以及电池充放电的影响因素 对通用汽车的Volt增程式电动汽车进行分析研究
  • B站价值60亿跨年晚会背后的微服务治理

    B站价值60亿跨年晚会背后的微服务治理 大家都知道微服务有两个痛点 一个是如何拆分微服务 微服务的边界怎么划分制定 二是微服务上了规模之后如何管理 因为只要上了规模 任何小小的问题都可能会被放大 最后导致雪崩效应 一 微服务化带来的挑战 上
  • 《Spring 5.x源码解析之Spring AOP 注解驱动使用及其实现原理》

    Spring 5 x源码解析之Spring AOP 注解驱动使用及其实现原理 学好路更宽 钱多少加班 mercyblitz 一 前言 大家好 欢迎阅读 Spring 5 x源码解析 系列 本篇作为该系列的第二篇 重点介绍Spring AOP
  • 离线搭建深度学习环境

    离线搭建深度学习环境 文章目录 离线搭建深度学习环境 Anaconda3离线安装 借助可联网PC下载安装包 安装Anaconda3 配置深度学习环境 获取深度学习环境 打包深度学习环境 拷贝深度学习环境 添加深度学习环境到环境列表 有时出于
  • Linux使用套接字 udp协议传输

    第一步是来认识库 需要哪些库 需要哪些库中的函数 哥们也只是 初学者 仅仅只是会调用的地步 后面有机会再加深 首先咱们需要清除的知道工作流程 第二步是直接写代码 开发工具 qtcreator6 环境 win10 虚拟机 ubuntu20 0
  • Vue学习杂记(五)——loader的使用

    Vue学习杂记 五 loader的使用 一 什么是loader 二 loader处理css 三 loader处理图片 四 loader处理高级的js语法 参考文献 引言 loader其实也是webpack系列的内容 考虑到webpack涉及
  • gradle使用教程,小白一篇就够

    概述 Gradle是新一代构建工具 从0 x版本一路走来虽然国内可寻的资料多了一些 但都是比较碎片化的知识 官方的Userguide虽然是业内良心之作 但无奈太长 且版本变化较快 又鉴于很多同学一看到英文内心便已认定无法读懂 遂打算利用业余
  • E tensorflow/stream_executor/cuda/cuda_dnn.cc:352] Loaded runtime CuDNN library: 5005 (compatibility

    WARNING tensorflow From usr local lib python2 7 dist packages tensorflow python util tf should use py 170 initialize all
  • MySQL逻辑架构图分析

    MySQL逻辑架构图 大体来说 MySQL 可以分为 Server 层和存储引擎层两部分 Server层 大多数MySQL的核心服务功能都在这一层 包括连接器 查询缓存 分析器 优化器 执行器 以及所有内置函数 日期 时间 数学 加密函数等
  • pnpm:高效、快速的npm

    什么是pnpm performent npm 速度快 节省磁盘空间的软件包管理器 为什么使用pnpm 使用npm安装依赖时 每次都会下载文件到硬盘中 当项目数量较多时 依赖包会占据大量的内存 pnpm就是解决这个问题的 pnpm如何解决 p
  • 手把手教你设置Typora的图床-gitee

    所需环境 typora node软件 所需软件及配置文末可下载 typora的激活安装可看以往教程点我查看typora激活 typora结合gitee图床的优势 分享文件只需要分享一个 md文件即可 插入的图片依旧可以访问 图床不限制 访问
  • Python创建索引,批量插入数据测试

    测试 coding utf 8 Created on 2019 6 13 10 19 25 author chenlin3 import esSdk class EsSdkTest def test self name EsSdkTest
  • CVE-2023-21839 【vulhub weblogic 漏洞复现】

    漏洞概述 由于Weblogic IIOP T3协议存在缺陷 当IIOP T3协议开启时 允许未经身份验证的攻击者通过IIOP T3协议网络访问攻击存在安全风险的WebLogic Server 漏洞利用成功WebLogic Server可能被
  • Docker部署springboot项目并连接上docker的mysql

    首先 我是参考着几篇博客 https blog csdn net hangao233 article details 104395693 https www jianshu com p 397929dbc27d 第一步 先在虚拟机或服务器上
  • 【毕业设计】机器学习的员工离职模型研究-python

    目录 前言 课题背景和意义 实现技术思路 变量分析 数据导入 构建机器学习模型 1 1 复制数据删除不需要的变量 1 2 列变量属性分类 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备
  • 谁动了我的奶酪:奶酪墙上的话 ----- 整理完整篇

    谁动了我的奶酪墙上的话 如果你无所谓 你会怎样做呢 每天的生活都会因偶然或必然的事而不断变化着 提醒自己要不断地适应变化 拥有奶酪 就拥有幸福 奶酪对你越重要 你就越想抓住它 如果你不改变 你就会被淘汰 如果你无所畏惧 你会怎样做呢 经常闻
  • 类和对象

    1 面向过程 在开发一个程序的时候 看中的是中间的过程 每一个过程步骤都需要自己去做 例如C语言 看中的是过程的开发 2 面向对象 当开发一个程序的时候 不看重具体的过程 看中谁能帮我去完成这件事情 找人 对象 帮我去做 前期去设计类的时候
  • N圆最密堆积、最小外接正方形的matlab求解(二维、三维等圆Packing 问题)

    圆形最密堆积 最小外接正方形的matlab求解 二维 三维等圆Packing 问题 0 前言 1 N个圆的最小外接正方形求解 2 N个球的最小外接立方体求解 惯例声明 本人没有相关的工程应用经验 只是纯粹对相关算法感兴趣才写此博客 所以如果
  • cesium for ue->CesiumRunTime

    共118个文件 23283行 含注释 截至2022年11月10日 剩下118个文件 23283行 截至2022年11月20日 剩下108个文件 21646行
  • react补充--hooks

    1 setState setState更新状态的2种写法 1 setState stateChange callback 对象式的setState 1 stateChange为状态改变对象 该对象可以体现出状态的更改 2 callback是