react18【系列实用教程】组件 (2024最新版 | 含父子组件传值、兄弟组件传值、越层组件传值、“插槽“)

什么是组件?

一个组件就是用户界面的一部分,它可以有自己的逻辑和外观。

组件之间可以互相嵌套,也可以复用多次

在这里插入图片描述

为什么要用组件?

组件能让开发者像搭积木一样快速构建一个完整的庞大应用,大大提升了开发效率,降低了维护成本,因此当下前端的主流开发模式即组件化开发

定义组件

react 中的组件有以下特征:

  • 是一个首字母大写的函数
  • 函数的返回值是一段 JSX 代码,用于渲染页面
  • 通常每个组件都用独立的 .jsx 文件描述,并用 export default 对外导出
  • return 返回的语句写在一行,则可以省略() ,但只要不在一行,就必须要 () ,所以建议总是加上 ()
return <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />;

范例 Demo.jsx

function Demo() {
  return <div>你好</div>;
}

export default Demo;

也可以写成箭头函数

const Demo = () => {
  return <div>你好</div>;
};

export default Demo;

使用组件

以在 App.jsx 中使用为例:

先导入

import Demo from './Demo.js';

再使用

function App() {
  return (
    <>
      <Demo />
    </>
  );
}

可以单标签自闭,也可以像 html 一样双标签配对

<Demo></Demo>

组件通信

即组件间相互传递数据

父组件传值给子组件

    <Avatar
      person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }}
      size={100}
    />

子组件获取父组件的传值 props

function Avatar({ person, size }) {
  // 直接访问 person 和 size 即可
}

function Avatar(props) {
  let person = props.person;
  let size = props.size;
}

指定 props 的默认值

function Avatar({ person, size = 100 }) {
}

给 props 添加类型校验 propTypes

PropTypesReact 提供的一个用于类型检查的库。它可以用来验证组件的属性(props)是否符合预期的类型和格式

import PropTypes from "prop-types";

写在组件函数外

Avatar.propTypes = {
  person: PropTypes.object,
  size: PropTypes.number,
};
添加必填校验 .isRequired

在末尾添加 .isRequired

Avatar.propTypes = {
  person: PropTypes.object.isRequired,
  size: PropTypes.number,
};
数据类型检查器
  • PropTypes.string

  • PropTypes.symbol

  • PropTypes.number

  • PropTypes.bigint

  • PropTypes.bool

  • PropTypes.func

  • PropTypes.array

  • PropTypes.object

节点类型检查器
  • PropTypes.node
  • PropTypes.element
  • PropTypes.elementType

父组件给子组件传递 JSX 内容(插槽) children

使用子组件时,其标签内的内容(即插槽),在子组件中可通过 children 获取到

父组件

import Child from "./child.jsx";

function Father() {
  return (
    <>
      <Child>你好</Child>
    </>
  );
}

export default Father;

子组件

function Child({ children }) {
  return (
    <>
      <h1>我是子组件</h1>
      <div>父组件传入的插槽内容为:{children}</div>
    </>
  );
}

export default Child;

子组件传值给父组件

实现方案:在子组件中调用父组件中的函数并传递参数

父组件

import { useState } from "react";
import Child from "./child.jsx";

function Father() {
  const [name, setName] = useState("朝阳");

  function changeName() {
    setName("新的朝阳");
  }
  return (
    <>
      <h1>我是父组件</h1>
      <p>父组件中的变量 name 的值为:{name}</p>
      <Child changeName={changeName}></Child>
    </>
  );
}

export default Father;

子组件

import PropTypes from "prop-types";
function Child({ changeName }) {
  return (
    <>
      <h1>我是子组件</h1>
      <button onClick={changeName}>修改父组件的名字为“新的朝阳”</button>
    </>
  );
}

Child.propTypes = {
  changeName: PropTypes.func,
};

export default Child;

兄弟组件通信

在这里插入图片描述

father.jsx

import { useState } from "react";
import ChildA from "./childA.jsx";

import ChildB from "./childB.jsx";

function Father() {
  const [msgA, setMsgA] = useState("");
  function sendMsgToB(msg) {
    setMsgA(msg);
  }
  return (
    <>
      <ChildA sendMsgToB={sendMsgToB} />
      <ChildB msgA={msgA} />
    </>
  );
}

