位置: 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连接打印机)

  • 苹果x有红外线遥控功能吗(苹果xs带红外线功能吗)

    苹果x有红外线遥控功能吗(苹果xs带红外线功能吗)

  • 苹果手表怎么更新系统(苹果手表怎么更换表带)

    苹果手表怎么更新系统(苹果手表怎么更换表带)

  • opporeno4pro支持红外线功能吗(opporeno4pro带红外功能吗)

    opporeno4pro支持红外线功能吗(opporeno4pro带红外功能吗)

  • 华为p30手机如何刷门禁卡(华为p30手机如何恢复出厂设置)

    华为p30手机如何刷门禁卡(华为p30手机如何恢复出厂设置)

  • 输入法手机平方怎么打出来m2(手机搜狗输入法怎么打出平方)

    输入法手机平方怎么打出来m2(手机搜狗输入法怎么打出平方)

  • word中当关闭一个文档窗口后若将该文档长久保存该文档应(在word中关闭文件时)

    word中当关闭一个文档窗口后若将该文档长久保存该文档应(在word中关闭文件时)

  • 华为手机怎么看抖音直播(华为手机怎么看是不是正品新机)

    华为手机怎么看抖音直播(华为手机怎么看是不是正品新机)

  • 因特网最主要的服务方式是(因特网最主要的服务方式是www吗)

    因特网最主要的服务方式是(因特网最主要的服务方式是www吗)

  • 淘宝卖家把退货地址写成国外(淘宝卖家把退货地址写成国外怎么投诉)

    淘宝卖家把退货地址写成国外(淘宝卖家把退货地址写成国外怎么投诉)

  • 华为mate30有智能语音吗(华为mate30有智能充电吗?)

    华为mate30有智能语音吗(华为mate30有智能充电吗?)

  • 红米k30双卡电信没信号(红米k30支不支持双电信)

    红米k30双卡电信没信号(红米k30支不支持双电信)

  • wps校园版有啥区别(wps校园版和office)

    wps校园版有啥区别(wps校园版和office)

  • 红米k305g是真5g吗(红米k305g是5g手机吗)

    红米k305g是真5g吗(红米k305g是5g手机吗)

  • 一个机顶盒能带两台电视吗(一个机顶盒能带两个电视吗)

    一个机顶盒能带两台电视吗(一个机顶盒能带两个电视吗)

  • cydia是什么(cydialmg,cc)

    cydia是什么(cydialmg,cc)

  • 华为mate10快充协议(mate10支持快充协议)

    华为mate10快充协议(mate10支持快充协议)

  • 爱奇艺里下载的视频怎么导出(爱奇艺如何下载)

    爱奇艺里下载的视频怎么导出(爱奇艺如何下载)

  • 心形照片怎么拼(心形照片怎么拼图PPT)

    心形照片怎么拼(心形照片怎么拼图PPT)

  • mate20pro扬声器在哪(华为mete20pro扬声器)

    mate20pro扬声器在哪(华为mete20pro扬声器)

  • 苹果蓝牙耳机怎么下一曲(苹果蓝牙耳机怎么使用)

    苹果蓝牙耳机怎么下一曲(苹果蓝牙耳机怎么使用)

  • 荣耀手环3怎么设置时间(荣耀手环3怎么关机)

    荣耀手环3怎么设置时间(荣耀手环3怎么关机)

  • 快手怎么删除自己的粉丝(快手怎么删除自己私密的作品)

    快手怎么删除自己的粉丝(快手怎么删除自己私密的作品)

  • jsnaloo是什么型号(jsnan什么意思)

    jsnaloo是什么型号(jsnan什么意思)

  • 苹果8p录屏功能在哪(苹果8p录屏怎么用)

    苹果8p录屏功能在哪(苹果8p录屏怎么用)

  • pandas遍历dataframe的方法有哪些(pandas遍历某一列将字符串转换为列表)

    pandas遍历dataframe的方法有哪些(pandas遍历某一列将字符串转换为列表)

  • 非营利组织营利了怎么办
  • 职工报销的医药费计入什么科目
  • 公帐的钱可以转给个人私帐可以吗
  • 电子发票打小了可以报销吗
  • 外资企业的分支机构向总机构支付的管理费如何办理税前列支申请
  • 常见的会计凭证有哪些
  • 商业企业的商品销售额、职工人数是( )
  • 超额投资是什么意思
  • 企业接受捐赠的账务处理
  • 计提坏账准备的做法体现了什么的信息质量要求
  • 专项资金是否缴纳企业所得税
  • 费用分摊怎么算
  • 加税点开专票合适吗
  • 2018年债券基金
  • 出口企业预申报没有增值税专用发票稽核信息如何处理?
  • 个体工商户的公章丢了怎么办
  • 电脑上不了网怎么安装网卡驱动
  • 关闭无法验证发布者
  • 筹备期废品回收怎么做账
  • 笔记本电脑预装
  • windows11怎么设置默认应用
  • deepin咋样
  • php运用于哪些领域
  • u启动pe装机工具怎么重装系统
  • scardsvr32.exe - scardsvr32是什么进程 有什么用
  • scchost.exe - scchost是什么进程 有什么用
  • php字符串定义的三种方式
  • 羊肚菌的功效和价格
  • 政府财政会计核算基础是什么
  • 培训类产品
  • 微信小程序前端源码
  • zendframework3中文手册
  • 结转本月完工产品的成本
  • 小规模纳税人交增值税吗
  • php include require
  • consul框架
  • thinkphp extend
  • window11预览版怎么样
  • 每年结息一次,到期一次还本是单利
  • 营业执照类型的区别是什么
  • 我们买得起一辆新车吗?英文
  • 同一控制下企业合并和非同一控制下企业合并的区别
  • 教你如何看懂标签
  • mysql1290报错
  • 金税四期是什么意思
  • 建账盘存库存商品的分录
  • 公司购买劳保用品可以抵扣吗
  • 个体的个人所得税怎么交税?
  • 存货周转率特别高说明什么
  • 股东借款的利息收入
  • 如何解决私账流失问题
  • 没有到位的注资公司
  • 成本利润率计算销售价格
  • access数据库导入到sqlserver
  • mysql批量添加字段
  • linux多线程并发的处理方式
  • 直通车和百度竞价的区别
  • Linux查看磁盘剩余空间指令
  • Ubuntu After Install 2.6 帮助你安装 Ubuntu 常用软件
  • 国产系统麒麟和统信
  • fs是什么文件
  • win8系统映像
  • linux设置权限755
  • windows8触屏功能
  • w10自启
  • 简述在windows中创建用户的步骤
  • linux服务器如何配置ip
  • 批处理操作
  • <Unity UGUI>使用c#反射实现UGUI文本显示的国际化
  • jQuery Easyui datagrid连续发送两次请求问题
  • 只用html和css
  • Node.js中的包管理工具是什么
  • 异步任务管理器
  • java教程csdn
  • 组件中js可以做什么
  • 汽车维修增值税专用发票
  • 社保归国税还是地税
  • 传统服务贸易和新兴服务贸易如何区分
  • 财政临时工是什么
  • 武汉市江汉区财政局这个单位的公务员待遇怎么样?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设