首页 > 其他分享 >鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器

鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器

时间:2024-06-21 13:59:40浏览次数:11  
标签:count part07 Prop State UI 组件 Link 装饰

1、前言

我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化。本章将要介绍的就是:@Props装饰器。

2、@Props装饰器

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

  • @Prop变量允许在本地修改和初始化,但修改后的变化不会同步回父组件。

  • 当父组件中的数据源更改时,与之相关的@Prop装饰的变量都会自动更新。如果子组件已经在本地修改了@Prop装饰的相关变量值,而在父组件中对应的@State装饰的变量被修改后,子组件本地修改的@Prop装饰的相关变量值将被覆盖。

  • @Prop装饰器不能在@Entry装饰的自定义组件中使用。

  • 装饰器允许装饰的变量类型有:string、number、boolean、enum类型。不支持any,不允许使用undefined和null。

  • 装饰的变量必须指定类型,在父组件中,传递给@Prop装饰的值不能为undefined或者null;

  • @Prop装饰的变量和父组件状态变量类型相同,即@Prop : S和@State : S

  • 虽然说@Props装饰的变量可由父组件初始化,但使用范围依旧只能在组件内访问。

核心代码结构如下:

@Componentstruct Child { // 子组件中的@Props变量,可以被父组件初始化  @Prop count: number;}@Entrystruct Parent {  @State parentCount:number = 1;  build() {  // 此时,父组件就将本地parentCount变量传递给了子组件  // 当parentCount发生变化时,子组件也会刷新  Child({count: this.parentCount});  }}

3、@Props装饰器的简单使用Demo

以下示例是@State到子组件@Prop简单数据同步,

父组件ParentComponent的状态变量countDownStartValue初始化子组件CountDownComponent中@Prop装饰的count,

点击“Try again”,count的修改仅保留在CountDownComponent,不会同步给父组件ParentComponent。

ParentComponent的状态变量countDownStartValue的变化将重置CountDownComponent的count。

@Componentstruct CountDownComponent {  @Prop count: number;  costOfOneAttempt: number = 1;  build() {    Column() {      if (this.count > 0) {        Text(`You have ${this.count} Nuggets left`)      } else {        Text('Game over!')      }      // @Prop装饰的变量不会同步给父组件      Button(`Try again`).onClick(() => {        this.count -= this.costOfOneAttempt;      })    }  }}@Entry@Componentstruct ParentComponent {  @State countDownStartValue: number = 10;  build() {    Column() {      Text(`Grant ${this.countDownStartValue} nuggets to play.`)      // 父组件的数据源的修改会同步给子组件      Button(`+1 - Nuggets in New Game`).onClick(() => {        this.countDownStartValue += 1;      })      // 父组件的修改会同步给子组件      Button(`-1  - Nuggets in New Game`).onClick(() => {        this.countDownStartValue -= 1;      })      CountDownComponent({ count: this.countDownStartValue, costOfOneAttempt: 2 })    }  }}

在上面的示例中:

  1. CountDownComponent子组件首次创建时其@Prop装饰的count变量将从父组件@State装饰的countDownStartValue变量初始化,界面如下:

    图片

  2. 按“+1”或“-1”按钮时,父组件的@State装饰的countDownStartValue值会变化,这将触发父组件重新渲染,在父组件重新渲染过程中会刷新使用countDownStartValue状态变量的UI组件并单向同步更新CountDownComponent子组件中的count值;

    图片

  3. 更新count状态变量值也会触发CountDownComponent的重新渲染,在重新渲染过程中,评估使用count状态变量的if语句条件(this.count > 0),并执行true分支中的使用count状态变量的UI组件相关描述来更新Text组件的UI显示;

  4. 当按下子组件CountDownComponent的“Try again”按钮时,其@Prop变量count将被更改,但是count值的更改不会影响父组件的countDownStartValue值;

    图片

  5. 父组件的countDownStartValue值会变化时,父组件的修改将覆盖掉子组件CountDownComponent中count本地的修改。

图片

由于有@State装饰器的经验,学习@Props起来就得心应手了。到此,我们基本也就掌握了@Props装饰器的使用了。

趁热打铁,我们可能就会问了,@Props组件只能由父组件到子组件单向传递,那我想实现双向传递怎么办呢?那就需要用到@Link装饰器了。

4、@Link装饰器

@Link装饰器与@Props装饰器的用法几乎一样,区别只是@Props装饰器是父组件向子组件单向同步,而@Link装饰器是子组件和父组件双向同步。

我们平时使用@Link装饰器就和@Props差不多,有一个区别:@Link装饰器的属性不能本地初始化。

直接上一段Demo:

点击父组件ShufflingContainer中的“Parent View: Set yellowButton” 和 “Parent View: Set GreenButton”,可以从父组件将变化(控件长度)同步给子组件。

1.点击子组件GreenButton和YellowButton中的Button,子组件会发生相应变化,将变化同步回父组件。因为@Link是双向同步,会将变化同步给@State。

2.当点击父组件ShufflingContainer中的Button时,@State变化,也会同步给@Link,子组件也会发生对应的刷新。

图片

代码如下:​​​​​​​

class GreenButtonState {  width: number = 0;  constructor(width: number) {    this.width = width;  }}@Componentstruct GreenButton {  @Link greenButtonState: GreenButtonState;  build() {    Button('Green Button')      .width(this.greenButtonState.width)      .height(40)      .backgroundColor('#64bb5c')      .fontColor('#FFFFFF,90%')      .onClick(() => {        if (this.greenButtonState.width < 700) {          // 更新class的属性,变化可以被观察到同步回父组件          this.greenButtonState.width += 60;        } else {          // 更新class,变化可以被观察到同步回父组件          this.greenButtonState = new GreenButtonState(180);        }      })  }}@Componentstruct YellowButton {  @Link yellowButtonState: number;  build() {    Button('Yellow Button')      .width(this.yellowButtonState)      .height(40)      .backgroundColor('#f7ce00')      .fontColor('#FFFFFF,90%')      .onClick(() => {        // 子组件的简单类型可以同步回父组件        this.yellowButtonState += 40.0;      })  }}@Entry@Componentstruct ShufflingContainer {  @State greenButtonState: GreenButtonState = new GreenButtonState(180);  @State yellowButtonProp: number = 180;  build() {    Column() {      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {        // 简单类型从父组件@State向子组件@Link数据同步        Button('Parent View: Set yellowButton')          .width(312)          .height(40)          .margin(12)          .fontColor('#FFFFFF,90%')          .onClick(() => {            this.yellowButtonProp = (this.yellowButtonProp < 700) ? this.yellowButtonProp + 40 : 100;          })        // class类型从父组件@State向子组件@Link数据同步        Button('Parent View: Set GreenButton')          .width(312)          .height(40)          .margin(12)          .fontColor('#FFFFFF,90%')          .onClick(() => {            this.greenButtonState.width = (this.greenButtonState.width < 700) ? this.greenButtonState.width + 100 : 100;          })        // class类型初始化@Link        GreenButton({ greenButtonState: $greenButtonState }).margin(12)        // 简单类型初始化@Link        YellowButton({ yellowButtonState: $yellowButtonProp }).margin(12)      }    }  }}

5、结语

至此,我们在@State装饰器的基础上又学习了@Props装饰器和@Link装饰器,@Props装饰器用于接受来自父组件的变量,@Link也用于接受来自父组件的变量,但额外的,@Link装饰器在子组件中被修改后,父组件中对应的值也会发生改变。

剩下的状态装饰器请持续关注 “鸿蒙UI开发快速入门 —— part08 ”

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!

扫描下面的二维码关注公众号。

图片

标签:count,part07,Prop,State,UI,组件,Link,装饰
From: https://blog.csdn.net/harmonyClassRoom/article/details/139756738

相关文章

  • A Guide to Setting Plot Styles Based on the Matplotlib Library
    AGuidetoSettingPlotStylesBasedontheMatplotlibLibraryDateAuthorVersionNote2024.06.21DogTaoV1.0Finishthedocument.文章目录AGuidetoSettingPlotStylesBasedontheMatplotlibLibraryBasicUsageDrawplotsAdjuststyleSaveplotsAnnotatepl......
  • 【鸿蒙实战开发】HarmonyOS-ArkUI教程@link装饰器双向数据传递的使用
    前言2024年可谓至关重要,而生态建设的前提,就是要有足够的开发人才。与之对应的,今年春招市场上与鸿蒙相关岗位和人才旺盛的热度,一方面反应了鸿蒙生态的逐渐壮大,另一方面也让人们对鸿蒙下一阶段的发展更具信心。随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的......
  • 用Nuitka打包 Python,效果竟如此惊人!
    目录为什么选择Nuitka?Nuitka的工作原理Nuitka的工作流程大致如下:安装Nuitka实战案例示例代码打包程序运行可执行文件进阶技巧优化选项多文件项目打包第三方库使用Python开发一个程序后,将Python脚本打包成独立可执行文件是一项常见需求。Nuitka是一个Python......
  • recastnavigation.Sample_TempObstacles代码注解 - rcBuildHeightfieldLayers
    烘培代码在rcBuildHeightfieldLayers本质上是为每个tile生成高度上的不同layer算法的关键是三层循环:forz轴循环forx轴循环for高度span循环判断span和相邻span的连通性(x/z平面相邻cell)如果联通,则标注为同一个layer,也就是在x/z平面上标注layer,形成像是互不相......
  • Windows的Gitlab Runner搭配的PowerShell脚本:自动下载Directory.Build.props相关文件
    简介GitlabRunner在Windows上运行之后,我们在.gitlab-ci.yml中编写script语句,思路和Linux是一样。但是考虑到Windows的特点,为了让程序员少接触一些知识点,以及给未来执行作业的时候预留更多的操作空间。简单说就是未来修改执行作业时候的逻辑,但是每个软件仓库根目录下的.gitlab-ci......
  • Windows的Gitlab Runner搭配的PowerShell脚本:自动下载Directory.Build.props相关文件
    简介GitlabRunner在Windows上运行之后,我们在.gitlab-ci.yml中编写script语句,思路和Linux是一样。但是考虑到Windows的特点,为了让程序员少接触一些知识点,以及给未来执行作业的时候预留更多的操作空间。简单说就是未来修改执行作业时候的逻辑,但是每个软件仓库根目录下的.gitlab-ci......
  • C++数据格式化5 - uint转换成十六进制字符串&二进制的data打印成十六进制字符串
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词关键字:C++数据格式化字符串处理std::stringinthex跨平台应用场景:int型的数据打印成十六进制字符串二进制的data打印成十六进制字符串。2.strfmt.h#pragmaonce#include<stri......
  • Windows11系统win32ui.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个win32ui.dll文件(挑选合适的版本文件)把它放......
  • Uipath 如何连接SQLite数据进行操作
      1、下载SQLiteDatabaseActivitiesforUipathpackages,无需安装SQLite数据库驱动。2、SQLite查询操作   2.1添加查询活动:在UIPathStudio的“Activities”面板中,搜索并添加“ExecuteQuery”活动。这个活动用于执行SQL查询语。在“ExecuteQuery”活动的属......
  • 基于Java的图书管理系统源码( GUI+JavaSwing+MySql )
    基于Java的图书管理系统源码(GUI+JavaSwing+MySql)1、使用JavaSwing,Mysql实现2、IDEA编写,eclipse也可以运行(测试使用的IDEA24.1.3)3、测试环境:JDK1.8(JDK20),MySQL5.54、本项目实现了注册、登录、图书馆数据维护、新书订购、借阅管理、系统维护等功能=============......