React组件通信-父子组件间的通信

news2025/2/28 0:21:40

文章目录

    • 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传递给子组件, 由子组件进行展示

将数组传递给子组件

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'

// 导入PropTypes
import 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

适合我的前端学习路线(学习前端不迷路)

适合我的前端学习路线&#xff08;学习前端不迷路&#xff09; 小伙伴们想学习前端&#xff0c;但是却不知如何入手&#xff0c;上网查前端学习路线&#xff0c;第一页往往充斥着各种培训公司的广告&#xff0c;又或者是搜前端学习路线图时&#xff0c;出现大量的路线图导致你还…

【学Vue就跟玩一样】Vue中的路由与多种守卫

1.vue-routervue的一个插件库&#xff0c;专门用来实现对SPA应用的单页Web应用(single page web application, SPA)。整个应用只有一个完整的页面。点击页面中的导航链接不会刷新页面&#xff0c;只会做页面的局部更新。数据需要通过ajax请求获取。2.什么是路由一个路由就是一组…

Tomcat服务器部署+Web项目搭建

Tomcat服务器部署&#xff0b;Web项目搭建 1.Tomcat服务器 1 . Tomcat下载 2 . Tomcat启动与关闭 3 . 配置端口号2.IDEA搭建Web项目 1 . web项目创建 2 . 本地服务器配置 Tomcat下载 tomcat官网&#xff1a;tomcat 1.选择与自己电脑对应的位数下载&#xff0c;我们…

HTML跳动爱心代码|最近很火的爱心代码你还没收到吗

最近很火的跳动爱心代码HTML实现可DIY 看效果 QQ录屏20221108115545点个赞吧,养成好习惯 不想动手的小伙伴可以直接&#x1f447;&#x1f447; 阿里云盘直接提取 阿里云盘 DIY版----提取码: f30q 使用说明 主体代码来源于网络,让我们为原作者点赞&#x1f44d;我用css3的anim…

云服务器部署 Web 项目

一: 搭建 Java 部署环境1: 安装 JDK2: 安装 Tomcat总结3: 安装 MySQL(1): 依次安装(2): 更改配置(3): 启动(4): 测试连接二: 部署 web 项目1: 给服务器准备好依赖的数据2: 微调我们的 Java 代码3: 重新打包4: 上传到服务器上5: 验证一: 搭建 Java 部署环境 之前说过 yum这个命…

手把手教你安装VSCode(附带图解步骤)

一、前端工具vscode 1.1、概述 前端开发是创建Web页面或app等前端界面呈现给用户的过程&#xff0c;通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互 [1] 。它从网页制作演变而来&#xff0c;名称上有…

Node安装及配置

目录一、Node安装二、Node环境配置2.1 下载国内淘宝镜像三、下载Node.js项目一、Node安装 首先我们进入Node的官网链接: 下载链接 点击下载&#xff0c;选择自己对应的版本&#xff0c;博主这边使用的Windows 安装包 (.msi) 下载之后双击运行下载包点击下一步 点击change 安装完…

【Vue】悬浮窗和聚焦登录组件经验总结

前言 ​ 本文整理了实现悬浮窗以及聚焦登录组件的功能。 ​ 为的是方便大家和自己的学习。 ​ 省流&#xff1a;可以只看1.2 和 2的代码即可 1 悬浮窗 现在各大流行视频网站的平台都在使用这种悬浮显示的效果&#xff0c;我就想这种东西是怎样搞出来的呢&#xff01;几经尝…

Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)

在前端项目开发中&#xff0c;实现用户的登陆注册功能时常常会有一个问题&#xff0c;那就是我们设置的登录状态&#xff0c;在浏览器页面刷新后就消失了&#xff0c;这其实只是因为我们没有保存用户状态。 这里小马演示使用的是 localStorage vuex 方法&#xff08;其他诸如…

SpringBoot+Vue实现简单用户管理平台第一篇(后端接口设计)

&#x1f680; 注重版权&#xff0c;转载请注明原作者和原文链接&#x1f96d; 作者&#xff1a;Yuan-Programmer&#x1f34e; 主页&#xff1a;https://blog.csdn.net/weixin_47971206/article/details/121368075?spm1001.2014.3001.5502&#x1f349; 进来的小伙伴点点赞呀…

