鸿蒙开发系列教程(七)--ArkTS语言:状态管理

这篇具有很好参考价值的文章主要介绍了鸿蒙开发系列教程(七)--ArkTS语言:状态管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果希望构建一个动态的、有交互的界面,就需要引入“状态”的概念

状态管理机制:在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染,在ArkUI中统称为状态管理机制。

自定义组件拥有变量,变量必须被装饰器装饰才可以成为状态变量,状态变量的改变会引起UI的渲染刷新。如果不使用状态变量,UI只能在初始化时渲染,后续将不会再刷新。

鸿蒙开发系列教程(七)--ArkTS语言:状态管理,前端,大数据,鸿蒙,harmonyos,华为

  • View(UI):UI渲染,指将build方法内的UI描述和@Builder装饰的方法内的UI描述映射到界面。

  • State:状态,指驱动UI更新的数据。用户通过触发组件的事件方法,改变状态数据。状态数据的改变,引起UI的重新渲染。

Components级别的状态管理

  • @State:@State装饰的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。
  • @Prop:@Prop装饰的变量可以和父组件建立单向同步关系,@Prop装饰的变量是可变的,但修改不会同步回父组件。
  • @Link:@Link装饰的变量和父组件构建双向同步关系的状态变量,父组件会接受来自@Link装饰的变量的修改的同步,父组件的更新也会同步给@Link装饰的变量。
  • @Provide/@Consume:@Provide/@Consume装饰的变量用于跨组件层级(多层组件)同步状态变量,可以不需要通过参数命名机制传递,通过alias(别名)或者属性名绑定。
  • @Observed:@Observed装饰class,需要观察多层嵌套场景的class需要被@Observed装饰。单独使用@Observed没有任何作用,需要和@ObjectLink、@Prop连用。
  • @ObjectLink:@ObjectLink装饰的变量接收@Observed装饰的class的实例,应用于观察多层嵌套场景,和父组件的数据源构建双向同步。

@State装饰器

组件内状态

@State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态变量的数据源

@State装饰的变量,与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问,在声明时必须指定其类型和本地初始化。初始化也可选择使用命名参数机制从父组件完成初始化。

@State装饰的变量拥有以下特点:

  • @State装饰的变量与子组件中的@Prop装饰变量之间建立单向数据同步,与@Link、@ObjectLink装饰变量之间建立双向数据同步。
  • @State装饰的变量生命周期与其所属自定义组件的生命周期相同。

举例1:

点击按钮,数字跟着变化,如没有@state,数字始终为0
鸿蒙开发系列教程(七)--ArkTS语言:状态管理,前端,大数据,鸿蒙,harmonyos,华为

举例2:
鸿蒙开发系列教程(七)--ArkTS语言:状态管理,前端,大数据,鸿蒙,harmonyos,华为

代码:

class Model {
  public value: string;
  constructor(value: string) {
    this.value = value;
  }
}

@Entry
@Component
struct Index {
  build() {
    Column() {
      MyComponent1({ count: 1, increaseBy: 2 })
      // 调用Model
      MyComponent1({ title: new Model('测试2'), count: 5 })
    }
  }
}

@Component
struct MyComponent1 {
  @State title: Model = new Model('测试1');
  @State count: number = 0;
  private increaseBy: number = 1;

  build() {
    Column() {
      Text(`${this.title.value}`)
      Button(`改变标题`).onClick(() => {
        this.title.value = this.title.value === 'aaa' ? 'bbb' : 'aaa';
      })

      Button(`增加=${this.count}`).onClick(() => {
        this.count += this.increaseBy;
      })
    }
  }
}

@Link装饰器

父子双向同步

子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定

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

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

举例1:
鸿蒙开发系列教程(七)--ArkTS语言:状态管理,前端,大数据,鸿蒙,harmonyos,华为

代码:

class GreenButtonState {
  width: number = 0;

  constructor(width: number) {
    this.width = width;
  }
}

@Component
struct 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);
        }
      })
  }
}

@Component
struct YellowButton {
  @Link yellowButtonState: number;

  build() {
    Button('Yellow Button')
      .width(this.yellowButtonState)
      .height(40)
      .backgroundColor('#f7ce00')
      .fontColor('#FFFFFF,90%')
      .onClick(() => {
        // 子组件的简单类型可以同步回父组件
        this.yellowButtonState += 40.0;
      })
  }
}

@Entry
@Component
struct 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)
      }
    }
  }
}

以上内容参考“官方文档”文章来源地址https://www.toymoban.com/news/detail-807603.html

