react中通过props实现父子组件间通信

一、父组件向子组件传值

在React中,无论是函数式组件还是类组件,都可以通过props实现父组件向子组件传值。以下是具体的示例说明:

1. 函数式组件通过props传值:

// 父组件
function ParentComponent() {const message = "Hello, World!";return (<div><ChildComponent message={message} /></div>);
}// 子组件
function ChildComponent(props) {return <div>{props.message}</div>;
}

上述示例中,父组件通过将message作为props传递给子组件ChildComponent,子组件通过props.message获取父组件传递的值,并进行渲染。

2. 类组件通过props传值:

// 父组件
class ParentComponent extends React.Component {render() {const message = "Hello, World!";return (<div><ChildComponent message={message} /></div>);}
}// 子组件
class ChildComponent extends React.Component {render() {return <div>{this.props.message}</div>;}
}

在类组件中,父组件通过<ChildComponent message={message} />的形式将值传递给子组件。子组件通过this.props.message获取父组件传递的值。

无论是函数式组件还是类组件,在使用props时,有以下几点需要注意

  • props是只读的:在子组件中,无法直接修改父组件传递的props值,它们被认为是不可变的。
  • 在函数式组件中,props参数为函数的第一个参数,在类组件中,props通过this.props访问。

3. 一次性传递多个值的优雅传递方式

要一次性传递多个值,可以将所有值作为一个对象传递,并在子组件中使用解构赋值的方式一次性接收所有的props。

例如,假设有一个父组件Parent和一个子组件Child,现在需要从Parent向Child传递多个值:

