登录
首页 > 汽车资讯 > 鸿蒙开发(六十八):可被观察的状态修改 首发

鸿蒙开发(六十八):可被观察的状态修改 首发

发布时间:2023-12-19 11:39:50 发布用户: 15210273549

并不是状态变量的所有更改都会引起UI的刷新,只有可以被框架观察到的修改才会引起UI刷新。

这一节我们就来介绍那些可被观察的状态修改。

string、number、boolean

简单的基本类型的修改是可被观察的。

例如:

@Entry
@Component
struct Index {
  /**
   * 可观察变量
   */
  @State name: string = "张三"
  @State age: number = 18
  @State isSingle: boolean = false

  build() {
    Column() {
      Text(this.name)
      Text(`${this.age}`)
      Text(`${this.isSingle}`)
      Button("按钮").onClick(() => {
        this.name = "李四"
        this.age = 20
        this.isSingle = true
      })
    }
    .width('100%')
  }
}

运行结果:

 

从运行结果来看,string、number、boolean 这些简单的基本数据类型的修改都可被观察到。

class、Object

对象类型的修改是可被观察的。只要你对象里不嵌套对象,都是可以被观察到的。

例如:

/**
 * 人
 */
class Person {
  /**
   * 姓名
   */
  public name: string;
  /**
   * 年龄
   */
  public age: number;
  /**
   * 是否单身
   */
  public isSingle: boolean;

  constructor(name: string, age: number, isSingle: boolean) {
    this.name = name;
    this.age = age;
    this.isSingle = isSingle;
  }
}

@Entry
@Component
struct Index {
  /**
   * 可观察变量
   */
  @State person: Person = new Person("张三", 18, false);

  build() {
    Column() {
      Text(this.person.name)
      Text(`${this.person.age}`)
      Text(`${this.person.isSingle}`)
      Button("按钮").onClick(() => {
        this.person.name = "李四"
        this.person.age = 20
        this.person.isSingle = true
      })
    }
    .width('100%')
  }
}

运行结果:

 

从运行结果来看,class、Object 这些对象类型的修改也是可被观察到的。

enum

enum 枚举类型的修改是可被观察的。

例如:

/**
 * 枚举
 */
enum City {
  /**
   * 北京
   */
  Beijing = "北京",
  /**
   * 上海
   */
  Shanghai = "上海",
  /**
   * 武汉
   */
  Wuhan = "武汉"
}

@Entry
@Component
struct Index {
  /**
   * 可观察变量
   */
  @State city: City = City.Beijing

  build() {
    Column() {
      Text(`${this.city}`)
      Button("按钮").onClick(() => {
        this.city = City.Wuhan
      })
    }
    .width('100%')
  }
}

运行结果:

 

从运行结果来看,enum 枚举类型的修改是可被观察的。

数组

数组的修改是可被观察到的。只要你不数组嵌套数组,或者数组是对象类型,去修改对象里的值,其他都是可被观察的。

例如,数组搭配非对象类型(string、number、boolean):

@Entry
@Component
struct Index {
  /**
   * 可观察变量
   */
  @State names: string[] = ["张三", "李四", "王五"]

  build() {
    Column() {
      ForEach(this.names, (item: string) => {
        Text(item)
      })
      Button("按钮").onClick(() => {
        this.names.push("赵六")
      })
    }
    .width('100%')
  }
}

运行结果:

 

从运行结果来看,我们往数组中添加了一个新值,UI 随即也刷新了。

修改 this.names[0] = "赵六":

 

删除 this.names.pop():

 

足以说明数组+基本类型的修改是可观察的。

接下来,观察数组+对象。

/**
 * 人
 */
class Person {
  /**
   * 姓名
   */
  public name: string;

  constructor(name: string) {
    this.name = name;
  }
}

@Entry
@Component
struct Index {
  /**
   * 可观察变量
   */
  @State persons: Person[] = [{ name: "张三" }, { name: "李四" }, { name: "王五" }]

  build() {
    Column() {
      ForEach(this.persons, (item: Person) => {
        Text(item.name)
      })
      Button("按钮").onClick(() => {
        this.persons.push({ name: "赵六" })
      })
    }
    .width('100%')
  }
}

添加一个 Person 对象的运行结果:

汽车资讯更多>>

火热直播溢芬芳,大岭镇黄花村君子兰网上开出“致富花” 百年中国照相馆人像收藏展上见证PS结合的爱情信物 刘德华获银紫荆星章,还有哪些明星曾被港府授勋 上合峰会召开在即,中俄最高层将出席,印度降级参会,莫迪不来了 本田思域也守不住合资轿车销量前十的阵地,越卖越少了 现款售26.69万,纯电续航大幅提升!岚图FREE 318将预售 捷途山海百店联合开业暨山海 T2 上市 贵阳汽车工业店正式开业 科技平权再进阶 哪吒L纯电版预售14万起! 蔚来与塞切尼·伊什特万大学基金会签署战略合作备忘录 官宣!全新途观L PRO将在5月30日上市,两种造型,3块大屏 BESPOKE LUXURY LIFESTYLE 赏臻品至美之作 鉴高定奢华之旅 出手即高手! 广汽城市NDA是怎样炼成的? 瑞虎8车队奋勇集结 将再战“亚洲达喀尔”环塔拉力赛 三款热门纯电SUV大PK,谁能摆脱晕车魔咒? 12.99万元!奇瑞风云T9用“移动城堡”来平权豪华 “以旧换新”政策来袭,东风风行再加码10亿,风行游艇享万元补贴 售价12.99万元起,星途凌云王者版上市,提供两种动力可选 “好而不贵”的零跑C16,缺了这三样,可就“大而不全”了 翼真L380开启惊喜预订,“陆地空客”即将正式启航! 2024款哪吒L红衣版新车商品性评价 21.99万,你会买乐道L60吗? 北欧来客沃尔沃EX30,售20.08万起,极简外表蕴藏硬核内心 义乌启动住房“焕新购” 鼓励市民“买新卖旧” 国乒奥运会名单公布后,27岁的樊振东发文称是其“最后一舞” 走进博物馆 感受文物魅力 又一年戛纳红毯,巩俐、赵涛、彭于晏、关晓彤、佟丽娅都来了 长安系重磅新车密集曝光:全新CS75PLUS轴距加长,深蓝S05首曝 哪吒L开启交付, 哪吒汽车CEO张勇亲自交车 电动的路特斯还是原来的路特斯吗? 连大G都“电动”了,以后燃油车会变成“小众奢侈品”吗?
Copyright 2009-2023 奥运星 版权所有  京ICP备18049689号-19