组件、Prop 和 State

本文深入解析React中的组件、Prop和State概念,阐述Prop和State的区别及应用场景,通过实例演示如何利用Prop配置组件属性,以及如何使用State实现组件的动态交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组件、Prop 和 State

今天我们来学习 React 里最重要的三个概念: 组件、prop 和 state ,以及 prop 和 state 之间的区别。
学习目标
当你读完本文后希望你能重新回到这里,并能够轻松回答以下问题:
什么是 prop ?
什么是 state ?
何时使用 prop ?何时使用 state ?
如何让例子的窗户可以打开和关闭?
你能写出 Domo 帽子那个例子的伪代码吗?
盖房子
要想理解这些概念是什么以及如何使用它们,我们先来写一个小示例。盖房子(查看由 focuser (@focuser) 在 CodePen 编写的 Demo : React 小屋。)
组件
组件是 React 的三大支柱之一。使用 React 开发应用基本都是在使用组件。
第一步是将 UI 分解成多个组件。例如,我们可以这样来拆分房子:

在这里插入图片描述
​​
现在来编码!
​​
在这里插入图片描述

等一下,怎么看起来这么像 HTML ?没错!React 的部分代码看上去就是非常像 HTML ,其实就是这样设计的,这是为了让 Web 设计师理解和编写 React 代码更容易一些。太贴心了!因此,在上面的代码中,我们使用

作为容器,这基本和 HTML 中是一样的。而像 Roof 和 Wall 这样的标签是我们即将定义的自定义标签/组件。温馨提示: 上面的代码并非实际的 React 代码,甚至连 JavaScript 都算不上。暂时,我们只使用这种宽松的语法来介绍概念。一旦你理解这些概念后,我们再来学习 JavaScript 的细节并将上述概念转换成真实代码。

为了让这个例子更容易理解一些,我再简化一下: 从现在开始,我们来写一个超级简单的 Web 应用,连图片都不用,只显示文字。

例如,Roof 其实就是一个里面有文字的 div :
​​
在这里插入图片描述

其他组件也是如此,都是只有文字的 div 而已。首先,我们来看下房子的完整的 React 风格的代码:
​​
在这里插入图片描述
​​
在这里插入图片描述

这没什么不好理解的,是吧?House 是由 Roof、Wall、Window 和 Door 组成的,这些都是纯文本构成的组件。
最后,React 生成的 HTML 如下所示:
​​
在这里插入图片描述

使用 Props 来配置屋顶的颜色
想象一下,我们将规格说明书发给一个工厂,这个工厂负责代工所有的零部件。在规格说明书中,我们可以告诉工厂每个部件的固有属性,比如屋顶的颜色、门的形状,等等。在按照我们的要求将屋顶和门生产出来后,它们的属性不会产生任何变化,屋顶还是蓝色的,门依旧是矩形的。这些属性压根不会改变。

在 React 里,我们将这些属性称之为 Prop ,即 property 的缩写。关于 Prop ,你需要记住两点: 首先,我们来决定 Prop 的值,并在组件构建之前将其作为组件设计的一部分。其次,Prop 的值永远不会改变。

那 prop 在代码中是怎样的呢?在 House 组件中,如果我们想要蓝色屋顶的话,只需在 Roof 组件上添加 “color” 属性。这就好比是在发给工厂的规格说明书中指定颜色。

这有点类似于给 HTML 标签添加属性:
​​
在这里插入图片描述

那Roof里面又是怎么样使用 prop 的呢?代码如下所示:
​​
在这里插入图片描述

就这样?没错!但是有几点需要注意:

定义组件的 HTML 风格代码是一个模板,而不是单纯的 HTML 标签。这意味着我们可以在其中放置占位符来改变 HTML 输出的内容,而不必重复编写不同的 HTML (还记得 Domo 的帽子吗?这就是占位符的概念!)。在这个示例中, 生成的 HTML 是

blue roof
,而 生成的是
red roof
,以此类推。
模板中使用的花括号告诉 React 我们要在此处使用占位符来替代纯文本。
props 可以看作是 Roof 组件所有属性值的集合。假设组件是这样使用的: ,那么在 Roof 组件的定义中就可以使用 props.color和 props.material 。

使用 State 来开门
为组件添加 State
组件还可以拥有 state 。那么什么是 state ?state 是一种可以在组件创建后更改的数据。

