React扩展(二)

React扩展(二)

一、Fragment介绍

1、语法:

javascript 复制代码
// Fragment 可以添加属性,而空标签<></>不可以
<Fragment></Fragment>
// 简写形式
<></>

2、作用: 可以不用必须有一个真实的DOM标签,解决jsx语法中多标签下必要一个div父级标签包裹的问题

二、useContent

1、定义: 一种组件通信方式,常用于祖先组件跟后代组件通信

2、语法:

javascript 复制代码
// 祖先组件Parent
// 创建Content容器
const userContext = createContext()
// 渲染时,在祖先组件包裹UserContext.Provider,通过value属性传给后代组件
<UserContext.Provider value={{username: 'tom', age: 18}}>
 <Children />
 </UserContext.Provider>
javascript 复制代码
// 后代组件读取数据
import { UserContext } from './Parent'
const user = useContent(UserContext)

return <h1>{user.username} - {user.age}</h1>

3、注意

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

三、组件优化

1、component的问题

复制代码
1.1 只要执行setState,即使不改变状态数据,组件也会重新render
1.2 当前组件重新render,就会自动重新render子组件,纵使子组件没有用到父组件的任何数据,这样会导致效率低下

2、效率高的做法

只有当组件的stae/props数据发生改变时才重新render

3、原因

component中的shouldComponentUpdate钩子函数总是返回true

4、解决方案

复制代码
4.1 办法一: 重写shouldComponentUpdata方法,比较新旧state/props数据,如果有变化才返回true,否则为false
4.2 办法二: 使用PureComponent,pureComponent重写了shouldComponentUpdate方法,只有state/props数据有变化才返回true
4.3 使用办法一只是进行state/props数据浅比较,如果只是数据对象内部变化,返回false,不要直接修改state数据,而是要产生新数据;在项目开发中一般使用pureComponent优化

四、render props

1、定义

类似于Vue中的插槽,向组件内部动态传入带内容结构

Vue: 使用slot技术,也就是通过组件标签传入结构

React: 使用children props,通过组件标签体传入结构;使用render props,通过组件标签属性传入结构,一般用renders属性

2、children props语法

javascript 复制代码
// 如果B组件需要A组件内部数据无法实现
<A>
   <B />
</A>

3、render props

javascript 复制代码
// A组件读取数据: {this.props.render(data)}
<A render={date => <B data={data} />} />

五、错误边界

1、定义: 用来捕获后代组件错误,渲染出备用页面

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

3、使用方式

javascript 复制代码
// 生命周期函数:一旦后代组件报错触发
static getDeivedStateFromError(error) {
	// todo
	return { hasError: error}
}
// 统计页面错误,发送请求统计
componentDidCatchError(error, info){
	// todo
}

六、组件通信方式总结

1、组件间关系及适合通信方式

复制代码
1.1 父子关系: props
1.2 兄弟关系: 消息订阅、集中式管理(redux)
1.3 祖孙关系: 消息订阅-发布、集中式管理(redux)、useContext

2、通信方式

复制代码
2.1 props: children props、render props
2.2 消息订阅-发布: pub-sub、event
2.3 集中式管理: redux、dva等
2.4 context: 生产者-消费者模式
相关推荐
kyriewen4 小时前
我逐个测了 JSON.stringify 的 7 个坑:第 1 个就在丢数据
前端·javascript·程序员
积流成海4 小时前
用代码实现哈希计算器:Web Crypto API 实战
前端·算法·哈希算法·哈希函数·盘子工具站
data analyse 4565 小时前
服务端访问日志聚合 PV 与 UV 怎么实现?日志采集与口径设计
大数据·前端·数据分析
song5015 小时前
React Native for OpenHarmony 实战:三方库 react-native-ratings 的鸿蒙化适配指南
javascript·react native·react.js·分类·harmonyos
JavaGuide5 小时前
DeepSeek Harness 重磅更新,Codex、Claude Code 子智能体进官方插件列表了,还有 Git 工作树和思考翻译!
前端·后端
小羊没烦恼!5 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
朱包林5 小时前
iTerm2终端配置指南
linux·javascript·python·云原生·容器·kubernetes·云计算
谢亮_vipxieliang5 小时前
JavaScript this 指向完全指南:调用位置决定一切
开发语言·javascript·ecmascript
Eiceblue6 小时前
使用 Python 实现 Excel 行列转置(保留单元格样式)
前端·python·excel
WeiXin_DZbishe6 小时前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计