react中组件通信

今天我们来说一下react中的组件通信流程。

react中组件通信流程分为父传子、子传父、非父子之间传值。

1.父传子组件通信

思路:1.在父组件的子组件中绑定一个自定义属性,自定义属性的值就是传递的数据

2.在子组件中通过this.props来接收父组件传递过来的数据,函数组件通过参数来接收

类组件中使用参考代码

父组件                                                         

子组件

函数组件中使用参考代码

函数式组件通过参数接收父组件传递过来的参数

在类组件中,如果使用了构造函数, 应该将 props 传递给 super ,否则无法在构造函数中获取
props

2.props

props 的特点
1. 可以给组件传递任意类型的数据
2. props 只读 的对象,只能读取属性的值,无法修改对象
props children 属性
通过 props 属性模拟 vue 中的匿名插槽

3.通过父传子组件通信模拟vue中的具名插槽

4.props属性值验证

有时候别人在使用我们封装好的组件的时候,传递值和我们预期的值可能会不一样。这样就
会导致报错,而为了能够让用户快速的找到报错的原因及时修改,我们往往要对我们接收的
props 参数进行验证
props 校验的步骤
1. 安装 prop - types 第三方包
2. 导入 props - types
3. 使用 组件名 .propTypes = {} 来给组件的 props 添加校验规则
4. 校验规则通过 PropTypes 对象来指定
如果我们传递的 props 类型和我们要求的不一样,则会报错
props 属性值的约束规则
常见类型: array bool func number object string
React 元素类型: element
必填项: isRequired
特定结构的对象: shape({ })
props 约束规则示例
props 属性的默认值
有的时候我们为了让我们的组件使用起来更方便,需要给组件设置默认值,即在不传递该属
性时生效,传递后以传递的值为准
语法格式: 组件名 .defaultProps

5. 子传父组件通信

思路:子传父组件通过利用的是回调函数的方式。即在父组件中定义函数,在子组件中调用函数
步骤:
1. 在父组件中定义一个回调函数
2. 在子组件的标签上定义一个自定义属性,值为定义的回调函数
3. 在子组件中通过 this.props 来调用这个函数,并将要传递的数据作为参数传递给该函数

6. 兄弟组件之间通信

状态提升
将共享状态 ( 数据 ) 提升的最近的公共父组件中,由父组件统一管理这个状态
父组件
组件 A
组件 B

发布订阅模式

基本原理:订阅者提供一个回调函数,保存到一个数组中;发布者调用数组中的回调函数,
传递参数
发布中心 bus.js
组件 A
组件 B

7. Context实现跨组件之间的通信

Context 可以实现将根组件中的数据传递给其任意的子组件数据。可以传递给儿子,也可以跨过儿
子直接给孙子
使用步骤
1. src 目录下创建一个 bus.js 文件并调用 createContext() 方法,创建一个 context 对象,
然后导出
2. App 根组件中从 bus.js 中导入 Provider 组件,用来提供数据
3. 使用 Provider 组件作为父节点
4. 设置 value 属性,值为要传递的数据
5. 指定 contextType 读取当前创建的 context 对象
6. 使用 this.context 来渲染值
参考代码
bus.js
根组件 App.js
子组件 B
如果是函数组件可以通过 Consumer 来渲染数据
React父子组件通信可以通过props属性和回调函数来实现。父组件可以通过props属性将数据传递给子组件,子组件可以通过props属性接收数据。而子组件要将数据传递给父组件,则需要通过回调函数的方式来实现。 具体实现方法如下: 1. 父组件通过props属性将数据传递给子组件: ```jsx // 父组件 import React from 'react'; import ChildComponent from './ChildComponent'; class ParentComponent extends React.Component { render() { const data = '这是父组件传递给子组件的数据'; return ( <div> <ChildComponent data={data} /> </div> ); } } // 子组件 import React from 'react'; class ChildComponent extends React.Component { render() { const { data } = this.props; return ( <div> <p>子组件接收到的数据:{data}</p> </div> ); } } ``` 2. 子组件通过回调函数将数据传递给父组件: ```jsx // 父组件 import React from 'react'; import ChildComponent from './ChildComponent'; class ParentComponent extends React.Component { handleData = (data) => { console.log('父组件接收到的数据:', data); } render() { return ( <div> <ChildComponent onData={this.handleData} /> </div> ); } } // 子组件 import React from 'react'; class ChildComponent extends React.Component { handleClick = () => { const data = '这是子组件传递给父组件的数据'; this.props.onData(data); } render() { return ( <div> <button onClick={this.handleClick}>传递数据给父组件</button> </div> ); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值