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

news2025/1/19 14:13:18

什么是组件?

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

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

在这里插入图片描述

为什么要用组件?

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

定义组件

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

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

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

相关文章

刚刚OpenAI发布ChatGPT-4o模型,免费使用GPT4o并免费提供更多功能

就在今日凌晨1点&#xff0c;OpenAI举行了春季发布会&#xff0c;发布了GPT-4o 并免费提供更多功能。 亲测GPT-4o已经可以免费试用&#xff0c;每个人都可以使用它并从中受益&#xff0c;GPT4终于不再是少部分人的玩物。 点击加入ChatGPT4交流群&#xff1a;https://www.aijour…

vue3专栏项目 -- 五、权限管理(上)

一、登录部分 1、第一部分&#xff1a;获取token 前面我们主要是在获取数据上下功夫&#xff0c;到目前为止我们已经能获取首页和详情页的数据了&#xff0c;现在我们将数据转移到权限管理上来&#xff0c;也就是说我们要处理用户登录、注册等一系列的行为&#xff0c;在这部…

JavaScript:正则表达式属于字符串吗-不属于/字符串转正则表达式的两种方法

一、需求描述 js 字符串转正则表达式 二、理解正则表达式属于字符串吗? 正则表达式不属于字符串&#xff0c;它是一种用于匹配、查找和操作文本的模式。正则表达式是一种特殊的语法&#xff0c;用于描述字符串的特征。通过使用正则表达式&#xff0c;可以检查一个字符串是否…

找不到vcomp140.dll多种修复方法分享,轻松解决dll报错问题

当你在尝试运行某款软件时&#xff0c;系统突然弹出一个错误提示&#xff0c;明确指出“vcomp140.dll文件丢失”&#xff0c;这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复措施。本文将详细介绍vcomp140.dll丢失的5种修复方法…

Java的VO,BO,PO,DO,DTO

写在前面 本文看下VO&#xff0c;BO&#xff0c;PO&#xff0c;DO&#xff0c;DTO&#xff0c;都是啥&#xff01; 1&#xff1a;正文 先看一张图&#xff0c;看了图就能知道个大概了&#xff1a; 1.1&#xff1a;PO 全称是persistent object&#xff0c;对应数据的表&am…

记录一次 vue2 前端项目整合过程

整合成功效果图 具体说明&#xff1a; 项目A是现在的vue2前端项目&#xff0c;项目B是一个开源的工作流前端&#xff0c;项目后端代码已经整合了&#xff0c;就不多提了。这里主要记录下前端整合的过程和思路。 1、开源工作流里面的功能&#xff0c;拷贝到自己对应的vue2项目里…

【Linux】解析键盘组合键产生信号的完整过程:从硬件中断到信号发送

前言 每一个了解Linux的都知道这样一个知识&#xff0c;CtrlC组合键能够终止一个进程。 个人了解进程相关知识之后知道&#xff0c;一个进程被终止只会有有三种情况&#xff1a; 代码运行完毕&#xff0c;结果正确代码运行完毕&#xff0c;结果不正确代码运行异常&#xff…

广东省网络安全竞赛部分web,misc wp

我的队伍只做了5题&#xff0c;还是太菜了&#xff0c;本来不想发的&#xff0c;但是写都写了&#xff0c;还是水一篇博客吧 这里是我们队的wp misc1 给了一个压缩包&#xff0c;解压需要密码&#xff0c;用纯数字密码没跑出来&#xff0c;感觉可能不是要强跑&#xff0c;看…

海外媒体宣发:新加坡.马来西亚如何在海外媒体投放新闻通稿-大舍传媒

导言 随着全球化的进程加速&#xff0c;海外市场对于企业的发展越来越重要。而在海外媒体上宣传企业的新闻通稿&#xff0c;成为了拓展海外市场和提升企业知名度的重要手段之一。本文将介绍大舍传媒对于如何在海外媒体上投放新闻通稿的经验和策略。 准备工作&#xff1a;了解…

Patch-Wise Graph Contrastive Learning for Image Translation