export default Father;

childA.jsx

import PropTypes from "prop-types";

function ChildA({ sendMsgToB }) {
  const dataA = "子组件A的数据";
  return (
    <>
      <div>
        <h1>我是子组件A</h1>
        <button onClick={() => sendMsgToB(dataA)}>向子组件B传递数据</button>
      </div>
    </>
  );
}

ChildA.propTypes = {
  sendMsgToB: PropTypes.func,
};

export default ChildA;

childB.jsx

import PropTypes from "prop-types";

function ChildB({ msgA }) {
  return (
    <>
      <div>
        <h1>我是子组件B</h1>
        <p>子组件A传来的数据为:{msgA}</p>
      </div>
    </>
  );
}

ChildB.propTypes = {
  msgA: PropTypes.string,
};

export default ChildB;

跨层组件通信

在这里插入图片描述
详见 https://blog.csdn.net/weixin_41192489/article/details/138700487

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL数据库】丨高可用之MHA集群部署

一、准备工作 1.1 修改主机名 vim /etc/hosts# 添加对应主机 192.168.28.128 mha1 192.168.28.131 mha2 192.168.28.132 mha31.2 关闭防火墙及修改selinux # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭自启动# 修改selinux vim /etc/sy…

EasyImage2.0 图床源码

EasyImage2.0 是一个简单图床的源码&#xff0c;它支持以下功能&#xff1a; 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …

基于STC12C5A60S2系列1T 8051单片机实现一主单片机发送数据给一从单片机接收并返回数据给主单片机的串口通信功能

基于STC12C5A60S2系列1T 8051单片机实现一主单片机发送数据给一从单片机接收并返回数据给主单片机的串口通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片…

langchain_community切分各种文档数据;加载向量模型;使用向量库

参考: https://github.com/langchain-ai/langchain https://api.python.langchain.com/en/latest/community_api_reference.html https://github.com/shibing624/ChatPilot/blob/384f18e4f10f87e10f104f9ff57f02c655588035/chatpilot/apps/rag_app.py 安装: pip instal…

# 从浅入深 学习 SpringCloud 微服务架构(十八)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十八&#xff09; 一、开源配置中心 Apollo&#xff1a;概述 1、开源配置中心 Apollo Apollo -A reliable configuration management system Apollo(阿波罗)是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理…

Gitlab、Redis、Nacos、Apache Shiro、Gitlab、weblogic相关漏洞

文章目录 一、Gitlab远程代码执行&#xff08;CVE-2021-22205&#xff09;二、Redis主从复制远程命令执行三、Nacos认证绕过漏洞&#xff08;CVE-2021-29441&#xff09;四、Apache Shiro认证绕过漏洞&#xff08;CVE-2020-1957&#xff09;五、Gitlab任意文件读取漏洞&#xf…

北亚MF2200手机取证平台介绍

一、产品介绍。 北亚MF2200手机取证平台是由北亚企安科技&#xff08;北京&#xff09;有限公司&#xff08;Frombyte&#xff09;自主研发的一款针对智能手机&#xff08;iPhone、Android&#xff09;及 iPad 取证分析的法证平台。本平台采集速度快&#xff0c;可通过自动提取…

如何选择沙发3D模型下载?

在家具沙发定制过程中&#xff0c;选择合适的沙发3D模型可以方便地进行沟通&#xff0c;让双方能够更清晰地了解对方的设想。此外&#xff0c;通过3D模型&#xff0c;双方还可以更方便地对设计方案进行修改和完善。那么如何选择合适的沙发3D模型下载? 1.确定预算 在选择沙发3D…

一篇文章告诉你:通信网优比计算机岗位好在哪?

据优橙2023年就业人员专业分布统计&#xff0c;通信专业学员占比32.7%&#xff0c;非通信专业学员占比64.8%&#xff0c;其他占比2.5%。 可见从事网优的学员中大部分为非通信专业。而非通信专业中72%的学生在学习通信网优还是计算机专业中&#xff0c;选择了通信网优。 为什么越…

C# WinForm —— 14 CheckedListBox 复选列表框介绍

1. 简介 类似 ListBox&#xff0c;提供项的列表&#xff0c;区别就是 CheckedListBox 每一个项前面有个复选框 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 ckl 开头BackColor背景颜色BoderStyle边框样式&#xff1a;无、FixedSingle、F…

