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

  • 微信营销推广方法(微信营销推广方案word)

    微信营销推广方法(微信营销推广方案word)

  • 抖音如何看播放量(抖音如何看播放次数)

    抖音如何看播放量(抖音如何看播放次数)

  • 微信62数据是什么意思(微信62数据是什么)

    微信62数据是什么意思(微信62数据是什么)

  • 斐讯k2p相当于什么级别(斐讯k2p实际值多少钱)

    斐讯k2p相当于什么级别(斐讯k2p实际值多少钱)

  • 无法使用你的apple id(无法使用你的pbe账号游玩)

    无法使用你的apple id(无法使用你的pbe账号游玩)

  • 南瓜影视下载的视频在哪个文件夹(南瓜影视下载的文件在哪)

    南瓜影视下载的视频在哪个文件夹(南瓜影视下载的文件在哪)

  • 华为荣耀30耳机孔在哪里(华为荣耀30耳机孔多大)

    华为荣耀30耳机孔在哪里(华为荣耀30耳机孔多大)

  • 苹果7来电铃声不响怎么回事(苹果7来电铃声小怎么回事)

    苹果7来电铃声不响怎么回事(苹果7来电铃声小怎么回事)

  • 华为自动同步需要开吗(华为自动同步数据有什么用)

    华为自动同步需要开吗(华为自动同步数据有什么用)

  • 微信在哪里看年度总账单(微信在哪里看年消费)

    微信在哪里看年度总账单(微信在哪里看年消费)

  • ipad4可以更新到什么版本(ipad4可以更新到ios12吗)

    ipad4可以更新到什么版本(ipad4可以更新到ios12吗)

  • 电脑反应特别慢怎么办(电脑反应特别慢是不是主板坏了)

    电脑反应特别慢怎么办(电脑反应特别慢是不是主板坏了)

  • 手机全民k歌怎么玩(手机全民k歌怎么导入抖音)

    手机全民k歌怎么玩(手机全民k歌怎么导入抖音)

  • 手机贴吧怎么看私信(手机贴吧怎么看精品贴)

    手机贴吧怎么看私信(手机贴吧怎么看精品贴)

  • mate30怎么打开无线反向充电(mate30怎么打开无线充电)

    mate30怎么打开无线反向充电(mate30怎么打开无线充电)

  • 微信摄像头权限设置在哪(微信摄像头权限开了还是不行)

    微信摄像头权限设置在哪(微信摄像头权限开了还是不行)

  • 怎么用快手发布动态(怎么快手发布作品视频)

    怎么用快手发布动态(怎么快手发布作品视频)

  • 华为p30的功能介绍(华为p30功能介绍技巧)

    华为p30的功能介绍(华为p30功能介绍技巧)

  • 微信电话怎么看谁挂的(微信电话怎么看是谁先挂的)

    微信电话怎么看谁挂的(微信电话怎么看是谁先挂的)

  • 如何把WPS中的表格转换成文本(如何把wps中的表格变大)

    如何把WPS中的表格转换成文本(如何把wps中的表格变大)

  • 微信收款码多久失效(微信收款码多久寄过来)

    微信收款码多久失效(微信收款码多久寄过来)

  • 数据库的数据模型是指(数据库的数据模型分为)

    数据库的数据模型是指(数据库的数据模型分为)

  • 惠普打印机如何连接电脑(惠普打印机如何扫描文件)

    惠普打印机如何连接电脑(惠普打印机如何扫描文件)

  • linux下.run文件的安装与卸载方法(linux runit)

    linux下.run文件的安装与卸载方法(linux runit)

  • Vite如何配置路径别名(vite config)

    Vite如何配置路径别名(vite config)

  • 前端网页设计必逛的六个宝藏网站(非常值得收藏)(前端网页设计的三大技术)

    前端网页设计必逛的六个宝藏网站(非常值得收藏)(前端网页设计的三大技术)

  • 房产税如何进行税源采集
  • 以前年度调整损益借方表示什么
  • 公积金做账需要计提吗怎么做
  • 进项税额转出怎么算
  • 单位部分承担个人借款利息个税的计算
  • 公司报销费用发票怎么开
  • 长期投资包括哪些会计科目
  • 大额存款提前取一部分怎么计息
  • 亏损弥补额的年数如何计算?
  • 超过一年的保证金怎么交个税
  • 小型微利企业预缴所得税税率
  • 如何理解出口退税政策
  • 待转销项税额会计分录
  • 金税盘当月买当月不抵扣怎么处理?
  • 损失性费用的会计科目有
  • 长期驻扎外地的员工
  • 长期股权投资用交印花税吗
  • 工程施工方安全责任
  • 成本核算的原则和要求
  • 流氓软件怎么卸载?
  • 腾讯电脑管家开机加速在哪里
  • 出版社购买版权是什么
  • 股权转让合同怎么解除
  • php笔记程序
  • php输入框input代码
  • 卷曲的蕨菜叶怎么吃
  • html页面间传数据
  • php消息实时推送完整示例
  • 无形资产摊销是按原值吗
  • 融资租赁利息资本化条件
  • php sse
  • php 包含
  • 工程款清账的句子发朋友圈
  • 再次回归的成语
  • python脚本例子
  • 资产负债所有者权益借贷方向
  • 占地面积法如何分摊土地成本
  • 代销商品税率是多少
  • 固定资产减少当月计提吗
  • 家电销售的税率
  • 个人所得税由单位还是个人缴纳
  • 新建厂房环评费会计科目
  • 以前年度损益调整怎么做账
  • 给销售培训产品该如何做
  • 新开企业如何开发票
  • 贸易公司成本如何计算
  • 交付使用资产是否含税
  • 其他应付款如何平账
  • 医院哪些地方需要有明显的禁烟标识
  • 购买软件使用权计入无形资产吗
  • 计提附加税费是什么意思
  • 堤围防护费是什么
  • 代扣代缴城建税为什么没有计入利润
  • 小规模企业发票税率是多少
  • 苗木免税吗
  • 发票报销可以跨月报销吗
  • 营业外支出为负数原因
  • 公司向职工借钱怎么做账
  • 企业在计划内应生产的工业产品
  • linux 磁盘使用
  • Win10预览版桌面图标和任务栏不翼而飞怎么办?
  • ubuntu20.04关闭图形界面命令
  • 免费获取验证码
  • win10系统语言包安装方法
  • win7系统重启后黑屏不进系统
  • cocos2dx怎么创建工程
  • js 单引号
  • 简述javascript执行原理
  • 用户允许控制
  • 基于JAVASCRIPT实现的可视化工具是
  • wordpress单页面店铺
  • js判断上传图片宽高大小
  • javascript基础书
  • android 自定义dialog
  • 冒烟测试和接口测试
  • 基于jQuery的ajax方法封装
  • android开源小项目
  • 安徽地税局电话号码
  • 代售门票业务税务处理
  • 税务总局2019 14号
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设