到了这里,关于鸿蒙开发系列教程(七)--ArkTS语言:状态管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【鸿蒙应用ArkTS开发系列】- 选择图片、文件和拍照功能实现

    【鸿蒙应用ArkTS开发系列】- 选择图片、文件和拍照功能实现

    在使用App的时候,我们经常会在一些社交软件中聊天时发一些图片或者文件之类的多媒体文件,那在鸿蒙原生应用中,我们怎么开发这样的功能呢? 本文会给大家对这个功能点进行讲解,我们采用的是拉起系统组件来进行图片、文件的选择,拉起系统相机进行拍照的这样一种

    2024年02月04日
    浏览(10)
  • 【鸿蒙应用ArkTS开发系列】- 导航栏Tab组件使用讲解

    【鸿蒙应用ArkTS开发系列】- 导航栏Tab组件使用讲解

    现在市场上的大部分应用,主页都是才用底部导航栏菜单作为页面主体框架来展示, 在鸿蒙中是使用Tabs组件实现,下面我们开始讲解Tab组件的使用。 Tabs是一个通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图,它仅可包含子组件TabContent,同时搭配 TabsCo

    2024年01月16日
    浏览(10)
  • 【鸿蒙4.0】详解harmonyos开发语言ArkTS

    【鸿蒙4.0】详解harmonyos开发语言ArkTS

    如官方文档所描述,ArkTS是基于Javascript以及Typescript的生态上做了进一步的扩展,进一步的提高开发效率,使用过低代码开发的老师应该会有一种感觉ArkTS像低代码一样更简洁,几行代码就能实现一个功能。以开发者的角度肯定是越简洁越好。下面来浅浅的了解一下js,ts以及

    2024年01月22日
    浏览(15)
  • 【鸿蒙应用ArkTS开发系列】- http网络库使用讲解和封装

    【鸿蒙应用ArkTS开发系列】- http网络库使用讲解和封装

    现在网上的应用,基本都是网络应用,需要进行联网获取数据,而常用的联网获取数据的方式有http、socket、websocket等。 在鸿蒙应用、服务中,stage模式开发下,鸿蒙官方为我们提供了一个网络组件库 http ,我们通过 import http from ‘@ohos.net.http’; 即可以完成引用。 @ohos.net.http

    2024年02月15日
    浏览(9)
  • 鸿蒙开发:深入了解Arkts语言中的Want对象及其运用【鸿蒙专栏-23】

    Arkts语言中的 Want 是一种用于对象间信息传递的载体,主要用于应用组件之间的信息传递。本文将深入探讨 Want 的定义、用途、类型以及参数说明

    2024年02月05日
    浏览(11)
  • 【鸿蒙应用ArkTS开发系列】- Har包中子组件中监听生命周期实现

    在鸿蒙应用开发中,有时候我们会创建HAR 模块封装一些SDK能力提供给第三方APP进行集成。 鸿蒙的har 包并不支持定义page页面对外导出,也不支持配置路由信息,因此我们多是在har包中提供组件,通过导出组件的形式,提供给App引用使用。 在鸿蒙中,非@Entry装饰的组件,只能

    2024年02月14日
    浏览(11)
  • 【鸿蒙开发】第七章 ArkTS语言UI范式-基础语法

    【鸿蒙开发】第七章 ArkTS语言UI范式-基础语法

    通过前面的章节,我们基本清楚鸿蒙应用开发用到的语言和项目基本结构,在【鸿蒙开发】第四章 Stage应用模型及项目结构也提到过ArkTS的UI范式的 基本语法 、 状态管理 、 渲染控制 等能力,简要介绍如下: 基本语法 : ArkTS 定义了 声明式UI描述 、 自定义组件 和 动态扩展

    2024年02月03日
    浏览(9)
  • 鸿蒙开发:深入了解Arkts语言中的Want对象及其运用

    Arkts语言中的 Want 是一种用于对象间信息传递的载体,主要用于应用组件之间的信息传递。本文将深入探讨 Want 的定义、用途、类型以及参数说明

    2024年02月04日
    浏览(10)
  • 鸿蒙开发之状态管理

    鸿蒙开发之状态管理

    @State装饰的变量,会和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。 在状态变量相关装饰器中,@State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态变量的数据源。 装饰器使用规则 同步类型:不与父组件中任何类型的变量同步。 允

    2024年01月20日
    浏览(12)
  • 身份证阅读器和社保卡读卡器Harmony鸿蒙系统ArkTS语言SDK开发包

    身份证阅读器和社保卡读卡器Harmony鸿蒙系统ArkTS语言SDK开发包

    项目需求,用ArkTS新一代开发语言实现了在Harmony鸿蒙系统上面兼容身份证阅读器和社保卡读卡器,调用了DonseeDeviceLib.har这个读卡库。 需要注意的是,鸿蒙系统的app扩展名为.hap,本项目编译输出的应用为:entry-default-signed.hap 下面是调用身份证阅读器读取身份证信息的接口,支

    2024年02月03日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包