【错误的集合】力扣python

最初想法 def findErrorNums(nums):n len(nums)duplicate -1missing -1for num in nums:if nums[abs(num) - 1] < 0:duplicate abs(num)else:nums[abs(num) - 1] * -1for i in range(n):if nums[i] > 0:missing i 1breakreturn [duplicate, missing] 遇到力扣大佬…

[Go] 结构体不初始化仍然能够调用其方法

文章目录 背景复现原理验证验证2结论参考文档 背景 在写代码的时候&#xff0c;偶然没有将结构体初始化&#xff0c;又调用了该结构体的方法&#xff0c;编译器竟然没有报错&#xff0c;而且运行也是正常的。 复现 写了一个小 demo 用于复现&#xff0c;可以看到&#xff0c…

『 Linux 』重定向 Redirect(万字)

文章目录 &#x1f9f8; 什么是重定向&#x1f421; 文件描述符的分配规则&#x1f421; 重定向在日常使用中的简单示例 &#x1f9f8; 实现重定向的底层机制&#x1f421; dup2()&#x1f421; 利用dup2()实现重定向 &#x1f9f8; 在自定义Shell当中添加重定向功能&#x1f4…

Python tensor向量维度转换,不同维度的向量转化为相同的维度,经过全连接层MLP的维度转换,代码实战

问题&#xff1a;在机器学习特征工程中&#xff0c;假如每类特征需要转化为相同的维度进行拼接&#xff0c;那该怎么办呢&#xff1f;接一个全连接层MLP就可以了。 例子&#xff1a;将&#xff08;128,64&#xff09; 维度的向量转化为&#xff08;128,32&#xff09;维。 impo…

通过随机采样和数据增强来解决数据不平衡的问题

什么是类别不平衡 当每个类别的样本不平衡时&#xff0c;即在类别分布之间没有平衡比率时&#xff0c;会出现类别不平衡的问题。 这种失衡可能是轻微的&#xff0c;也可能是严重的。 取决于样本量&#xff0c;比率从1&#xff1a;2到1:10可以理解为轻微的不平衡&#xff0c;比…

基于UDP协议Python通信网络程序(服务器端+客户端)及通信协议在自动驾驶场景应用示例

一、UDP协议 UDP&#xff08;用户数据报协议&#xff09;是一种无连接的传输层协议&#xff0c;具有简单、高效的特点&#xff0c;适用于一些对数据可靠性要求不高的应用场景。UDP的主要特点包括无连接、不可靠和面向数据报。这意味着在发送数据之前不需要建立连接&#xff0c…

撤销 git add 操作(忽略被追踪的文件)

文章目录 引言I git rm命令来取消暂存【推荐】II 撤销特定文件的暂存状态2.1 git rese2.2 git restoresee also引言 应用场景: 修改.gitignoregitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先…

国产化开源鸿蒙系统智能终端RK3568主板在电子班牌项目的应用

国产化开源鸿蒙系统智能终端主板AIoT-3568A、人脸识别算法的的电子班牌方案可支持校园信息发布、人脸识别考勤、考场管理、查询互动等多项功能&#xff0c;助力学校在硬件上实现信息化、网络化、数字化&#xff0c;构建“学校、教师、学生”三个维度的智慧教育空间。 方案优势 …

微软推出的Microsoft Fabric 到底是什么?

近期&#xff0c;总有客户问小编&#xff0c;微软推出的 Microsoft Fabric 是什么&#xff1f;这个产品有什么特别之处呢&#xff1f;希望下面这篇文章能为大家解开一些疑惑。 微软Fabric是2023年5月推出的一个数据分析平台&#xff0c;它将关键数据管理和分析工作负载整合到一…

618值得入手的数码产品怎么选?2024 买过不后悔的数码好物分享

在数字时代的浪潮中&#xff0c;每一次的购物狂欢节都如同一场科技盛宴&#xff0c;让我们有机会接触到最前沿、最实用的数码产品&#xff0c;而“618”无疑是这场盛宴中最为引人瞩目的日子之一。面对琳琅满目的商品&#xff0c;如何选择那些真正值得入手的数码好物&#xff0c…