【React 入门系列】React 组件通讯与生命周期详解

🧩 第一章:组件通讯概述

在 React 开发中,组件是封装的、独立的功能单元。为了实现组件间的数据共享与协作,需要通过组件通讯机制

组件通讯的意义:
让多个封闭的组件能够共享数据,实现协作功能。


📥 第二章:组件 Props 基础与进阶

1. Props 的基本使用

组件是封闭的,要接收外部数据应通过 props(属性) 实现。

✅ 使用方式:
  • 传递数据:给组件标签添加属性
  • 接收数据
    • 函数组件:通过参数 props 接收
    • 类组件:通过 this.props 接收
✅ 示例:
<Hello name="jack" age={19} />
// 函数组件
function Hello(props) {return <div>接收到数据:{props.name}</div>;
}
// 类组件
class Hello extends React.Component {render() {return <div>接收到数据:{this.props.age}</div>;}
}

2. Props 的特点

  1. 可传递任意类型数据

    <Helloname="root"age={19}colors={['red', 'blue']}fn={() => console.log('函数')}tag={<h1>标签</h1>}
    />
  2. 只读对象
    props 是只读的,不能直接修改。

  3. 构造函数中使用 props
    如果类组件有构造函数,必须将 props 传入 super(),否则无法在构造函数中访问 props。

    constructor(props) {super(props);
    }

3. 组件通信的三种方式

✅ 1. 父组件 → 子组件

步骤:

  1. 父组件通过 state 传递数据
  2. 子组件通过 props 接收数据
class Parent extends React.Component {state = { lastName: "王" };render() {return <Child name={this.state.lastName} />;}
}
function Child(props) {return <div>子组件接收到数据:{props.name}</div>;
}

✅ 2. 子组件 → 父组件

使用回调函数实现:

  1. 父组件定义回调函数,并传给子组件
  2. 子组件调用回调,传入数据
class Parent extends React.Component {getChildMsg = (msg) => {console.log("接收到子组件数据", msg);};render() {return <Child getMsg={this.getChildMsg} />;}
}
class Child extends React.Component {state = { childMsg: "react" };handleClick = () => {this.props.getMsg(this.state.childMsg);};return <button onClick={this.handleClick}>点击传值</button>;
}

✅ 3. 兄弟组件通信

核心思想:状态提升(Lifting State Up)

  1. 将共享状态提升到公共父组件
  2. 父组件提供状态和更新方法
  3. 子组件通过 props 接收并使用
class App extends React.Component {state = { count: 0 };handleClick = () => {this.setState({ count: this.state.count + 1 });};render() {return (<div><Zi num={this.state.count} /><Zi2 numadd={this.handleClick} /></div>);}
}
function Zi(props) {return <div>count: {props.num}</div>;
}function Zi2(props) {return <button onClick={props.numadd}>Click Me</button>;
}

✅ 4. Context 组件(跨层级通信)

当组件嵌套较深或为“远方亲戚”时,使用 Context 实现通信更高效。

使用步骤:

  1. 创建 Provider 和 Consumer
const { Provider, Consumer } = React.createContext();
  1. 使用 Provider 提供数据
<Provider value="pink"><div className="APP"><Child /></div>
</Provider>
  1. 使用 Consumer 消费数据
<Consumer>{data => <span>数据为:{data}</span>}
</Consumer>

🧠 第三章:Props 深入理解

1. children 属性

表示组件标签的子节点,可以是任意类型:文本、React 元素、组件、甚至是函数。

function Hello(props) {return <div>组件的子节点:{props.children}</div>;
}
<Hello>我是子节点</Hello>

2. Props 校验(PropTypes)

使用 prop-types 包进行类型校验,确保组件接收的数据符合预期。

安装:

npm install prop-types

使用:

import PropTypes from 'prop-types';App.propTypes = {colors: PropTypes.array,fn: PropTypes.func.isRequired,shape: PropTypes.shape({id: PropTypes.number,name: PropTypes.string})
};

3. Props 默认值(defaultProps)

设置默认值,防止 props 未传时出错。

App.defaultProps = {pageSize: 10
};
function App(props) {return <div>默认值:{props.pageSize}</div>;
}

🕒 第四章:组件生命周期详解

组件的生命周期分为三个阶段:创建、更新、卸载,每个阶段都有对应的钩子函数。

1. 创建阶段(Mounting)

执行时机:组件创建时(页面加载时)

执行顺序:

