课程地址: 黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发
(本篇笔记对应课程第 15 节)
P15《14.ArkUI组件-状态管理@state装饰器》

 
回到最初的 Hello World 案例,首先验证 如果删掉 @State装饰器,那么点击文案时再也不会触发视图更新了。

新建一个页面,修改内容后发现预览器没有更新,查看预览器左上角显示的还是 entry:/pages/index 页面。

这种情况怎么才能让预览器更新?首先要确保编辑器中active的是你想要预览的页面的代码,然后点击预览器的刷新或者关闭重启按钮,都可以让预览器更新:

验证用 @State 装饰器修饰的变量必须初始化:

验证 state变量初始值为 字符串与数字类型:

验证 state变量初始值为对象类型:

验证对象嵌套:

会发现:点击Jack年龄会增长,但点击Rose则不会:

再次点击一下 Jack,触发视图重新渲染,会发现此时Rose年龄更新了。说明Rose年龄点击时实际上数据已经发生变化了,但就是没有触发视图更新

验证数组:添加和删除是有效的,但年龄增长无效。说明数组中的元素如果是对象,那么对象属性的更新不会触发视图更新:

如果给数组中的某个元素重新赋值,可以触发视图更新:

实践:
老师所谓的“女友列表”真的是三观不正,不忍直视……随便换一个不好么,兴趣列表,工作列表,车子列表……一个人可以拥有的一对多的东西太多了,非要把情侣做成一对多,令人不适!

完整代码如下:
class Person {
  name: string
  age: number
  gf: Person
  constructor(name: string, age: number, gf?:Person) {
    this.name = name
    this.age = age
    this.gf = gf
  }
}
class Hobby {
  name: string
  favourite : number
  constructor(name: string, favourite: number) {
    this.name = name
    this.favourite = favourite
  }
}
@Entry
@Component
struct StatePage2 {
  // @State name: string = 'Jack'
  // @State age: number = 18
  // @State p : Person = new Person('Jack', 22, new Person('Rose',20))
  @State p : Person = new Person('Jack', 22)
  @State hobbyList: Array<Hobby> = [
    new Hobby('学习', 1),
    new Hobby('美食', 2)
  ]
  @State inx:number = 1
  build() {
    Row() {
      Column() {
        Text(`${this.p.name} : ${this.p.age}`)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .fontColor('red')
          .onClick(()=>{
            this.p.age ++
          })
        /*Text(`${this.p.gf.name} : ${this.p.gf.age}`)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .fontColor('red')
          .onClick(()=>{
            this.p.gf.age ++
          })*/
        Text('===兴趣列表===')
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
          .fontColor('red')
        Button('添加')
          .onClick(()=>{
            this.hobbyList.push(new Hobby(`兴趣${this.inx++}`, 3))
          })
        ForEach(this.hobbyList, (item:Hobby,index)=>{
          Row(){
            Text(`${item.name} : ${item.favourite}`)
              .onClick(()=>{
                // item.favourite ++   //点击不会触发视图更新
                this.hobbyList[index] = {name:item.name, favourite:item.favourite++}  //点击不会触发视图更新
              })
            Button('删除')
              .onClick(()=>{
                this.hobbyList.splice(index,1)
              })
          }
            .width('100%')
            .margin({top:10,bottom:10})
            .justifyContent(FlexAlign.SpaceAround)
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
@Component
struct StatePage {
  @State name: string = 'Jack'
  @State age: number = 18
  build() {
    Row() {
      Column() {
        Text(`${this.name} : ${this.age}`)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .fontColor('red')
          .onClick(()=>{
            this.age ++
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}



















