React尚硅谷115-126(setState、Hooks、Fragment、context、组件优化、renderprops、错误边界、组件通信方式总结)

2023-05-16

115.项目打包运行

npm install serve -g

serve build

116.setState

setState是同步的,但是引起页面更新动作是异步的(状态的更新是异步的)

相当于this.$nextTick()

setState(stateChange, [callback])------对象式的setState
1.stateChange为状态改变对象(该对象可以体现出状态的更改)
2.callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用 setState(updater, [callback])------函数式的setState

​ 1.updater为返回stateChange对象的函数。
​ 2.updater可以接收到state和props。
​ 4.callback是可选的回调函数, 它在状态更新、界面也更新后(render调用后)才被调用。

this.setState((state,props)=>{
return {count:state.count+1}
})

总结:
1.对象式的setState是函数式的setState的简写方式(语法糖)
2.使用原则:
(1).如果新状态不依赖于原状态 ===> 使用对象方式
(2).如果新状态依赖于原状态 ===> 使用函数方式
(3).如果需要在setState()执行后获取最新的状态数据,
要在第二个callback函数中读取

117.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>

118.stateHook

(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作
(2). 语法: const [xxx, setXxx] = React.useState(initValue)  
(3). useState()说明:
        参数: 第一次初始化指定的值在内部作缓存
        返回值: 包含2个元素的数组,1个为内部当前状态值, 第2个为更新状态值的函数
(4). setXxx()2种写法:
        setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
        setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值

119.Effect Hook

(1). Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
(2). React中的副作用操作:
        发ajax请求数据获取
        设置订阅 / 启动定时器
        手动更改真实DOM
(3). 语法和说明: 
        useEffect(() => { 
          // 在此可以执行任何带副作用操作
          return () => { // 在组件卸载前执行
            // 在此做一些收尾工作, 比如清除定时器/取消订阅等
          }
        }, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行
    
(4). 可以把 useEffect Hook 看做如下三个函数的组合
        componentDidMount()
        componentDidUpdate()
    	componentWillUnmount() 

120.Ref Hook

(1). Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
(2). 语法: const refContainer = useRef()
(3). 作用:保存标签对象,功能与React.createRef()一样

121,Fragment文档碎片

import React,{Fragment} from 'react'

<Fragment></Fragment>//好处是可以使用key值,参与遍历,不能传别的值

<></>

122,context

只能用value传,可以传对象,字符串

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

使用:

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>

123.PureComponent和优化

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

124.renderProps

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

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} 

126.组件间的关系:

  • 父子组件
  • 兄弟组件(非嵌套组件)
  • 祖孙组件(跨级组件)

几种通信方式:

	1.props:
		(1).children props
		(2).render props
	2.消息订阅-发布:
		pubs-sub、event等等
	3.集中式管理:
		redux、dva等等
	4.conText:
		生产者-消费者模式

比较好的搭配方式:

	父子组件:props
	兄弟组件:消息订阅-发布、集中式管理
	祖孙组件(跨级组件):消息订阅-发布、集中式管理、conText(开发用的少,封装插件用的多)

125.错误边界

#### 理解:

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

#### 特点:

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

##### 使用方式:

getDerivedStateFromError配合componentDidCatch

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

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

126,总结通信方式

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

React尚硅谷115-126(setState、Hooks、Fragment、context、组件优化、renderprops、错误边界、组件通信方式总结) 的相关文章

随机推荐

  • 【UCOSIII操作系统】消息队列篇(1)消息队列

    UCOSIII操作系统 UCOSIII操作系统 消息队列篇 xff08 1 xff09 消息队列消息队列常用函数消息队列概念简介创建消息队列 gt OSQCreate 消息队列删除 gt OSQDel 消息队列发送 gt OSQPost 消
  • 路由器技术深入剖解

    嵌入式设备就是使用微处理器或微控制器芯片 MCU 加上外围电路再加上内部的程序部分来实现特定功能的嵌入设备 比如8位的单片机 32的ARM以及DSP芯片等都属于嵌入式核心芯片的范畴 8位MCU市场已逐步趋向稳定 xff0c 32位MPU代表
  • 使用Docker创建Hexo博客并部署到github.io

    最近换了份工作 所以想把拖延了很久的blog重拾起来 除了CSDN还想维护一份github io 所以先设置下本地的hexo环境 但是都9102年了 应该使用Docker setup 比较好 使用我已经制作好的docker image do
  • Windows 安装双系统linux,磁盘分区及大小

    1 xff09 5G 主分区 空间起始位置 Ext4日志文件系统 25 2 xff09 内存的大小4GB 逻辑分区 空间起始位置 swap交换空间 无挂载点 10 3 xff09 200MB 逻辑分区 空间起始位置 Ext4日志文件系统 b
  • 4年产品点滴心路——谈谈形而上的3个产品素质

    我是一名互联网产品人员 xff0c 曾供职过多家互联网公司 xff0c 包括一些员工数千的老牌龙头企业和一些初创公司 排除老生常谈的产品技能以及方法论 xff0c 我最近对一些大型企业初创项目 新型领域创业公司的产品人员的工作软实力有很大兴
  • 基于LMS8962的跑马灯教学程序——定时器、串口及GPIO的使用

    基于LMS8962的跑马灯教学程序 定时器 串口及GPIO的使用 一 电路原理图 从图中可知 xff0c 各LED是逢GPIO口为0 xff0c 即低电平时亮 xff0c 为1 xff0c 即高电平时灭 xff0c 呈反逻辑 由于四灯接至引
  • 四年产品点滴心路(二)——互联网公司的组织规模与产品特点浅析

    新年伊始 xff0c 让我们放慢脚步 xff0c 回溯互联网服务长河的源头 xff1a 计算机技术 2000年以来 xff0c 国内普通大学里 xff0c 一位只要对计算机 软件有兴趣并打算在此行业长远发展的大学生 xff0c 大都经历过在
  • 百川纳海,移动称雄——辽宁工程技术大学2011移动开发者大会见闻

    2011年11月3日 xff0c IT界翘首瞩目的2011中国北京移动开发者大会 xff08 MDCC xff09 在北京国家会议中心如期举行 本次MDCC由CSDN和创新工场联合主办 xff0c 以 移动大变局下的抉择 为标题 xff0c
  • 云之彼端,牵手未来—— “我思故我在”—我眼中的第四届中国云计算大会

    一 xff0e 满怀激动踏征程 第四届全国云计算大会初体验 2012年5月23日至25日 业界瞩目的第四届中国云计算大会 xff08 以下简称 大会 xff09 在京隆重举行 本次大会由国家发展和改革委员会 工业和信息化部 北京市人民政府及
  • 落花渐欲迷人眼,移动前景看用户

    火红的深秋10月 xff0c 万众瞩目的第三届中国移动开发者大会于19日在北京国家会议中心如期举行 本次大会邀请到了诸多互联网巨头公司中相关项目负责人及移动互联先驱精英 xff0c 百家争艳齐聚一堂 xff0c 共同探讨在移动互联网高速发展
  • 新员工总结

    感谢29 日下午张宁主编为我们移动频道新员工安排的培训 通过本次员工培训 xff0c 在工作目标和方向上有了较为清晰的认识 xff0c 主要总结如下 xff1a 1 明确移动频道工作重心 xff1a 移动 应用 开发 围绕这三点 xff0c
  • 微软Win8开发马拉松感悟

    前几天前往微软win8开发者马拉松大赛 xff0c 对于微软中国有了一些了解 xff0c 也有了一些体悟 xff0c 在这里稍微记录一下 首先一点就是微软对于开发者的态度 在会场看到了许多沙发和抱枕 xff0c 还有毛毯等 xff0c 另外
  • 基于prometheus的网络指标监控

    1 网络指标监控 网络设备 交换机 路由器 防火墙 本身并没有太多的监控方式 xff0c 常规的是使用snmp xff0c 通过oid去采集网络设备的指标 xff0c 例如 xff0c 流量或者错包 xff0c 不过近年来也出现了新的采集方
  • 【解决】UART问题

    UART和USART区别 UART xff08 Universal asynchronous receiver transmitter xff09 xff1a 通用异步收发器 USART xff08 Universal synchronou
  • 小白也能配置VScode的C/C++环境

    必要软件的下载 前往下方Github链接下载 xff0c 选择这里下载 下载地址 xff1a https github com SDchao AutoVsCEnv WPF releases latest 2022 9 25 更新 xff1a
  • 网络协议栈0:从一个例子开始

    最近因工作需要写一个网卡驱动 xff0c 晕倒 xff0c 没有任何网络知识 xff0c 就写网络驱动 xff01 可是 xff0c 为了五斗米糊口 xff0c 不得不从啊 于是 xff0c 打算从网络协议栈开始 xff0c 把网络搞一搞
  • Ubuntu 18.04 Intel RealSense D435i 相机标定教程

    1 D435i相机简介 RealSenseD435i 是一款立体视觉深度相机 xff0c 如下图所示 xff0c 其集成了两个红外传感器 xff08 IR Stereo Camera xff09 一个红外激光发射器 xff08 IR Pro
  • 使用IDEA创建Servlet项目

    使用 IDEA创建Servlet项目 原料 xff1a IDEA 2016 xff0c Tomcat8 0 步骤如下 xff1a 1 创建项目 File gt New gt Project gt Java Enterprise 如下图所示
  • px4基本知识

    1 PX4自驾仪 PX4是与平台无关的自动驾驶仪软件 xff08 或称为固件 xff09 xff0c 可以驱动无人机或无人车 它可以被烧写在某些硬件 xff08 如Pixhawk v2 xff09 xff0c 并与地面控制站在一起组成一个完
  • React尚硅谷115-126(setState、Hooks、Fragment、context、组件优化、renderprops、错误边界、组件通信方式总结)

    115 项目打包运行 npm install serve g serve build 116 setState setState是同步的 xff0c 但是引起页面更新动作是异步的 xff08 状态的更新是异步的 xff09 相当于this