constructor → render() → componentDidMount
  • constructor:初始化 state,绑定 this
  • render:渲染 UI(不能调用 setState
  • componentDidMount:组件挂载后,适合发送网络请求、DOM 操作
constructor(props) {super(props);this.state = { count: 0 };
}
componentDidMount() {console.log('组件已挂载');
}

2. 更新阶段(Updating)

执行时机:组件更新时(如调用 setState()forceUpdate() 或接收到新的 props)

执行顺序:

render() → componentDidUpdate()
  • render:重新渲染 UI
  • componentDidUpdate:组件更新后,适合发送网络请求、DOM 操作
componentDidUpdate(prevProps, prevState) {if (prevState.count !== this.state.count) {console.log('组件已更新');}
}

3. 卸载阶段(Unmounting)

执行时机:组件从页面消失

执行函数:

componentWillUnmount() {// 清理工作,如清除定时器、取消订阅等
}

📚 总结

模块内容
组件通讯Props、回调函数、Context、状态提升
Props传递任意类型数据、只读、children、校验、默认值
生命周期创建、更新、卸载阶段,各阶段钩子函数用途

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

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

相关文章

前端开发 Vue 状态优化

Vue 项目中的状态优化一般都会用Pinia替代Vuex&#xff0c;Pinia 是 Vue 生态系统中的一个轻量级状态管理库&#xff0c;作为 Vuex 的替代品&#xff0c;它提供了更简洁的 API 和更好的性能。模块化管理&#xff1a;使用 Pinia 时&#xff0c;建议将状态拆分为多个 store 模块&…

虚幻基础:创建角色——FPS

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录创建角色设置模型添加摄像机添加位置&#xff1a;插槽弹簧臂&#xff1a;伸缩防止由碰撞导致摄像机穿模摄像机添加武器添加位置&#xff1a;插槽创建动画蓝图&#xff1a;主动获取角色数据并播放相应动画设置角色控制…

2025年入局苹果Vision Pro开发:从零到发布的完整路线图

苹果Vision Pro的发布标志着空间计算(Spatial Computing)进入主流市场。作为开发者,如何快速掌握visionOS开发?本文将为你提供详细的路线图、实践建议与资源指南,涵盖从窗口式应用到沉浸式3D应用的完整开发路径。 一、visionOS开发的核心目标与阶段划分 visionOS的开发可…

百度文心大模型ERNIE全面解析

百度文心大模型ERNIE概述 百度推出的文心大模型(ERNIE,Enhanced Representation through kNowledge IntEgration)系列是结合知识增强技术的预训练大模型,涵盖自然语言处理(NLP)、跨模态、行业应用等多个方向。其开源版本为开发者提供了可商用的大模型能力支持。 ERNIE的…

【SpringAI实战】提示词工程实现哄哄模拟器

一、前言 二、实现效果 三、代码实现 3.1 后端实现 3.2 前端实现 一、前言 Spring AI详解&#xff1a;【Spring AI详解】开启Java生态的智能应用开发新时代(附不同功能的Spring AI实战项目)-CSDN博客 二、实现效果 游戏规则很简单&#xff0c;就是说你的女友生气了&#x…

速通python加密之AES加密

AES加密 AES加密&#xff08;Advanced Encryption Standard&#xff0c;高级加密标准&#xff09;是目前全球公认的最安全、应用最广泛的对称加密算法之一&#xff0c;于2001年被美国国家标准与技术研究院&#xff08;NIST&#xff09;确定为替代DES的标准加密算法&#xff0c;…

Java 对象秒变 Map:字段自由伸缩的优雅实现

前言 在开发中,我们常常需要把对象转成 Map 格式,用于序列化、传输、展示,甚至硬塞给某些第三方框架吃进去再吐出来。乍一看很简单,字段多起来后就像打翻调色盘,维护起来一不小心就翻车。想优雅地搞定这事,必须有一套稳妥、可扩展的方案,才能写出让同事膜拜、领导点赞、…

激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定

激光雷达-相机标定工具&#xff1a;支持普通相机和鱼眼相机的交互式标定 前言 在自动驾驶、机器人导航等领域&#xff0c;激光雷达和相机的标定是一个基础而重要的问题。准确的标定结果直接影响后续的感知算法性能。本文将介绍一个开源的激光雷达-相机标定工具&#xff0c;支持…

linux shell从入门到精通(二)——变量操作

1.什么是变量变量在许多程序设计语言中都有定义&#xff0c;与变量相伴地有使用范围地定义。Linux Shell也不例外。变量&#xff0c;本质上就是一个键值对。例如&#xff1a;str“hello”就是将字符串值“hello”赋予键str。在str地使用范围内&#xff0c;我们都可以用str来引用…

[Linux入门] 初学者入门:Linux DNS 域名解析服务详解

目录 一、域名服务基础&#xff1a;从 “名字” 到 “地址” 的转换 1️⃣什么是域名&#xff1f; 2️⃣什么是 DNS&#xff1f; 3️⃣DNS 用 TCP 还是 UDP&#xff1f; 二、DNS 服务器&#xff1a;各司其职的 “导航站” 1️⃣根域名服务器 2️⃣顶级域名服务器 3️⃣权…

iview表单验证一直提示为空的几个原因?

1.Form上的rules是否配置正确&#xff1b; 2.Form-item的prop是否配置正确&#xff1b; 3.规则的名称和input的v-model是否对应&#xff1b; 4.验证的字段是否响应&#xff0c;新增字段使用this. $set. © 著作权归作者所有,转载或内容合作请联系作者 平台声明&#xff1…

SpringBoot3(若依框架)集成Mybatis-Plus和单元测试功能,以及问题解决

一、Mybatis-Plus集成 新增依赖到父级pom.xml&#xff0c;原先的mybatis依赖可以不动需要注意 mybatis-plus与mybatis版本之间的冲突&#xff0c;不要轻易改动依赖&#xff0c;不然分页也容易出现问题分类顶级pom.xml下面&#xff0c;如果没有引入还是出现报错&#xff0c;在co…

删除远程分支上非本分支的提交记录

要删除远程分支上非本分支的提交记录&#xff08;即主分支的提交历史&#xff09;&#xff0c;需要使用 Git 的重写历史功能。以下是完整解决方案&#xff1a; 解决方案步骤&#xff1a; 创建干净的新分支&#xff08;基于主分支最新提交&#xff09; # 切换到主分支并更新 git…

Flask input 和datalist结合

<input list"categories" name"category" id"category" class"form-control" placeholder"任务分类" required> 这段代码是一个 HTML 输入控件&#xff0c;结合了 <input> 和 <datalist>&#xff0c;用来…

嵌入式分享#27:原来GT911有两个I2C地址(全志T527)

最近在调试全志T527的触摸功能时&#xff0c;发现GT911触摸芯片的I2C地址有时是0x5d&#xff0c;有时又识别成0x14&#xff0c;不知道大家有没有遇到过类似这个情况。虽然最后使用0x5d地址调通了触摸功能&#xff0c;但是一直还是很困惑&#xff0c;为什么会出现0x14和0x5d两个…

Linux运维新人自用笔记(Rsync远程传输备份,服务端、邮箱和客户端配置、脚本)

内容全为个人理解和自查资料梳理&#xff0c;欢迎各位大神指点&#xff01;每天学习较为零散。day24一、Rsync传输文件#安装rsync#-a递归同步&#xff08;包含子目录&#xff09;保留文件权限、所有者、组、时间戳等元数据 #​​-z传输时压缩数据 #​​-v显示详细同步过程 #​​…

以 “有机” 重构增长:云集从电商平台到健康生活社区的跃迁

当电商行业陷入流量争夺的红海&#xff0c;同质化运营模式难以突破增长瓶颈时&#xff0c;云集以从精选电商到有机生活平台的战略转型&#xff0c;开辟出差异化发展路径。其转型并非凭经验决断的孤例&#xff0c;而是建立在对市场趋势的精准研判、用户需求的深度解码&#xff0…

【2025最新版】midjourney小白零基础入门到精通教程!人工智能绘图+AI绘图+AI画图,一键出图教程 (持续更新)

前言 现在市面上相关的AI绘画工具非常多&#xff0c;有6pen.art、Stable Diffusion、DALL.E、Midjourney等。 而MJ就目前而言&#xff0c;它是一款强大的人工智能工具&#xff0c;旨在帮助设计师和创意人员完成各种设计任务。 非常适合我们图像工作者&#xff0c;从 UI 设计到…

2025年渗透测试面试题总结-2025年HW(护网面试) 70(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 70 一、自我介绍 二、同源策略 & 三大漏洞对比解析 1. 同源策略&#xff08;SOP&…

加权卡尔曼滤波

加权卡尔曼滤波融合&#xff0c;它通过给不同传感器或估计结果分配不同的权重&#xff0c;来提高状态估计的精度和可靠性。一、卡尔曼滤波1.状态方程2.观测方程其中&#xff1a;基本方程①状态一步预测②状态估计③滤波增益④一步预测均方差⑤估计均方误差二、加权卡尔曼滤波对…