react组件的参数怎样定义的(详解React中组件之间通信的方式)
react组件的参数怎样定义的
详解React中组件之间通信的方式 一、是什么我们将组件间通信可以拆分为两个词:
- 组件
- 通信
回顾Vue系列的文章,组件是vue
中最强大的功能之一,同样组件化是React
的核心思想
相比vue
,React
的组件更加灵活和多样,按照不同的方式可以分成很多类型的组件
而通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的,广义上,任何信息的交通都是通信
组件间通信即指组件通过某种方式来传递信息以达到某个目的
二、如何通信组件传递的方式有很多种,根据传送者和接收者可以分为如下:
- 父组件向子组件传递
- 子组件向父组件传递
- 兄弟组件之间的通信
- 父组件向后代组件传递
- 非关系组件传递
父组件向子组件传递
由于React
的数据流动为单向的,父组件向子组件传递是最常见的方式
父组件在调用子组件的时候,只需要在子组件标签内传递参数,子组件通过props
属性就能接收父组件传递过来的参数
function EmailInput(props) { return ( <label> Email: <input value={props.email} /> </label> ); } const element = <EmailInput email="123124132@163.com" />;
子组件向父组件传递
子组件向父组件通信的基本思路是,父组件向子组件传一个函数,然后通过这个函数的回调,拿到子组件传过来的值
父组件对应代码如下:
class Parents extends Component { constructor() { super(); this.state = { price: 0 }; } getItemPrice(e) { this.setState({ price: e }); } render() { return ( <li> <li>price: {this.state.price}</li> {/* 向子组件中传入一个函数 */} <Child getPrice={this.getItemPrice.bind(this)} /> </li> ); } }
子组件对应代码如下:
class Child extends Component { clickGoods(e) { // 在此函数中传入值 this.props.getPrice(e); } render() { return ( <li> <button onClick={this.clickGoods.bind(this, 100)}>goods1</button> <button onClick={this.clickGoods.bind(this, 1000)}>goods2</button> </li> ); } }
兄弟组件之间的通信
如果是兄弟组件之间的传递,则父组件作为中间层来实现数据的互通,通过使用父组件传递
class Parent extends React.Component { constructor(props) { super(props) this.state = {count: 0} } setCount = () => { this.setState({count: this.state.count + 1}) } render() { return ( <li> <SiblingA count={this.state.count} /> <SiblingB onClick={this.setCount} /> </li> ); } }
父组件向后代组件传递
父组件向后代组件传递数据是一件最普通的事情,就像全局数据一样
使用context
提供了组件之间通讯的一种方式,可以共享数据,其他数据都能读取对应的数据
通过使用React.createContext
创建一个context
const PriceContext = React.createContext('price')
context
创建成功后,其下存在Provider
组件用于创建数据源,Consumer
组件用于接收数据,使用实例如下:
Provider
组件通过value
属性用于给后代组件传递数据:
<PriceContext.Provider value={100}>
</PriceContext.Provider>
如果想要获取Provider
传递的数据,可以通过Consumer
组件或者或者使用contextType
属性接收,对应分别如下:
class MyClass extends React.Component { static contextType = PriceContext; render() { let price = this.context; /* 基于这个值进行渲染工作 */ } }
Consumer组件:
<PriceContext.Consumer> { /*这里是一个函数*/ } { price => <li>price:{price}</li> } </PriceContext.Consumer>
非关系组件传递
如果组件之间关系类型比较复杂的情况,建议将数据进行一个全局资源管理,从而实现通信,例如redux
。关于redux
的使用后续再详细介绍
由于React
是单向数据流,主要思想是组件不会改变接收的数据,只会监听数据的变化,当数据发生变化时它们会使用接收到的新值,而不是去修改已有的值
因此,可以看到通信过程中,数据的存储位置都是存放在上级位置中
到此这篇关于React中组件之间通信的方式的文章就介绍到这了,更多相关React组件之间通信内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- react高阶组件怎么用(React 高阶组件HOC用法归纳)
- react怎样实现响应式计算属性(深入浅析React中diff算法)
- reactmap给了key仍然提示错误(react为什么不推荐使用index作为key)
- react怎么添加动态html(react中的DOM操作实现)
- vue中的ref(Vue3.0中Ref与Reactive的区别示例详析)
- react绑定详解(React列表栏及购物车组件使用详解)
- react实现js控制样式(React + Threejs + Swiper 实现全景图效果的完整代码)
- react教程简介(react入门级详细笔记)
- react 组件如何发布(React如何创建组件)
- vue react和angular(详解React Angular Vue三大前端技术)
- react常用组件及作用(React中的Context应用场景分析)
- react和antd管理系统(手把手教你从零开始react+antd搭建项目)
- react的setstate第二个参数(示例详解react中useState的用法)
- reactnative混合开发教程(教你使用vscode 搭建react-native开发环境)
- react 查看word文件(React实现导入导出Excel文件)
- react native web白屏(关于React Native 无法链接模拟器的问题)
- NVIDIA显卡份额冲上88 A饭发愁 游戏优化恐没A卡份了(NVIDIA显卡份额冲上88A饭发愁)
- AMD YES A卡还是N卡 A卡和N卡的区别(AMDYESA卡还是N卡)
- 以后显卡多了一个新选择,N卡和A卡外又多了个I卡(以后显卡多了一个新选择)
- 读卖乐园的彩灯(读卖乐园的彩灯)
- 新疆80后在淘宝卖干果 以前是 不务正业 如今帮乡亲致富(新疆80后在淘宝卖干果)
- 弄清楚了销 售 买 卖这四个字,母婴生意做起来就没那么难了(弄清楚了销售买)
热门推荐
- docker 跨主机的网络通信(docker 基于golang镜像构建 ssh服务的方法)
- 宝塔面板使用外部数据库(宝塔面板负载状态load average中的数据代表了什么?)
- apache和php如何配置(Apache2与PHP5 for WinXP简单配置技巧)
- python3和python区别(Python2与Python3的区别实例总结)
- python批量转换图片格式(利用Python对文件夹下图片数据进行批量改名的代码实例)
- dedecms用法(将百度编辑器Ueditor整合到dedecms中的方法)
- phpcurl请求能在日志里记录吗(php使用curl模拟多线程实现批处理功能示例)
- jQuery on()方法
- js手写数组去重(JS对象数组去重的3种方法示例及对比)
- filezilla服务器支持断点续传吗(Filezilla Server配置FTP服务器提示操作超时的解决办法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9