nuxt3:我们开始吧-开发-配置-部署

一、背景介绍 2022 年 11 月 16 日&#xff0c;全球最大的 Nuxt 会议 Nuxt Nation 2022 在线举行&#xff0c;并正式发布了 Nuxt.js 3.0 的第一个稳定版本。Nuxt 3 是基于 Vite、Vue3 和 Nitro 的 Nuxt 框架的现代重写&#xff0c;具有一流的 Typescript 支持&#xff0c;是两年…

前端基础从头学——VsCode使用教程+html基础(入门篇)

作者简介&#xff1a;hello&#xff01;大家好&#xff0c;初学前端知识&#xff0c;请多多指教。 希望我的分享能够帮助到更多的人&#xff0c;如果觉得我的分享有帮助的话&#xff0c;请大家一键三连支持一下哦~ 文章目录前言一、VsCode编辑器使用教程1、VsCode的下载与安装2…

HTML+CSS+JS+Jquery+练手项目+...合集(前端学习必备,持续更新中...)

非常实用的教程案例&#xff0c;均有详细的步骤讲解&#xff0c;不懂得可以私信博主&#xff0c;看到就会回的&#xff01;未来将继续更新Vue&#xff0c;React等更多前端知识&#xff0c;欢迎收藏关注&#xff01; 文章目录一、HTML二、CSS三、JavaScript四、jQuery五、 前端项…

PromiseA+规范之手写Promise

前言 1、Promise 的意义&#xff1f; 在javascript的世界中&#xff0c;所有代码都是单线程执行的&#xff0c;由于这个“缺陷”&#xff0c;导致JavaScript的所有网络操作&#xff0c;浏览器事件&#xff0c;都必须是异步执行。Ajax可以解决这个问题&#xff0c;但是并不好复用…

【flask进阶】Flask实现自定义分页(python web通用)

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域新星创作者。😜🎉 支持我:点赞👍+收藏⭐️+留言📝📣 系列专栏:flask框架快速入门🍁💬格言:要成为光,因为有怕黑的人!🔥 目录 📋 个人简介前言后端后端思路后端代码前端前端思路前端代码

微信小程序 - 完美解决 web-view 公众号文章或第三方网站分享转发后,打开提示 “无法打开该页面,不支持打开” 或 “页面不存在”(IOS 苹果系统打开是空白页,安卓系统会有提示)超详细排查

前言 由于出现这种问题的原因有很多种,绝对不像其他文章教程那样无效,本文提供了超级详细的排查思路与解决方案。 本文从 [初步排查] 到 [代码排查],完美解决 因各种原因导致 webview 页面分享后,用户打不开提示错误 这类问题, 您只需要按照排查步骤一步一步的走,从检查…

echarts入门教程(超级详细带案例)

一.echarts的介绍 1.echarts是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。ECharts最初由百度团队开源&#xff0c;并于2018年初捐赠给Apache基金会&#xff0c;成为ASF孵化级项目…

防抖、节流的介绍

目录 一、什么时候要用到防抖节流 输入框连续输入的案例 滚动条案例 二、什么是防抖、节流 使用防抖来解决输入框案例造成的浪费现象&#xff1a; 使用节流来解决滚动条案例造成的浪费现象&#xff1a; 三、总结 一、什么时候要用到防抖节流 针一类类快速连续触发和不可控…

不会前端没事,用GWT Boot和Spring Boot构建Web程序

本文介绍了一种使用Java构建Web应用程序的方式&#xff0c;其中GWT或者J2CL是必不可少的&#xff0c;另外还有多个UI框架可以配套使用&#xff0c;比如Domino UI、VueGWT、GWT Material Design (GMD)&#xff0c;React4J、WebFX&#xff0c;还有一些活跃低的框架GWTBootstrap3、…

2023前端面试题及答案整理(Vue)

watch 和 computed 区别 watch 是监听动作&#xff0c;computed 是计算属性watch 没缓存&#xff0c;只要数据变化就执行。computed 有缓存&#xff0c;只在属性变化的时候才去计算。watch 可以执行异步操作&#xff0c;而 computed 不能watch 常用于一个数据影响多个数据&…