当前位置: 首页 > news >正文

从项目代码看 React:State 和 Props 的区别及应用场景实例讲解

在 React 中,stateprops 是组件的两个重要概念,它们有不同的作用和应用场景。理解它们之间的区别对于开发 React 应用至关重要。

1. stateprops 的区别

  • props (属性)

    • props 是由父组件传递给子组件的数据或函数。
    • props只读的,子组件不能修改父组件传递给它的 props。它只能接收和使用这些数据。
    • props 用来传递数据和回调函数,子组件通过 props 获取父组件传递的值。
  • state (状态)

    • state 是组件内部管理的状态,用于存储组件本地的数据。
    • state可变的,组件内部可以通过 this.setState() 来更新状态,并触发组件重新渲染。
    • state 用于存储组件需要动态变化的数据,并根据这些数据决定渲染内容。

2. stateprops 的应用场景

  • props 的应用场景

    • props 主要用于父组件向子组件传递数据,或者在子组件中执行父组件传递的回调函数。
    • 适用于组件间数据传递的场景,比如父子组件间的交互。
  • state 的应用场景

    • state 用于管理组件内部的可变数据,适用于组件需要在不同状态下渲染不同内容的场景。
    • 比如,表单输入、用户点击操作、动态显示等场景。

3. 通过实际项目代码讲解 stateprops 的应用

假设我们正在开发一个简单的计数器应用。我们有两个组件:一个是父组件 App,另一个是子组件 Counter,用于显示和增加计数值。

代码示例:使用 propsstate 的计数器应用
import React, { Component } from 'react';// 子组件:计数器
class Counter extends Component {constructor(props) {super(props);this.state = {count: 0,  // 组件内部的状态};}// 增加计数increment = () => {this.setState(prevState => ({count: prevState.count + 1,}));};render() {return (<div><h2>Current Count: {this.state.count}</h2><button onClick={this.increment}>Increment</button><h3>Message from parent: {this.props.message}</h3> {/* 使用父组件传递的 props */}</div>);}
}// 父组件:App
class App extends Component {render() {return (<div><h1>React Props and State Example</h1><Counter message="Hello from App!" />  {/* 通过 props 传递数据 */}</div>);}
}export default App;

4. 代码解析

props 在应用中的使用
  • message 是从父组件 App 传递给子组件 Counterprops。子组件通过 this.props.message 来访问该值。

    • 这里,message="Hello from App!" 就是父组件传递给子组件的 props 数据。
    • Counter 组件中,this.props.message 用于显示父组件传递的信息。
  • 父子组件的传递数据

    • props 的作用是让父组件将数据传递给子组件,子组件不能修改父组件传递的数据,它只能接收并展示这些数据。
state 在应用中的使用
  • countCounter 组件的内部状态,它用来表示计数器的当前值。

    • state 用于存储组件内部的可变数据。每当 state 更新时,React 会重新渲染组件。
    • this.state.count 存储计数器的值,点击按钮时,通过 this.setState 来更新 count 的值,触发重新渲染。
  • 更新 state 并重新渲染

    • 当用户点击 Increment 按钮时,increment 方法会被调用,这会更新 state 中的 count,导致组件重新渲染,显示新的计数值。

5. 应用场景总结

  • props

    • 父组件向子组件传递数据。
    • 子组件通过 props 接收父组件的数据并展示。
    • props 适用于组件间的数据传递和函数回调,子组件不能修改 props
  • state

    • 管理组件内部的动态数据。
    • 在组件中使用 state 存储和管理用户交互、数据变化等信息。
    • 适用于需要变更组件状态并触发重新渲染的场景。

6. 实际项目中的应用

在一个真实的项目中,propsstate 的使用是非常常见的。比如,在一个购物车应用中:

