位置: IT常识 - 正文

React组件通信-父子组件间的通信(react组件调用方法)

编辑:rootadmin
React组件通信-父子组件间的通信 文章目录React父子组件通信认识组件嵌套组件通信父传子参数验证子传父React父子组件通信认识组件嵌套

推荐整理分享React组件通信-父子组件间的通信(react组件调用方法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react函数组件通信,react 不同组件间通信,react 组件传递数据,react组件写法,react 组件传递数据,react的组件通信,react的组件通信,react组建通信,内容如对您有帮助,希望把文章链接给更多的朋友!

组件之间存在嵌套关系:

在之前的案例中,我们只是创建了一个组件App;

如果我们一个应用程序将所有的逻辑都放在一个组件中,那么这个组件就会变成非常的臃肿和难以维护;

所以组件化的核心思想应该是对组件进行拆分,拆分成一个个小的组件;

再将这些组件组合嵌套在一起,最终形成我们的应用程序;

上面的嵌套逻辑如下,它们存在如下关系:

App组件是Header、Main、Footer组件的父组件;

import React, { Component } from 'react'import Header from './Header'import Main from "./Main"import Footer from './Footer'export class App extends Component { render() { return ( <div> <Header/> <Main/> <Footer/> </div> ) }}export default App

Main组件是Banner、ProductList组件的父组件

import React, { Component } from 'react'import Banner from './Banner'import ProductList from './ProductList'export class Main extends Component { render() { return ( <div> <div>Main</div> <Banner/> <ProductList/> </div> ) }}export default Main组件通信

在开发过程中,我们会经常遇到需要组件之间相互进行通信:

比如App可能使用了多个Header,每个地方的Header展示的内容不同,那么我们就需要使用者传递给Header一些数据,让其进行展示;

又比如我们在Main中一次性请求了Banner数据和ProductList数据,那么就需要传递给他们来进行展示;

也可能是子组件中发生了事件,需要由父组件来完成某些操作,那就需要子组件向父组件传递事件;

总之,在一个React项目中,组件之间的通信是非常重要的环节;

父传子

父组件在展示子组件时,可能会传递一些数据给子组件:

父组件通过 属性=值的形式来传递给子组件数据;

子组件通过 this.props 获取父组件传递过来的数据;

例如我们来看这样一个需求, 父组件将定义的数组books传递给子组件, 由子组件进行展示

React组件通信-父子组件间的通信(react组件调用方法)

将数组传递给子组件

export class App extends Component { constructor() { super() this.state = { books: [ {name: "算法导论", price: 79}, {name: "数据结构", price: 69}, {name: "漫画算法", price: 59}, ] } } render() { const { books } = this.state return ( <div> {/* 将数据传递给子组件 */} <Header books={books}/> </div> ) }}

在子组件接受父组件传递的数据

export class Header extends Component { render() { // 接受父组件传递过来的参数 const { books } = this.props return ( <div> <ul> { books.map(item => { return ( <li key={item.name}> 名称: {item.name} 价格: {item.price} </li> ) }) } </ul> </div> ) }}参数验证

对于传递给子组件的数据,有时候我们可能希望进行验证,特别是对于大型项目来说:

当然,如果你项目中默认继承了Flow或者TypeScript,那么直接就可以进行类型验证;

但是,即使我们没有使用Flow或者TypeScript,也可以通过 prop-types 库来进行参数验证;

从 React v15.5 开始,React.PropTypes 已移入另一个包中:prop-types 库

使用方法, 先在子组件中导入PropTypes, 再对传递过来的元素添加类型限制即可

import React, { Component } from 'react'// 导入PropTypesimport PropTypes from 'prop-types'export class Header extends Component { render() { const { books, name, age } = this.props return ( <div> <div>名字: {name} 年龄: {age}</div> <ul> { books.map(item => { return ( <li key={item.name}> 名称: {item.name} 价格: {item.price} </li> ) }) } </ul> </div> ) }}// 对参数添加类型的限制Header.propTypes = { // 表示传入的类型是要求一个数组, 并且必传 books: PropTypes.array.isRequired, // 传入类型string, 非必传 name: PropTypes.string, // 传入类型number, 非必传 age: PropTypes.number}export default Header

更多的验证方式,可以参考官网:https://zh-hans.reactjs.org/docs/typechecking-with-proptypes.html

比如验证数组,并且数组中包含哪些元素;

比如验证对象,并且对象中包含哪些key以及value是什么类型;

比如某个原生是必须的,使用 requiredFunc: PropTypes.func.isRequired

如果没有传递,我们希望有默认值呢?

我们使用defaultProps就可以了

Header.defaultProps = { name: "默认名称"}子传父

某些情况,我们也需要子组件向父组件传递消息:

在vue中是通过自定义事件来完成的;

在React中同样是通过props传递消息,只是让父组件给子组件传递一个回调函数,在子组件中调用这个函数即可;

我们这里来完成一个案例:

将计数器案例进行拆解;

将按钮封装到子组件中:CounterButton;

CounterButton发生点击事件,将内容传递到父组件中,修改counter的值;

演示代码

父组件传递一个事件给子组件CounterButton

import React, { Component } from 'react'import ConterButton from './c-cpn/ConterButton'export class App extends Component { constructor() { super() this.state = { conter: 100 } } changeConter(conter) { this.setState({ conter: this.state.conter + conter }) } render() { const { conter } = this.state return ( <div> <h2>{conter}</h2> {/* 向子组件中传入一个事件 */} <ConterButton getConter={conter => this.changeConter(conter)}/> </div> ) }}export default App

子组件在按钮发生点击时, 对父组件的传递的函数进行回调, 并传入一个参数出去

import React, { Component } from 'react'export class ConterButton extends Component { btnClick(conter) { // 当按钮发生点击事件时, 对父组件传递过来的函数进行回调 this.props.getConter(conter) } render() { return ( <div> <button onClick={() => this.btnClick(-1)}>-1</button> <button onClick={() => this.btnClick(1)}>+1</button> </div> ) }}export default ConterButton
本文链接地址:https://www.jiuchutong.com/zhishi/300680.html 转载请保留说明!

上一篇:订单30分钟未支付自动取消怎么实现?(订单超时十分钟)

下一篇:Win11怎么通过WinRE访问系统还原?(win11怎么通过ip连接打印机)

  • oppok9pro是双扬声器吗(oppok9手机是双扬声器吗)

    oppok9pro是双扬声器吗(oppok9手机是双扬声器吗)

  • 荣耀60能用鸿蒙系统吗(荣耀60能用鸿蒙操作系统吗)

    荣耀60能用鸿蒙系统吗(荣耀60能用鸿蒙操作系统吗)

  • 充电有电流声有危险吗(充电有电流声有关系吗)

    充电有电流声有危险吗(充电有电流声有关系吗)

  • 全民k歌下载的歌在哪(全民k歌下载的伴奏怎么转mp3)

    全民k歌下载的歌在哪(全民k歌下载的伴奏怎么转mp3)

  • 华为p30相机怎么用(华为p30相机怎么识别图片中的文字)

    华为p30相机怎么用(华为p30相机怎么识别图片中的文字)

  • 苹果电池小插件找不到怎么办(苹果电池小插件怎么关闭)

    苹果电池小插件找不到怎么办(苹果电池小插件怎么关闭)

  • 快速迭代什么意思(迭代速度快)

    快速迭代什么意思(迭代速度快)

  • 身份证后面x怎么输入(身份证后面x怎么输入不进去)

    身份证后面x怎么输入(身份证后面x怎么输入不进去)

  • 笔记本电脑摔了一下电脑能开机但是不显示(笔记本电脑摔了一下会坏吗)

    笔记本电脑摔了一下电脑能开机但是不显示(笔记本电脑摔了一下会坏吗)

  • 新手机如何登录原手机的账户(新手机如何登录原来的钉钉)

    新手机如何登录原手机的账户(新手机如何登录原来的钉钉)

  • 红米真无线耳机左边不响(红米真无线耳机怎么连双耳)

    红米真无线耳机左边不响(红米真无线耳机怎么连双耳)

  • 怎么增强路由器信号强度(怎么增强路由器的穿墙效果)

    怎么增强路由器信号强度(怎么增强路由器的穿墙效果)

  • 微信特别关注有什么用(vx特别关注)

    微信特别关注有什么用(vx特别关注)

  • 哪些直播平台属于腾讯(直播平台那些)

    哪些直播平台属于腾讯(直播平台那些)

  • ps饱和度怎么调(ps哪里调饱和度)

    ps饱和度怎么调(ps哪里调饱和度)

  • 南京地铁电子卡出站怎么用(南京地铁电子卡怎么扣钱)

    南京地铁电子卡出站怎么用(南京地铁电子卡怎么扣钱)

  • 息屏显示耗电吗(下一页p30)

    息屏显示耗电吗(下一页p30)

  • 抖音视频怎么超过15秒(抖音视频怎么超过30秒)

    抖音视频怎么超过15秒(抖音视频怎么超过30秒)

  • 台式电脑u盘插哪个地方(台式电脑u盘插在哪里带什么图标)

    台式电脑u盘插哪个地方(台式电脑u盘插在哪里带什么图标)

  • 手机ppt怎么全程音乐(手机ppt怎么全程播放音频)

    手机ppt怎么全程音乐(手机ppt怎么全程播放音频)

  • iphonexsmax是2k屏吗

    iphonexsmax是2k屏吗

  • 苹果8plus怎么设置微信锁(苹果8plus怎么设置微信加密锁)

    苹果8plus怎么设置微信锁(苹果8plus怎么设置微信加密锁)

  • windows11如何关闭和打开设备加密?win11关闭和打开设备加密的方法(windows11如何关闭病毒和威胁防护)

    windows11如何关闭和打开设备加密?win11关闭和打开设备加密的方法(windows11如何关闭病毒和威胁防护)

  • ubuntu18.04配置ORB-SLAM3并跑EuRoC数据集(单目)(Ubuntu18.04配置允许远程访问)

    ubuntu18.04配置ORB-SLAM3并跑EuRoC数据集(单目)(Ubuntu18.04配置允许远程访问)

  • 【面试宝典】2023前端面试题(面试宝典下载)

    【面试宝典】2023前端面试题(面试宝典下载)

  • reset命令  设定终端机的状态(reset=target)

    reset命令 设定终端机的状态(reset=target)

  • 小规模纳税人没有税控盘怎么报税
  • 进出口环节税
  • 小规模纳税人应交增值税明细科目
  • 冲红的专票要给购买方吗
  • 公司往来借款在现金流量表哪里填写
  • 进项税额转出怎么算
  • 扣缴义务人是否可以领税务发票,是否可以正常申报
  • 耕地占用税的纳税人是谁
  • 异地经营如何纳税
  • 关联交易措施
  • 装修工程分期开票分期付款如何作账?
  • 银行利息税是多少2021
  • 租入生物性资产如何入账
  • 农产品增值税免税
  • 其他应收款借方表示增加吗
  • 特定业务计算的应纳税所得额是指
  • 学校购货合同
  • 工会工费缴纳标准
  • 支付佣金费用没扣怎么办
  • 总资产报酬率
  • 增资印花税税目
  • 民非企业缴纳税额怎么算
  • 工程会计的主要工作
  • 建账时的库存怎么做账
  • 已达到计算机的连接数最大值win7
  • w10关闭远程
  • php echo \n
  • PHP:Memcached::increment()的用法_Memcached类
  • win10右键个性化显示该文件
  • 库存现金意思
  • 灯光璀璨的夜晚
  • vue查看图片组件
  • php solr
  • 企业年度报告内容
  • 大数据分析案例结论
  • blockdata指令怎么用
  • php读取文件内容的方法和函数
  • 免征个人所得税33种情形
  • 资产评估属于什么科目
  • 织梦cms怎么样
  • 信用减值损失在资产负债表中怎么表示
  • python处理数据教程
  • 以股权抵债的会计分录
  • 小型微利企业享所得税优惠
  • 企业收到发票后怎么入账
  • wordpress技巧
  • 红字发票申请单怎么开
  • 小规模附加税减免政策2023
  • 技术人员的工资计入什么费用
  • 应退或应补税额是负数
  • 小规模企业每月收入多少可以不纳税
  • 基本户和一般户可以互相转账吗
  • 小规模纳税人税率1%政策到什么时候
  • 制造费用的结转正确的是( )
  • 收到境外支付的咨询费免税吗
  • 应交税金-应交增值税明细账
  • 没有付款的费用怎么入账
  • 发票必须与合同明细对应吗
  • 新公司成立第一次会议内容
  • 为什么一般纳税人可以选择简易计税
  • 银行询证函快递费谁负担运费
  • cmos开机密码的清除的二种方法
  • win8怎么取消自动关机
  • 苹果mac怎么复制文字
  • win10 rundll
  • win10开机自动弹出设置界面
  • centos如何查看服务进程
  • centos查看inode
  • 用360可以装win7系统吗
  • android开发环境搭建需要哪些工具
  • quick-lua touch 触摸事件
  • html和js如何应用
  • linux shell脚本编写1加100
  • javascript什么用
  • jquery从左到右渐渐显示
  • 轻松实现财富自由
  • 车价36万保险一般多少钱
  • 柳州 税务
  • 纳税服务存在的不足之处
  • 报税卡丢了要怎么处理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设