HarmonyOS NEXT - @Prop和@Link

简介: 本示例介绍了`@Prop`和`@Link`装饰器在父子组件间的数据同步机制。`@Prop`实现单向数据绑定,子组件可修改本地值,但不会同步回父组件;父组件数据更新时会覆盖子组件的本地更改。`@Link`实现双向绑定,子组件与父组件数据共享且相互影响。**限制条件:**- `@Prop`变量深拷贝时可能丢失复杂类型。- `@Link`不可用于`@Entry`组件,禁止本地初始化,类型需与数据源一致。**支持类型:**- `@Prop`支持基础类型、对象、数组、`Date`及联合类型,不支持`any`。- 数据源与`@Prop`类型需匹配,包括简单类型、数组项及对象属性。

@Prop装饰器:父子单向同步
@Link装饰器:父子双向同步

@Prop装饰的变量和父组件建立单向的同步关系:
·@Prop变量允许在本地修改,但修改后的变化不会同步回父组件。
·当数据源更改时,@Prop装饰的变量都会更新,并且会覆盖本地所有更改。因此,数值的同步是父组件到子组件(所属组件),子组件数值的变化不会同步到父组件。

@Link装饰的变量与其父组件中的数据源共享相同的值。

总结
·@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。
·@Link装饰的变量可以和父组件建立双向的同步关系。

@Prop装饰变量限制条件:
·@Prop装饰变量时会进行深拷贝,在拷贝的过程中除了基本类型、Map、Set、Date、Array外,都会丢失类型。例如PixelMap等通过NAPI提供的复杂类型,由于有部分实现在Native侧,因此无法在ArkTS侧通过深拷贝获得完整的数据。

@Link装饰变量限制条件:
·@Link装饰器不能在@Entry装饰的自定义组件中使用。
·@Link装饰的变量禁止本地初始化,否则编译期会报错。
·@Link装饰的变量的类型要和数据源类型保持一致,否则框架会抛出运行时错误。

@Prop变量装饰器必须指定类型,允许装饰的变量类型如下所示:
·Object、class、string、number、boolean、enum类型,以及这些类型的数组。
·不支持any,支持undefined和null。
·支持Date类型。
·API11及以上支持Map、Set类型。
·支持ArkUI框架定义的联合类型Length、ResourceStr、ResourceColor类型。

@Prop和数据源类型需要相同,有以下三种情况:

  • @Prop装饰的变量和@State以及其他装饰器同步时双方的类型必须相同,示例请参考父组件@State到子组件@Prop简单数据类型同步。
  • @Prop装饰的变量和@State以及其他装饰器装饰的数组的项同步时 ,@Prop的类型需要和@State装饰的数组的数组项相同,比如@Prop : T和@State : Array,示例请参考父组件@State数组中的项到子组件@Prop简单数据类型同步。
  • 当父组件状态变量为Object或者class时,@Prop装饰的变量和父组件状态变量的属性类型相同,示例请参考从父组件中的@State类对象属性到@Prop简单类型的同步。

Prop支持联合类型实例:
@Prop支持联合类型和undefined和null,在下面的示例中,animal类型为Animals | undefined,点击父组件Zoo中的Button改变animal的属性或者类型,Child中也会对应刷新。

Link支持联合类型实例:
@Link支持联合类型和undefined和null,在下面的示例中,name类型为string | undefined,点击父组件Index中的Button改变name的属性或者类型,Child中也会对应刷新。

代码实例
PropLinkPage

import {
    LinkComponent } from './components/LinkComponent';
import {
    PropComponent } from './components/PropComponent';

@Entry
@Component
struct PropLinkPage {
   
  @State message: string = '第2节 @Prop和@Link';
  @State stateCount:number=0;

  build() {
   
    Column({
   space:10}) {
   
      Text(this.message)
        .fontSize(20)
        .fontWeight(FontWeight.Bold)

      Button('增加次数').onClick(()=>{
   
        this.stateCount++
      })
      Text('stateCount='+this.stateCount)

      PropComponent({
   propCount:this.stateCount})
      LinkComponent({
   linkCount:this.stateCount})
    }
    .height('100%')
    .width('100%')
  }
}

PropComponent

@Component
export struct PropComponent{
   
  @Prop propCount:number=0
  build() {
   
    Column({
   space:10}){
   
      Text('Prop子组件')
      Button('增加次数').onClick(()=>{
   
        this.propCount++
      })
      Text('propCount='+this.propCount)
    }
    .width('100%')
    .padding(10)
    .backgroundColor(Color.Orange)
  }
}

LinkComponent