  • props:用来传递商品数据、用户信息、购物车状态等给子组件,子组件根据 props 渲染 UI。
  • state:用来管理用户的购物车状态,比如商品数量、总价等,当用户点击加减按钮时更新 state,然后重新渲染 UI。

例如,在购物车组件中,state 用于存储商品数量,props 用于传递商品的详细信息和价格。

// 购物车组件示例
class CartItem extends React.Component {constructor(props) {super(props);this.state = {quantity: this.props.quantity,  // 从父组件传递的 props};}incrementQuantity = () => {this.setState(prevState => ({quantity: prevState.quantity + 1,}));};render() {const { name, price } = this.props;return (<div><h3>{name}</h3><p>Price: ${price}</p><p>Quantity: {this.state.quantity}</p><button onClick={this.incrementQuantity}>Add one more</button></div>);}
}

在这个例子中,nameprice 是通过 props 传递的,而 quantity 是通过 state 在组件内部管理的。当用户点击 “Add one more” 按钮时,quantity 的值会更新,触发重新渲染。

总结

  • props 用于父组件传递数据给子组件,不可变
  • state 用于管理组件自身的动态数据,可变,组件内部可更新其 state 并触发重新渲染。
  • propsstate 在 React 中具有不同的用途和应用场景:props 用于组件间的通信,而 state 用于组件内部的状态管理。

希望这个解释和代码示例能够帮助你更好地理解 stateprops 之间的区别及其应用场景!

相关文章:

从项目代码看 React:State 和 Props 的区别及应用场景实例讲解

在 React 中&#xff0c;state 和 props 是组件的两个重要概念&#xff0c;它们有不同的作用和应用场景。理解它们之间的区别对于开发 React 应用至关重要。 1. state 和 props 的区别 props (属性)&#xff1a; props 是由父组件传递给子组件的数据或函数。props 是只读的&am…...

Vue 学习之旅:核心技术学习总结与实战案例分享(vue指令下+计算属性+侦听器)

Vue 学习之旅&#xff1a;核心技术学习总结与实战案例分享 文章目录 Vue 学习之旅&#xff1a;核心技术学习总结与实战案例分享一、指令补充&#xff08;一&#xff09;指令修饰符&#xff08;二&#xff09;v-bind 对样式操作的增强&#xff08;三&#xff09;v-model 应用于其…...

freertos的基础(二)内存管理:堆和栈

1. 堆&#xff08;Heap&#xff09; 定义 堆是 FreeRTOS 中用于动态内存分配的内存区域。FreeRTOS 提供了多种堆管理方案&#xff08;如 heap_1、heap_2、heap_4 等&#xff09;&#xff0c;开发者可以根据需求选择合适的内存管理策略。 作用 用于动态分配内存&#xff0c;例…...

vue \n 换行不不显示

Vue 中&#xff0c;直接使用包含 \n 的字符串进行渲染时&#xff0c;换行符不会被识别为 HTML 的换行&#xff0c;因为 Vue 默认会将其视为普通文本。 对此提供两种解决办法 方法一&#xff1a;使用 v-html 指令替换 \n 为 <br> <template><div v-html"…...

GPT 系列论文精读:从 GPT-1 到 GPT-4

学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】…...

在 Ubuntu 上安装和配置 Redis

在 Ubuntu 上安装和配置 Redis&#xff0c;并使用发布-订阅&#xff08;Pub/Sub&#xff09;功能&#xff0c;可以按照以下步骤进行&#xff1a; 一、安装 Redis 1. 更新包列表 首先&#xff0c;更新本地的包列表以确保获取到最新的软件包信息&#xff1a; sudo apt update…...

Excel中双引号问题

背景&#xff1a; 从Excel中读取数据时&#xff0c;发现有的单元格读出来是一个双引号&#xff0c;有的是一个双引号 "{""accountName"": ""全字段"",""accountState"": ""NORMAL"",&q…...

【机器学习】主动学习-增加标签的操作方法-流式选择性采样(Stream-based selective sampling)

Stream-Based Selective Sampling Stream-based selective sampling 是一种主动学习方法&#xff0c;在处理大量数据流时特别有用。它允许学习算法动态选择是否对当前数据实例进行标注&#xff08;通过与 Oracle 交互&#xff09;。此方法主要应用于流数据场景中&#xff0c;目…...

elementUI项目中,只弹一个【token过期提示】信息框的处理

关键代码 let msgArr document.querySelectorAll(.token401Message)if (!msgArr.length) {Message({customClass: token401Message,message: response.data.msg,type: error,onClose: () > {msgArr []}})} 完整代码 import axios from axios import { getToken } from…...

SpringBoot开发—— SpringBoot中如何实现 HTTP 请求的线程隔离

文章目录 1、Servlet 容器与线程池管理1.1 线程池的作用1.2 线程池的配置 2、HTTP 请求的线程隔离2.1 请求上下文和会话信息2.2 多线程处理的隔离性 3、 ThreadLocal 和线程上下文隔离3.1ThreadLocal的使用3.2 保证线程隔离性 4、Async异步任务的线程隔离4.1 异步任务的线程池4…...

【LLM】25.1.11 Arxiv LLM论文速递

25.1.10 12:00 - 25.1.11 12:00 共更新36 篇 —第1篇---- Supervision policies can shape long-term risk management in general-purpose AI models &#x1f50d; 关键词: 通用型人工智能&#xff0c;风险管理&#xff0c;监督政策&#xff0c;模拟框架 PDF链接 摘要: 通…...

单片机实物成品-012 酒精监测

项目介绍 本项目以软硬件结合的方式&#xff0c;选择 C 语言作为程序硬件编码语言&#xff0c; 以 STM32 单片机作为核心控制板&#xff0c;在数据传输节点上连接酒精传感器对酒精浓度进行 实时检测&#xff0c;且对高浓度酒精采取强制干预和紧急预警&#xff0c;并将数据通过…...

使用葡萄城+vue实现Excel

最终实现效果如下 包含增加复选框 设置公式 设置背景颜色等&#xff0c;代码实在太多 有需要可留言 第一步&#xff1a;创建表头 请使用官网提供的网址&#xff1a;在线 Excel 编辑器 | SpreadJS 在线表格编辑器 1.点击下方号&#xff0c;创建一个新的sheet页 默认新创建的she…...

【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录

一、import导入css样式 在项目文件中创建一个common文件夹&#xff0c;下面创建一个css文件夹&#xff0c;里面放上style.css文件&#xff0c;编写的是公共样式&#xff0c;我们现在要在App.vue中引入该样式。 在App.vue中引入该样式&#xff0c;这样就会使样式全局生效&#…...

跟我学C++中级篇——字节序

一、什么是字节序 在谈字节序前讲个小故事&#xff0c;在小说《格列佛游记》中&#xff0c;有两派势力为了吃鸡蛋的时候儿到底是先打破大的一端还是打破小的一端展开了战争&#xff0c;而且这场战争持续了很久。后来&#xff0c;1980年&#xff0c;Danny Cohen在论文"On …...

Linux网络编程5——多路IO转接

一.TCP状态时序理解 1.TCP状态理解 **CLOSED&#xff1a;**表示初始状态。 **LISTEN&#xff1a;**该状态表示服务器端的某个SOCKET处于监听状态&#xff0c;可以接受连接。 **SYN_SENT&#xff1a;**这个状态与SYN_RCVD遥相呼应&#xff0c;当客户端SOCKET执行CONNECT连接时…...

Redis常见

Redis 事务 什么是 Redis 事务&#xff1f; 你可以将 Redis 中的事务理解为&#xff1a;Redis 事务提供了一种将多个命令请求打包的功能。然后&#xff0c;再按顺序执行打包的所有命令&#xff0c;并且不会被中途打断。 Redis 事务实际开发中使用的非常少&#xff0c;功能比…...

提升 PHP 编码效率的 10 个实用函数

PHP开发者始终追求更简洁、高效的代码。幸运的是&#xff0c;PHP 提供了丰富的内置函数&#xff0c;能显著减少手动编码&#xff0c;提升开发效率。无论经验深浅&#xff0c;掌握这些函数的使用技巧都至关重要。 以下列出了 10 个可以显著加快您的编码过程的 PHP 函数&#xf…...

设计模式 行为型 访问者模式(Visitor Pattern)与 常见技术框架应用 解析

访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你在不改变元素类的前提下定义作用于这些元素的新操作。这种模式将算法与对象结构分离&#xff0c;使得可以独立地变化那些保存在复杂对象结构中的元素的操作。 假设我们有一个复杂的对…...

golang之数据库操作

1.导入必要的包 import("database/sql"_ "github.com/go-sql-driver/mysql" //使用此作为数据库驱动 ) 2.相关操作 连接数据库 使用sql.Open()函数进行数据库的连接 db, err : sql.Open("mysql", "user:passwordtcp(127.0.0.1:3306)/db…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...