举个例子,门既可以开,又可以关。我们可以说门的状态就是 state ,因为它的值是可以在门创建后更改的。在这点上,state 与 prop 是不同的,prop 是不会改变的,比如门的形状。

状态值的改变通常是由外部事件所引起的。在 Web 应用中,这些所谓的外部事件通常包括:用户输入了数据,或者从服务端获取了数据,又或者是定时器的触发。

下面,我们来为门添加 state :
​​
在这里插入图片描述

与 props 类似,state 也是组件内部所有状态值的集合。因此,我们可以在组件定义的模板中使用 state.[something] 。

接下来,我们来添加一些处理用户输入的“伪代码”来让门具有交互性。

在这里插入图片描述
​​
这里的关键点是组件的 state 是随时间而变化的。模板的输出,也就是生成的 HTML 会根据 state 的变化而自动改变。

顺便说句,不要忘了上面的只是“伪代码”,而不是 React 代码。不要尝试将其复制黏贴到你的项目中!否则你的电脑炸了我不负责……
State 是私有的
组件的 state 是私有的。门无论是开还是关,这都仅仅是门的逻辑。与房子或其他组件没有任何关系。事实上,我们完全可以将门从房子中移出去,它仍然可以自己打开或关闭。

因此,门的状态只有在 Door 组件内部是可见的。在 Door 组件内,我们可以读取或改写它的 state 。
​​
在这里插入图片描述

总结
好啦,这就是 prop 和 state 。prop 是组件的配置项,它的值是在组件创建之前就已经决定好了,比如门的形状和屋顶的颜色就可以定义为 prop。prop 的值永远不会改变。而 state 是组件的私有数据,当组件创建后才可以使用它。比如门的开关状态可以包括在 state 里面。state 会随着一些外部事件的发生而变化。这些所谓的外部事件通常包括:用户输入了数据,或者从服务端获取了数据,又或者是定时器的触发。

### HarmonyOS 开发中 @State @Prop 的区别 在 HarmonyOS 的开发环境中,`@State` `@Prop` 是两个重要的装饰器,用于定义组件的状态属性。以下是它们的具体差异: #### 1. **@State** `@State` 装饰器主要用于声明组件内部可变状态变量。这些变量通常由组件本身管理,并且当其值发生变化时会触发界面更新。 - **作用范围**: 局部于当前组件。 - **生命周期**: 随着组件实例的创建而初始化,在组件销毁时释放。 - **数据流向**: 单向流动(仅限于组件内部)。 - **适用场景**: 当需要维护一个只属于该组件自身的动态变化的数据时使用此装饰器[^5]。 示例代码如下: ```javascript @Entry @Component struct Counter { @State count: number = 0; build() { Column({ space: 20 }) { Text(`Count: ${this.count}`) .fontSize(20) Button('Increment') .onClick(() => { this.count++; }) } .padding(20) } } ``` --- #### 2. **@Prop** `@Prop` 装饰器则用来接收父级传递给子组件的参数。它表示一种外部输入源,允许父子组件之间建立通信机制。 - **作用范围**: 子组件通过这种方式获取来自父组件的信息。 - **默认行为**: 如果未指定初始值,则需从上级传入;也可以设置默认值以便简化调用过程[^6]。 - **不可修改性原则**: 原则上不应直接更改 prop 中的内容,因为这违背了单向数据流的设计理念——即所有的变更都应经由事件通知回溯至提供方处理后再同步下来新的状态副本而非自行篡改原始资料造成混乱局面[^7]。 下面是一个简单的例子展示如何利用 Props 实现跨层交互功能: ```javascript // Parent Component @Entry @Component struct ParentComponent { @State message: string = 'Hello Child!'; build() { Column() { ChildComponent({ msg: this.message }) } } } // Child Component @Component struct ChildComponent { @Prop msg: string; // 接收来自父组件的消息 build() { Text(this.msg).fontSize(24) } } ``` --- ### 总结对比表 | 特性 | @State | @Prop | |-----------------|-----------------------------------------|---------------------------------------| | 数据来源 | 组件自身 | 父组件 | | 是否可被外界改变 | 否 | 可以间接影响 | | 使用目的 | 表达局部逻辑下的变动 | 提供配置选项或共享资源 | 以上就是关于这两个关键字的主要介绍以及实际运用中的注意事项[^8].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值