Patch-Wise Graph Contrastive Learning for Image Translation 图像翻译中的逐块图对比学习 Chanyong Jung1, Gihyun Kwon1, Jong Chul Ye1, 2 Chanyong Jung&#xff0c;Gihyun Kwon&#xff0c;Jong Chul Ye 1, 2 Abstract 摘要 Patch-Wise Graph Cont…

CSS实现渐变色

渐变色分为线性渐变和径向渐变。 线性渐变linear-gradient(方向, 颜色1, 颜色2, … ,颜色n)径向渐变radial-gradient(颜色1 覆盖区域大小, 颜色2 覆盖区域大小, … ) 线性渐变的方向可以为&#xff1a; ​ 1、一个方向值时&#xff1a; to bottom 表示从上边到下边渐变 ​ 2、…

SpringAMQP 发布订阅-DirectExchange

DirectExchange: 路由模式模型 代码实现 直接通过注解方式绑定交换机和队列&#xff0c;这里边加了key也就是BingdingKey绑定key&#xff0c;可以看作交换机的路由规则&#xff0c;交换机收到消息后读取消息中指定的Routingkey发送到存有相应BingdingKey的队列中。 RabbitLis…

【Power BI】DAX语言 VS Power Query M语言

DAX&#xff08;Data Analysis Expressions&#xff09;和Power Query M语言是Microsoft Power BI和Excel中的两种强大的数据处理和分析工具。尽管它们在许多方面都有重叠之处&#xff0c;特别是用于数据建模和数据转换&#xff0c;但它们在用途、语法和功能上有显著的区别。本…

联想移动硬盘数据不见了?别急,分享4种实用恢复方法

在数字化时代&#xff0c;硬盘作为数据存储的核心设备&#xff0c;承载着大量的重要信息和文件。然而&#xff0c;有时我们可能会遭遇硬盘数据丢失的困境&#xff0c;特别是当这个问题发生在联想硬盘上时&#xff0c;更是让人倍感焦虑。本文将深入探讨联想硬盘数据丢失的可能原…

【热门话题】Vue.js:现代前端开发的轻量级框架之旅

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Vue.js&#xff1a;现代前端开发的轻量级框架之旅一、Vue.js概览1.1 Vue.js的诞…

如何完美实现文件外发防泄漏,保护核心数据资产?

不管是大型企业&#xff0c;还是小型创业公司&#xff0c;不论企业规模大小&#xff0c;每天都会有大量的文件要进行内部传输协作和对外发送使用&#xff0c;数据的生产也是企业业务生产力的体现之一。因此文件外发防泄漏是企业信息安全中的一个重要议题&#xff0c;为了防止企…

关于‘==’与equals的区别

我写的也不清楚&#xff0c;有兴趣的可以看这位大佬的文章链接&#xff0c;说的很清楚 https://www.cnblogs.com/Latiny/p/8099581.html#!comments 与 equals 方法 判断两个变量是否相等有两种方式&#xff1a;一种是利用 运算符&#xff0c;另一种是利用equals方法。 注意…

YOLOv9全网最新改进系列::YOLOv9完美融合双卷积核(DualConv)来构建轻量级深度神经网络,目标检测模型有效涨点神器!!!

YOLOv9全网最新改进系列&#xff1a;&#xff1a;YOLOv9完美融合双卷积核&#xff08;DualConv&#xff09;来构建轻量级深度神经网络,目标检测模型有效涨点神器&#xff01;&#xff01;&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er …

Flutter 依据JSON数据自动生成实体类

json自动化生成工具 点击这里可以跳转 页面是这样的 然后在左边输入你的json数据&#xff0c;它会自动生成对应的实体类 生成的实体类是如下&#xff1a; import package:json_annotation/json_annotation.dart; part merch_region.g.dart;JsonSerializable()class MerchReg…

Java面试八股之反射慢在哪里

Java反射慢在哪里 动态类型检查&#xff1a; 在反射过程中&#xff0c;Java需要在运行时确定类、方法、字段等的类型信息。这与编译时已经确定类型信息的常规对象访问不同&#xff0c;反射需要额外的类型查询和验证&#xff0c;增加了性能开销。 安全检查&#xff1a; 反射…