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

  • 国产电影排行榜必看经典排行

    国产电影排行榜必看经典排行

  • 网络推广之论坛营销发帖推广技巧 (网络推广联盟)

    网络推广之论坛营销发帖推广技巧 (网络推广联盟)

  • 微星gameboost有作用吗(game boost 微星)

    微星gameboost有作用吗(game boost 微星)

  • 华为手机锁屏账号是什么情况(华为锁屏在哪儿)

    华为手机锁屏账号是什么情况(华为锁屏在哪儿)

  • 苹果手机侧面鼓了起来(苹果手机侧面鼓起来了还能用吗)

    苹果手机侧面鼓了起来(苹果手机侧面鼓起来了还能用吗)

  • 可以远程重装系统吗(可以远程重装系统的软件)

    可以远程重装系统吗(可以远程重装系统的软件)

  • 差评对于天猫重要吗(给天猫店差评买家的评价管理会显示吗)

    差评对于天猫重要吗(给天猫店差评买家的评价管理会显示吗)

  • 已保存不可上网是什么意思(wifi已保存不可上网)

    已保存不可上网是什么意思(wifi已保存不可上网)

  • ipad5有笔可用吗(ipad5支持笔吗)

    ipad5有笔可用吗(ipad5支持笔吗)

  • qq音乐自动切歌是为什么(qq音乐自动切歌怎么关)

    qq音乐自动切歌是为什么(qq音乐自动切歌怎么关)

  • 苹果手机怎么分辨冷暖屏(苹果手机怎么分享网络)

    苹果手机怎么分辨冷暖屏(苹果手机怎么分享网络)

  • 抖音创作内容调整提示怎么办(抖音创作内容调整怎么弄)

    抖音创作内容调整提示怎么办(抖音创作内容调整怎么弄)

  • ipad2能用大王卡吗(ipad能插大王卡吗)

    ipad2能用大王卡吗(ipad能插大王卡吗)

  • 荣耀8xmax上市时间(荣耀8xmax什么时候出的)

    荣耀8xmax上市时间(荣耀8xmax什么时候出的)

  • 微信运动推送时间不一样(微信运动推送时间怎么一下38一下39)

    微信运动推送时间不一样(微信运动推送时间怎么一下38一下39)

  • 魅族16T可以遥控空调吗(魅族16t可以遥控空调吗)

    魅族16T可以遥控空调吗(魅族16t可以遥控空调吗)

  • airpods只能连苹果吗(airpods只能连苹果耳机吗)

    airpods只能连苹果吗(airpods只能连苹果耳机吗)

  • 拼多多和微信是一家的吗(拼多多和微信是一个吗)

    拼多多和微信是一家的吗(拼多多和微信是一个吗)

  • word尾注20后怎么加圆圈(2010word尾注)

    word尾注20后怎么加圆圈(2010word尾注)

  • 怎么开启设备信息权限(设备信息权限在哪里设置)

    怎么开启设备信息权限(设备信息权限在哪里设置)

  • 让手机锁屏后显示时钟(让手机锁屏后显示时钟红米)

    让手机锁屏后显示时钟(让手机锁屏后显示时钟红米)

  • s10和s10+有什么区别(s10 和s10+)

    s10和s10+有什么区别(s10 和s10+)

  • supersu怎么用(supersu使用教程)

    supersu怎么用(supersu使用教程)

  • 红米k20后盖是什么材质(红米k20后盖拆卸)

    红米k20后盖是什么材质(红米k20后盖拆卸)

  • JavaScript数组(四):判断数组相等的4种方法

    JavaScript数组(四):判断数组相等的4种方法

  • 手撕前端面试题【JavaScript】(前端手撕代码)

    手撕前端面试题【JavaScript】(前端手撕代码)

  • 私车公用车险是个人名字可报销吗
  • 红字冲回账务处理
  • 合伙企业缓交所得税
  • 收付实现制有应收应付吗
  • 税控维护费抵减增值税报表怎么填
  • 软件工程质保金
  • 企业给职工交的养老金哪里去了
  • 税收的构成要素包含哪些内容
  • 小规模增值税做那个费用科目
  • 视同销售收入计入会计利润吗
  • 个体工商户办税务
  • 减少实收资本会引起资产和所有者权益发生变化吗
  • 受托加工物资产包括哪些
  • 长期借款工程完工时会计处理怎么做?
  • 跨年冲销营业外支出
  • 人工费用占销售收入比重
  • 半成品牛排有营养吗
  • 抽奖获得的奖品有权转卖吗
  • 没有税务章的收款收据怎么做账?
  • 进项发票认证抵扣会计分录
  • 已经开了的发票可以打销货清单吗
  • 劳务分包可以开劳务费吗
  • 工商注册需要提供什么
  • 公司年度财务报告怎么写
  • 原材料损失分录
  • 年初建账的期初余额
  • 包装物如何做会计分录
  • sguard是什么
  • incredicle
  • 企业生产经营管理费用包括
  • php随机ua
  • php文件修改后,打开还是显示以前的页面
  • 企业所得税核定征收方法有哪两种
  • vue组件继承element并重写方法
  • 前端框架源码
  • v-model的双向绑定原理
  • 基于Java+Springboot+vue在线版权登记管理系统设计实现
  • 汇算清缴有问题怎么办
  • 母公司可以免子女税吗
  • 委托代销受托方会计分录
  • 出纳人员收取现金合法吗
  • 企业异地预交的税怎么算
  • 个人所得税报税孩子的夫妻双方都报吗
  • 法人给对公账户转账
  • 发票勾选后为什么申报表里没有数据
  • 自来水公司水表安装标准
  • MSSQL2005 INSERT,UPDATE,DELETE 之OUTPUT子句使用实例
  • mysql如何分类
  • 保洁服务属于
  • 中级财务会计计算题
  • 政府给的专款专用的补助,怎么入账
  • 福利费要交个人所得税嘛
  • 普票丢失可以用复印件入账吗
  • 体检收据可以入档案吗
  • 净资产=资产-负债
  • 固定资产标准提高是政策变更吗
  • 个体工商户个人经营所得税税率表
  • 怎样编制银行存款凭证
  • linux操作系统基本操作
  • cf游戏初始化失败是因为什么
  • 445端口 关闭
  • xp系统无法登录系统
  • 关于要不要关闭Vista中的IPv6功能的问题
  • mac修改用户名称
  • xp如何一键还原系统还原
  • win1021h2版本千万别更新
  • win10登录微软账户后进不去桌面
  • linux如何结束正在运行的进程
  • win7系统步骤
  • qt5.15教程
  • 常用的批处理命令
  • javascript怎么学
  • node-js
  • unity脚本调用
  • 在jquery中fadein
  • 如何用js实现一个简单的计算器
  • javascript 对象的this指向
  • 怎么在国家税务局查发票
  • 保险公司个人所得税扣除标准是多少
  • 重庆国税官网网址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设