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

  • 荣耀30pro充电一般多长时间充满(荣耀30pro充电一直是0)

    荣耀30pro充电一般多长时间充满(荣耀30pro充电一直是0)

  • 电话号码被标记了怎么取消(电话号码被标记房产中介怎么解除)

    电话号码被标记了怎么取消(电话号码被标记房产中介怎么解除)

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

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

  • 微信怎么解绑健康码(微信怎么解绑健康卡里的亲人)

    微信怎么解绑健康码(微信怎么解绑健康卡里的亲人)

  • qq如何快速升级等级(qq如何快速升级到svip9)

    qq如何快速升级等级(qq如何快速升级到svip9)

  • 在朋友圈如何发15秒视频(在朋友圈如何发视频号)

    在朋友圈如何发15秒视频(在朋友圈如何发视频号)

  • 淘宝买家累计信用多少才能到三星(淘宝买家积累信用怎么看)

    淘宝买家累计信用多少才能到三星(淘宝买家积累信用怎么看)

  • 淘宝不显示待发货待收货数字(淘宝不显示待发货时间)

    淘宝不显示待发货待收货数字(淘宝不显示待发货时间)

  • 现在有5g手机卡吗(现在5g手机卡都是nano卡吗)

    现在有5g手机卡吗(现在5g手机卡都是nano卡吗)

  • 苹果6s plus发烫是什么原因(苹果6s plus发烫严重)

    苹果6s plus发烫是什么原因(苹果6s plus发烫严重)

  • 支持mxm显卡的笔记本(mx显卡支持cuda吗)

    支持mxm显卡的笔记本(mx显卡支持cuda吗)

  • 如何判断空调压缩机是否工作(如何判断空调压缩机坏了?)

    如何判断空调压缩机是否工作(如何判断空调压缩机坏了?)

  • 抖音拍视频怎么美颜(抖音拍视频怎么录入自己的声音)

    抖音拍视频怎么美颜(抖音拍视频怎么录入自己的声音)

  • rx580配什么电源(rx580搭配什么电源)

    rx580配什么电源(rx580搭配什么电源)

  • 华为10plus充电要多久(华为p10充电多长时间)

    华为10plus充电要多久(华为p10充电多长时间)

  • 华为荣耀手机风险管控中心怎么关闭(荣耀手机风扇)

    华为荣耀手机风险管控中心怎么关闭(荣耀手机风扇)

  • 手机屏幕总成什么意思(手机屏幕总成什么材质)

    手机屏幕总成什么意思(手机屏幕总成什么材质)

  • p30微信视频怎么美颜(p30微信视频声音小怎么解决)

    p30微信视频怎么美颜(p30微信视频声音小怎么解决)

  • 腾讯地图如何修改名称(腾讯地图如何修改店铺图片)

    腾讯地图如何修改名称(腾讯地图如何修改店铺图片)

  • 三星note9防水吗(三星note9防水胶怎么贴)

    三星note9防水吗(三星note9防水胶怎么贴)

  • pr如何调高清晰度(pr怎么调高清画质)

    pr如何调高清晰度(pr怎么调高清画质)

  • vivox23nfc功能在哪里(vivox23nfc功能怎么用)

    vivox23nfc功能在哪里(vivox23nfc功能怎么用)

  • iphonexs 拍照技巧是什么(iphonexs拍摄技巧)

    iphonexs 拍照技巧是什么(iphonexs拍摄技巧)

  • 大火花断了怎么恢复(火花断了怎么幽默回复)

    大火花断了怎么恢复(火花断了怎么幽默回复)

  • 安全系统不起作用或未安装怎么办?(安全系统不起作用或未正确安装 cad2016)

    安全系统不起作用或未安装怎么办?(安全系统不起作用或未正确安装 cad2016)

  • 系统之家装机大师U盘启动怎么安装Win11系统?(系统之家装机可靠吗)

    系统之家装机大师U盘启动怎么安装Win11系统?(系统之家装机可靠吗)

  • 非居民企业享受协定待遇
  • 增值税和城建税怎么算
  • 自己企业生产的物料入库单由谁填写
  • 企业所得税计算例题
  • 美团代金券是抵用券吗
  • 水利建设专项收入怎么计算
  • 增值税发票抵扣多少个点
  • 食堂收入支出结构图
  • 收到报废车款要交什么税
  • 已开票未收款算收入吗
  • 印花税票计税依据含税吗?
  • 分公司的人员构成
  • 年终奖金怎么发放
  • 预收账款怎么冲减应收账款
  • 利润表反映了哪些情况
  • 其他业务收入和其他业务成本
  • 钻井采用的主要设备
  • 自然人股息红利免征个人所得税?
  • 2021发票勾选认证
  • 残联备案还能补申报吗
  • 广告公司进项税有哪些
  • 建筑工地仓库管理流程
  • 其他权益工具投资交易费用计入哪里
  • 收到科技局研发的短信
  • win10重置此电脑的密码是什么
  • 多交的附加税怎么做账
  • 国际重复征税的解决方法公式
  • adsl灯一直闪烁
  • linux太卡顿
  • php怎么自学
  • 土地使用权进项税如何抵扣
  • php字符串型数据的定义方式
  • 显卡的散热
  • 我辞职了公积金怎么交
  • 投影仪属于固定资产哪一类
  • esp8266 dht22
  • dvwa靶场搭建sql注入
  • 总纳税与就地纳税区别
  • 利润表管理费用包括哪些内容
  • 食堂购买固定资产会计处理
  • 小规模纳税人的企业所得税税率
  • 快递收据能报销吗
  • 对公付款对方不发货不退钱怎么处理
  • 房地产企业土地增值税清算
  • 职业年金是不是养老保险
  • 不动产租赁如何避税
  • 工程建设期间发生的差旅费
  • 原始凭证收集
  • 进口葡萄酒政策
  • 公司买口罩
  • 研发人员工资计入什么科目
  • 拼多多里的多多付款安全吗
  • 员工宿舍发生事故赔偿吗
  • 公司股权变更所需资金
  • 应付账款余额为0怎么写
  • 会计主体包括哪些四种
  • 会计建账的内容
  • mysql解压安装教程5.7
  • sql server怎么向表里添加数据
  • 证书登录什么意思
  • windows无法运行
  • 苹果手机
  • centos7ftp
  • rsmsink.exe - rsmsink是什么进程 有何作用
  • win10自带绘画
  • win7取消禁用无线网络
  • CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放
  • dos批处理命令大全
  • opengl三维场景
  • Node.js中的全局变量有哪些
  • 修改cmd中显示的用户名!
  • unity3d碰撞体
  • 安卓手机管家怎么关闭
  • android原生框架
  • js如何实现图片轮播
  • jquery mobile app
  • 广东省电子税务局登录方式
  • 地税申报打印不了发票
  • 彩票中500万自己能得多少
  • 工商注册app是不是在手机上可以完全操作
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设