ArkTS的变量的状态管理学习(组件)

上篇回顾 ArkTS语言的自定义组件的学习

本篇内容 ArkTS的组件变量的状态管理学习

一、知识储备

  • @State
    ① 最常用的组件内部访问的变量装饰器 声明时必须实例化
  • @Prop
    ① 与父类组件建立单向同步关系 声明时不用实例化,配合@State使用
  • @Link
    ① 与父类组件建立双向同步关系 声明时不用实例化,配合@State使用
    ② 作为参数传递里直接使用$
  • @Consume @Provide
    @Consume定义在子组件中进行使用, 不用实例化
    @Provide定义父组件中,需要实例化
    ③ 可以当前页面内任意调用,不需传递
  • @ObjectLink @Observed
    @Observed定义在class前,使用时,需要new对象
    @ObjectLink定义子组件中,不用实例化

二、效果一览

在这里插入图片描述

三、源码及分析讲解

@Component
@Entry
struct DecoratePage {
  @State school: string = '希望小学'
  @State clazz: string = '一年级'
  @State name: string = '王二小'
  @Provide sex: string = '男'
  @State child: Children = new Children(6)

  build() {
    Row() {
      Column() {
        Student({
          school: `${this.school}`,
          clazz: `${this.clazz}`,
          child: this.child,
          name: $name
        })
        Button('上初中了')
          .onClick(() => {
            this.school = '春天中学'
          })
        Button('长大一岁')
          .onClick(() => {
            this.child.age += 1
          })
        Button('改名字了')
          .onClick(() => {
            this.name = '王二中'
          })
        Button('改性别了')
          .onClick(() => {
            this.sex = '女'
          })
        Button('年级变了')
          .onClick(() => {
            this.clazz = '三年级'
          })
        Text(
          `父:${this.name}是${this.school}的${this.clazz}的学生,性别(${this.sex}),今年${this.child.age}岁了`
        )
      }
    }
  }
}

@Component
struct Student {
  @State school: string = '希望小学' //  组件内部访问的变量装饰器  声明时必须实例化
  @Prop clazz: string               //  与父类组件建立单向同步关系 声明时不用实例化
  @Link name: string                //  与父类组件建立双向同步关系 声明时不用实例化
  @Consume sex: string              //  先定义消费变量,直接使用   声明时不用实例化
  @ObjectLink child: Children;      //  不能在entry装饰的自定义组件中使用

  build() {
    Text(`子:${this.name}是${this.school}的${this.clazz}的学生,性别(${this.sex}),今年${this.child.age}岁了`)
      .onClick(() => {
        this.clazz = '二年级'
        this.school = '希望小学'
        this.name = '王二小'
        this.sex = '未知'
        this.child.age = 5
      })
  }
}


@Observed
class Person {
  public age: number

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

@Observed   // 配合ObjectLink装饰器使用
class Children extends Person {
  public age: number;

  constructor(age: number) {
    super(age)
    this.age = age;
  }
}

相关推荐

  1. flutter状态管理学习

    2024-06-16 22:28:01       60 阅读
  2. 鸿蒙 - arkTs状态管理

    2024-06-16 22:28:01       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 22:28:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 22:28:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 22:28:01       82 阅读
  4. Python语言-面向对象

    2024-06-16 22:28:01       91 阅读

热门阅读

  1. 实现一个简单的mybatis:SimpleMyBatis

    2024-06-16 22:28:01       33 阅读
  2. 程序员应该具备哪些良好的习惯

    2024-06-16 22:28:01       29 阅读
  3. 【洛谷题解】P5704 【入门1】顺序结构 字母转换

    2024-06-16 22:28:01       34 阅读
  4. Web前端中表示上标:深度解析与实战技巧

    2024-06-16 22:28:01       26 阅读
  5. 设计模式之享元模式

    2024-06-16 22:28:01       32 阅读
  6. carbondata连接数优化

    2024-06-16 22:28:01       31 阅读
  7. 【C++】计算代码中程序的时间差

    2024-06-16 22:28:01       32 阅读
  8. 10:Hello, World!的大小

    2024-06-16 22:28:01       31 阅读
  9. Shell 学习笔记 - 变量的类型 + 变量的赋值

    2024-06-16 22:28:01       23 阅读
  10. 4.组件间通信-v-model

    2024-06-16 22:28:01       32 阅读
  11. 路由组件和非路由组件区别:

    2024-06-16 22:28:01       33 阅读
  12. LeetCode热题3.无重复的最长字串

    2024-06-16 22:28:01       32 阅读