// Parent组件
import React from 'react';
import Child from './Child';const Parent = () => {const propsData = {name: 'John',age: 25,gender: 'male',// 更多的props...};return <Child {...propsData} />;
}export default Parent;// Child组件
import React from 'react';const Child = ({ name, age, gender }) => {// 在子组件中直接使用解构赋值方式接收所有的propsreturn (<div><p>Name: {name}</p><p>Age: {age}</p><p>Gender: {gender}</p>{/* 更多的渲染内容... */}</div>);
}export default Child;

在父组件Parent中,将所有要传递的值以对象propsData的形式定义,并使用扩展运算符{...propsData}将所有属性扩展到Child组件的props中。

在子组件Child中,使用解构赋值方式一次性接收所有传递过来的props,然后可以按需使用这些props值。

这样做可以实现一次性传递多个值,并且在子组件中以优雅的方式一次性接受所有props。

二、子组件向父组件传值

在React中,无论是函数式组件还是类组件,都可以通过props来实现子组件向父组件传值。

1. 函数组件中

在函数式组件中,可以通过在子组件中定义一个事件处理函数,并将该事件处理函数作为prop传递给父组件。然后在子组件中可以调用该事件处理函数并传递需要传递的值,从而实现子组件向父组件传值。以下是一个示例:

父组件:

import React, { useState } from 'react';
import ChildComponent from './ChildComponent';function ParentComponent() {const [value, setValue] = useState('');const handleChildValue = (childValue) => {setValue(childValue);}return (<div><ChildComponent onChildValue={handleChildValue} /><p>Value from child component: {value}</p></div>);
}export default ParentComponent;

子组件:

import React from 'react';function ChildComponent(props) {const handleClick = () => {props.onChildValue('Hello from child');}return (<button onClick={handleClick}>Click Me</button>);
}export default ChildComponent;

在上述示例中,ParentComponent通过将handleChildValue函数传递给ChildComponent组件的onChildValue prop,实现了子组件向父组件传值。当子组件中的按钮被点击时,会调用handleClick函数并调用props.onChildValue将数据传递给父组件。

2. 类组件中

在类组件中也可以通过类似的方式实现子组件向父组件传值。下面是一个示例:

父组件:

import React, { Component } from 'react';
import ChildComponent from './ChildComponent';class ParentComponent extends Component {constructor(props) {super(props);this.state = {value: ''};}handleChildValue = (childValue) => {this.setState({ value: childValue });}render() {return (<div><ChildComponent onChildValue={this.handleChildValue} /><p>Value from child component: {this.state.value}</p></div>);}
}export default ParentComponent;

子组件:

import React from 'react';class ChildComponent extends React.Component {handleClick = () => {this.props.onChildValue('Hello from child');}render() {return (<button onClick={this.handleClick}>Click Me</button>);}
}export default ChildComponent;

在上述示例中,父组件通过将handleChildValue函数传递给ChildComponent组件的onChildValue prop,实现了子组件向父组件传值。当子组件中的按钮被点击时,会调用handleClick函数并调用props.onChildValue将数据传递给父组件。

三、propTypes限制props

自React v15.5开始,PropTypes被独立出来作为独立的包。在该版本之前,PropTypes是作为React的一部分直接包含在react库中的。
在子组件中可以使用propTypes来限制父组件传递给子组件的props的数据类型,并可以设置默认值。使用propTypes需要先引入prop-types库。

下面是一个示例:

import React from 'react';
import PropTypes from 'prop-types';class ChildComponent extends React.Component {render() {return (<div><h2>{this.props.title}</h2><p>{this.props.description}</p></div>);}
}ChildComponent.propTypes = {title: PropTypes.string.isRequired, // 限制title必须为字符串类型且必传description: PropTypes.string // 限制description为字符串类型,非必传
}ChildComponent.defaultProps = {description: "No description" // 设置description的默认值为"No description"
}export default ChildComponent;

在上面的示例中,ChildComponent组件使用propTypes来限制title必须为字符串类型且必传,description为字符串类型,但非必传。如果父组件没有传递title,或传递的类型不是字符串,将会在控制台收到相应的警告。

另外,ChildComponent还使用defaultProps设置了description的默认值为"No description"。当父组件没有传递description时,将使用该默认值。

父组件使用ChildComponent时的使用示例:

import React from 'react';
import ChildComponent from './ChildComponent';class ParentComponent extends React.Component {render() {return (<div><ChildComponent title="Hello" description="This is a child component" /></div>);}
}export default ParentComponent;

在上面的示例中,ParentComponent传递了title和description给ChildComponent。title满足了限制的类型和必传的要求,而description也满足了限制的类型。

以下是常见的数据类型和PropTypes可以检测的类型:

数据类型PropTypes检测的类型
数字PropTypes.number
字符串PropTypes.string
布尔PropTypes.bool
数组PropTypes.array
对象PropTypes.object
函数PropTypes.func
符号PropTypes.symbol
元素类型PropTypes.element
任何类型PropTypes.any
自定义类型PropTypes.instanceOf(MyClass)
一组类型PropTypes.oneOfType([PropTypes.number, PropTypes.string])
限制可选值PropTypes.oneOf([‘red’, ‘blue’])
限制特定类型的数组PropTypes.arrayOf(PropTypes.number)
限制特定类型的对象PropTypes.objectOf(PropTypes.number)
限制对象具有特定属性PropTypes.shape({ name: PropTypes.string, age: PropTypes.number })

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

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

相关文章

NCCL后端

"NCCL" 代表 "NVIDIA Collective Communications Library"&#xff0c;"NVIDIA 集体通信库"&#xff0c;它是一种由 NVIDIA 开发的用于高性能计算的通信库。NCCL 专门设计用于加速 GPU 群集之间的通信&#xff0c;以便在并行计算和深度学习等领域…

mysql-面试50题-4

一、查询数据 ymysql-面试50题-2-CSDN博客 二、问题 31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名 mysql> select student.sid,student.sname -> from student,sc -> where cid"01" -> and score>80 -> a…

39 深度学习(三):tensorflow.data模块的使用(基础,可跳)

文章目录 data模块的使用基础api的介绍csv文件tfrecord data模块的使用 在训练的过程中&#xff0c;当数据量一大的时候&#xff0c;我们纯读取一个文件&#xff0c;然后每次训练都调用相同的文件&#xff0c;然后进行处理是很不科学的&#xff0c;或者说&#xff0c;当我们需…

ES6.8集群配置注意点

x-pack配置 当启用xpack.security.enabled时&#xff0c;确保集群中的所有节点都配置了此项&#xff0c;并确保所有节点都已重启。如果只有部分节点启用安全性&#xff0c;那么集群可能会遇到问题。 设置密码 使用elasticsearch-setup-passwords工具设置密码时&#xff0c;确保…

springboot 配置文件加载顺序

SpringBoot中配置文件的加载顺序是怎样的? 优先级从高到低&#xff0c;高优先级的配置覆盖低优先级的配置&#xff0c;所有配置会形成互补配置。 1.命令行参数。所有的配置都可以在命令行上进行指定; 2.Java系统属性(System.getProperties0) ; 3.操作系统环境变量 4.jar包外…

一、Docker Compose——什么是 Docker Compose

Docker Compose 是一个用来定义和运行多容器 Docker 应用程序的工具&#xff0c;他的方便之处就是可以使用 YAML 文件来配置将要运行的 Docker 容器&#xff0c;然后使用一条命令即可创建并启动配置好的 Docker 容器了&#xff1b;相比手动输入命令的繁琐&#xff0c;Docker Co…

stable-diffusion-webui环境部署

stable-diffusion-webui环境部署 1. 环境创建2. 安装依赖库3.下载底模4. 获取lora参数文件5.运行代码6. 报错信息报错1报错2 1. 环境创建 创建虚拟环境 conda create -n env_stable python3.10.0进入虚拟环境 conda activate env_stableclone源码 git clone https://github.com…

Unity地面交互效果——1、局部UV采样和混合轨迹

大家好&#xff0c;我是阿赵。   这期开始&#xff0c;打算介绍一下地面交互的一些做法。 比如&#xff1a; Unity引擎制作沙地实时凹陷网格的脚印效果 或者&#xff1a; Unity引擎制作雪地效果 这些效果的实现&#xff0c;需要基于一些基础的知识。所以这一篇先介绍一下简单…

Python网络爬虫介绍

视频版教程&#xff1a;一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 什么是网络爬虫&#xff1f; 网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff…

【5G PHY】5G SS/PBCH块介绍(二)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Linux服务器部署Spring Boot项目的一些shell命令脚本

1.启动jar包的命令&#xff08;根据jar包数量创建&#xff0c;并指定相对应的jar包&#xff09; nohup java -server -Xms64m -Xmx128m -jar 项目jar包的名称.jar --spring.profiles.activeprod > 记录jar包的日志.log 2>&1 &可以写在start.sh文件里&#xff08…

visual studio 启用C++11

用C11取决于你所使用的编译器和开发环境。以下是一些常见的编译器和相应的启用C11的方法&#xff1a; GCC (GNU Compiler Collection): 对于 GCC&#xff0c;你可以在编译时使用 -stdc11 或更高的标志来启用C11支持。例如&#xff1a; g -stdc11 yourfile.cpp -o yourprogramCl…

STM32 TIM(四)编码器接口

STM32 TIM&#xff08;四&#xff09;编码器接口 编码器接口简介 Encoder Interface 编码器接口 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的…

MySQL的数据库操作、数据类型、表操作

目录 一、数据库操作 &#xff08;1&#xff09;、显示数据库 &#xff08;2&#xff09;、创建数据库 &#xff08;3&#xff09;、删除数据库 &#xff08;4&#xff09;、使用数据库 二、常用数据类型 &#xff08;1&#xff09;、数值类型 &#xff08;2&#xff0…

uniapp 在 Android Studio 模拟器中运行项目

在开发App时&#xff0c;无论是使用 Flutter 还是 React native&#xff0c;还是使用uni-app 开发跨端App时&#xff0c;总是需要运行调试。一般调试分为两种。 第一&#xff1a;真机调试 第二&#xff1a;模拟器调试 真机调试的好处是可以看到更好的效果&#xff0c;缺点就是…

基于物联网云平台的分布式光伏监控系统的设计与实现

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;针对国内光伏发电监控系统的研究现状&#xff0c;文中提出了基于云平台的光伏发电监控体系。构建基于B/S架构的数据实时采集与推送&#xff0c;以SSH(strutsspringhibernate)作为Web开发框架&#xff0c;开发基…

07 MIT线性代数-求解Ax=0:主变量,特解 pivot variables, special solutions

前面定义了矩阵的列空间和零空间&#xff0c;那么如何求得这些子空间呢&#xff1f; 1. 计算零空间 Nullspace A的零空间即满足Ax0的所有x构成的向量空间 对于矩阵A进行“行操作”并不会改变Axb的解&#xff0c;因此也不会改变零空间 unchanged 第一步消元: echelon 阶梯型 …

香港服务器运行不正常原因简析

​  网站在线业务的部署需要服务器的存在。于我们而言&#xff0c;租用正规服务商(正规机房)的服务器&#xff0c;一般情况下是会很少出现问题。但&#xff0c;要知道&#xff0c;再稳定的服务器也有出现问题的时候&#xff0c;香港服务器也不例外&#xff0c;而且恰恰这个原…

基于Kubesphere容器云平台物联网云平台Devops实践

基于Kubesphere容器云平台物联网云平台Devops实践 项目背景 ​ 公司是做工业物联网相关业务的&#xff0c;现业务是云平台&#xff0c;技术栈 后端为 Springboot2.7JDK11 &#xff0c;前端为 Vue3Ts&#xff0c;需要搭建自动化运维平台以实现业务代码自动部署上线&#xff0c;…

168. Excel表列名称

168. Excel表列名称 Java代码&#xff1a; 26进制&#xff0c;但是每个进制是从1开始的&#xff0c;不是从0开始&#xff1b;因此要计算要构建从0开始的求余&#xff01; class Solution {public String convertToTitle(int cn) {StringBuilder sb new StringBuilder();whi…