React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

news2025/6/10 14:00:23

系列回顾:
在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒,但一个真实的React应用是由许多组件组合而成的,就像搭积木一样。如果这些“积木”之间不能互相沟通、传递信息,那我们就无法搭建出复杂的结构。

欢迎来到React学习的第三站!

今天,我们要学习组件之间最基本、最重要的一种沟通方式:父组件向子组件传递数据。而实现这种沟通的“信使”,就是 Props

什么是Props?

Props (是 Properties 的缩CR) 就像是你在调用一个JavaScript函数时传递的参数。在React中,它就是父组件在调用子组件时,传递给子组件的“属性”或“数据”。

核心思想:

  • 父组件拥有数据。
  • 父组件通过属性的方式,把数据“塞”给子组件。
  • 子组件通过一个叫做props的对象,接收并使用这些数据。

一个重要的原则:Props是只读的。 子组件只能读取和使用从父组件传来的Props,但绝对不能修改它。这保证了数据流的单向性(从上到下),让应用状态更可预测。


实战:创建一个用户卡片

让我们通过一个非常常见的案例——“用户卡片”——来学习Props的用法。我们将创建一个UserProfile子组件,它专门用来显示用户的头像和名字。而用户的具体信息(头像URL和名字)将由它的父组件App来提供。

第一步:创建子组件 UserProfile.jsx

  1. 在你的项目里,找到 src 文件夹。

  2. src 文件夹下,右键 -> 新建文件,命名为 UserProfile.jsx

  3. 将下面的代码复制到 UserProfile.jsx 文件中:

    // src/UserProfile.jsx
    
    function UserProfile(props) {
      // 'props' 是一个对象,包含了父组件传递过来的所有属性
      console.log(props); // 可以在浏览器控制台看看 props 长什么样
      
      return (
        <div className="user-card">
          <img src={props.avatarUrl} alt={props.name} className="avatar" />
          <h2 className="user-name">{props.name}</h2>
        </div>
      );
    }
    
    export default UserProfile;
    

    代码解释:

    • 我们的UserProfile组件接收一个参数props。React会自动把父组件传递的所有属性打包成一个对象,放进这个props里。
    • 在JSX中,我们通过props.avatarUrlprops.name来使用这些数据。
    • className是React中用来指定CSS类名的方式,它对应HTML中的class属性。

第二步:在父组件 App.jsx 中使用子组件并传递Props

现在,回到我们的App.jsx文件。我们将在这里“调用”刚刚创建的UserProfile组件,并像给HTML标签添加属性一样,把数据传递给它。

  1. 清空 App.jsx 并写入以下代码:

    // src/App.jsx
    
    import './App.css';
    import UserProfile from './UserProfile'; // 1. 导入子组件
    
    function App() {
      const userInfo = {
        name: 'React 小白',
        avatarUrl: 'https://zh-hans.react.dev/images/logo.svg' // 使用React官方Logo作为头像
      };
    
      return (
        <div>
          <h1>我的用户卡片</h1>
          {/* 2. 使用子组件,并像HTML属性一样传递props */}
          <UserProfile 
            name={userInfo.name} 
            avatarUrl={userInfo.avatarUrl} 
          />
        </div>
      );
    }
    
    export default App;
    

    代码解释:

    1. import UserProfile from './UserProfile';: 我们首先需要像导入普通模块一样,把子组件导入进来。
    2. 在JSX中,我们像使用一个自定义的HTML标签一样使用<UserProfile />
    3. 最关键的一步: 我们添加了nameavatarUrl这两个“属性”。
      • name={userInfo.name}: 这表示我们要传递一个名为name的prop,它的值是userInfo.name这个JavaScript变量的值。
      • avatarUrl={userInfo.avatarUrl}: 同理,传递一个名为avatarUrl的prop。

第三步:添加一点样式

为了让卡片更好看,我们给App.css添加一点简单的样式。打开src/App.css,用下面的代码替换原有内容:

/* src/App.css */
.user-card {
  border: 1px solid #ccc;
  border-radius: 8px;
  padding: 16px;
  text-align: center;
  width: 200px;
  margin: 20px auto;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.avatar {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  object-fit: cover;
}

.user-name {
  margin-top: 12px;
  color: #333;
}

第四步:查看效果

现在,保存所有文件,回到你的浏览器。你应该能看到一个漂亮的用户卡片,上面有React的Logo和"React 小白"这个名字。

你已经成功地实现了父组件到子组件的数据传递!

Props的更多用法

1. 传递不同类型的数据

Props不仅可以传递字符串,还可以传递任何JavaScript支持的类型。

<UserProfile
  name="Tom"          // 字符串
  age={25}             // 数字 (注意使用花括号)
  isMember={true}      // 布尔值
  hobbies={['coding', 'reading']} // 数组
  profile={{ job: 'developer' }} // 对象
  sayHi={() => alert('Hello!')} // 函数
/>

2. 使用Props解构赋值,让代码更简洁

在子组件中,每次都写props.name有点繁琐。我们可以使用JS的解构赋值来简化它。

修改UserProfile.jsx

// function UserProfile(props) {
// 变为:
function UserProfile({ name, avatarUrl }) { // 直接在这里解构
  return (
    <div className="user-card">
      {/* 现在可以直接使用变量名 */}
      <img src={avatarUrl} alt={name} className="avatar" />
      <h2 className="user-name">{name}</h2>
    </div>
  );
}

这样代码是不是清爽多了?这是现代React开发中非常推荐的做法。


总结与思考

今天,我们掌握了组件化开发中最重要的一环——组件间的通信。回顾一下核心知识:

  1. Props是什么? 它是父组件传递给子组件的数据,就像函数的参数。
  2. 如何传递Props? 在使用子组件时,像写HTML属性一样把数据“塞”进去:<MyComponent propName={value} />
  3. 如何接收Props? 子组件的函数接收一个props对象作为参数,通过props.propName来访问数据。
  4. Props是只读的! 子组件不能修改从父组件接收到的Props。

我们现在已经学会了组件的“自力更生”(State)和“向父辈求助”(Props)。但是,一个有生命力的应用,还需要能响应用户的各种操作,比如点击、输入等等。

在下一篇文章 《React事件处理:如何给按钮绑定onClick点击事件?》 中,我们将学习如何让我们的组件“听懂”用户的指令,从而构建出真正可交互的应用。我们下期再会!

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

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

相关文章

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。

2024 年&#xff0c;高端封装市场规模为 80 亿美元&#xff0c;预计到 2030 年将超过 280 亿美元&#xff0c;2024-2030 年复合年增长率为 23%。 细分到各个终端市场&#xff0c;最大的高端性能封装市场是“电信和基础设施”&#xff0c;2024 年该市场创造了超过 67% 的收入。…

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品&#xff08;包括KL357NU、KL3H7U和KL817U&#xff09;&#xff0c;专为高温环境下的汽车应用设计&#xff0c;具备以下核心优势和技术特点&#xff1a; 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计&#xff0c;确保在…

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…