@Component
export struct LinkComponent{
   
  @Link linkCount:number
  build() {
   
    Column({
   space:10}){
   
      Text('Link子组件')
      Button('增加次数').onClick(()=>{
   
        this.linkCount++
      })

      Text('linkCount='+this.linkCount)
    }
    .width('100%')
    .padding(10)
    .backgroundColor(Color.Pink)
  }
}
目录
相关文章
|
5天前
|
人工智能 JavaScript API
【HarmonyOS NEXT+AI】问答03:找不到DevEco Studio Cangjie Plugin下载链接?
本文针对学员在“HarmonyOS NEXT+AI大模型打造智能助手APP(仓颉版)”课程中提出的问题进行解答:为何无法在华为开发者社区官网找到DevEco Studio Cangjie Plugin下载链接。文中详细介绍了Cangjie Plugin的功能及获取方式,包括STS和Canary版本的申请流程,并提供了学习仓颉编程语言的资源与建议。对于普通开发者,STS版本是当前首选;同时,通过课程与官方教程,可快速掌握仓颉语言核心语法及API,助力开发HarmonyOS NEXT AI智能助手应用。
31 3
【HarmonyOS NEXT+AI】问答03:找不到DevEco Studio Cangjie Plugin下载链接?
|
7天前
|
前端开发 API 开发工具
一年撸完百万行代码,企业微信的全新鸿蒙NEXT客户端架构演进之路
本文将要分享的是企业微信的鸿蒙Next客户端架构的演进过程,面对代码移植和API不稳定的挑战,提出了DataList框架解决方案。通过结构化、动态和认知三重熵减机制,将业务逻辑与UI解耦,实现数据驱动开发。采用MVDM分层架构(业务实体层、逻辑层、UI数据层、表示层),屏蔽系统差异,确保业务代码稳定。
67 0
|
11天前
|
缓存 开发工具 开发者
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
|
13天前
|
存储 安全 算法
鸿蒙NEXT如何保证应用安全:详解鸿蒙NEXT数字签名和证书机制
本文对鸿蒙NEXT公开资料进行了深入分析和解读,梳理了鸿蒙单框架应用的签名机制,拆解每一步的实操过程和背后的实现原理,并对源码分析整理签名的校验机制。从中管中窥豹,探究鸿蒙系统的安全设计思路,给从事鸿蒙研发的同学提供一些借鉴。
88 3
|
22天前
|
存储 SQL 关系型数据库
HarmonyOS NEXT - RelationalStore关系型数据库
关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。
84 27
|
22天前
|
存储 缓存 搜索推荐
HarmonyOS NEXT - Preferences用户首选项
- 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。 - Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据。
74 19
|
22天前
|
开发者
HarmonyOS NEXT - @Provide和@Consume
@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参数传递机制的束缚,实现跨层级传递。
78 21
|
22天前
HarmonyOS NEXT - @State状态变量
ArkUI 是一种声明式 UI 框架,通过状态驱动 UI 更新。@State 装饰的变量用于管理组件内部状态,具有以下特点:私有性(仅组件内访问)、必须初始化、生命周期与组件一致。它支持单向(与 @Prop)和双向(与 @Link、@ObjectLink)数据同步。状态改变时,绑定的 UI 会自动刷新。注意:@State 不支持 Function 类型,不能在 build 中修改状态变量。代码示例中展示了通过 @State 管理按钮点击计数的状态更新机制。
72 16
|
22天前
|
开发者 容器
HarmonyOS NEXT - @CustomDialog自定义弹窗
CustomDialog 是一个用于实现自定义弹窗的工具,适用于广告、中奖提示、警告信息、软件更新等用户交互场景。通过 `CustomDialogController` 类可控制弹窗的显示与隐藏。开发者可配置多种选项,如对齐方式、偏移量、蒙层颜色、动画效果等,支持模态与非模态窗口,并可通过装饰器 `@CustomDialog` 定义弹窗界面。示例代码展示了如何创建欢迎弹窗及响应用户操作,灵活满足不同需求。
70 13
|
22天前
|
容器
HarmonyOS NEXT - AlertDialog警告弹窗
`AlertDialog` 是一个用于显示警告弹窗的组件,支持自定义文本内容与回调操作。通过 `AlertDialog.show()` 方法,传入配置参数即可展示弹窗。主要功能包括设置标题、内容、按钮、模态状态、对齐方式、过渡动画等。示例代码展示了如何创建一个包含“取消”和“删除”按钮的弹窗,并在点击按钮后执行相应业务逻辑,同时更新页面消息提示。适用于需要用户确认或交互的场景。
64 14