组件的状态ComponentV2

介绍

在鸿蒙(HarmonyOS)开发,特别是使用 ArkTS 和 声明式 UI(类似 SwiftUI 或 React)进行开发时,状态管理是核心概念。

要理解"为什么需要状态管理",我们首先需要回到一个更本质的问题:在现代化的声明式 UI 框架中,数据(状态)与界面(UI)是什么关系?

简单来说,状态管理是连接"数据"与"界面"的桥梁。

  • 没有状态管理:你需要手动去"推"数据到界面上,累且易错。
  • 有了状态管理:你只需要维护好数据(状态),界面会自动"拉"取最新的数据并展示自己。

我们可以先写代码感受一下

@Local

@Local表示组件内部的状态,使得自定义组件内部的变量具有观察变化的能力:

这是我们的第一个状态管理装饰器 如果@Local没有装饰变量那么this.text的改变就不会影响到Text()组件

ts 复制代码
@ComponentV2
export struct stateStudy{
  @Consumer('nav')nav:NavPathStack = new NavPathStack()
  @Local text:string = "Hello world"
  build() {
    NavDestination(){
      Text(this.text)
      Button("change")
        .onClick((event: ClickEvent) => {
          this.text = "Hello world changed"
      })
    }
    .title("状态管理")
  }
}
@Param

@Param不仅可以接受组件外部输入,还可以接受@Local的同步变化。

ts 复制代码
@ComponentV2
export struct SonComponent{
  @Param text:string = "default value"
// @Once @Param text:string = "default value"  表示只同步一次 后续父组件的修改将不被同步

  build() {
    Text(this.text)
      .padding(10)
      .backgroundColor(Color.Orange)
  }
}
ts 复制代码
@ComponentV2
export struct stateStudy{
  @Consumer('nav')nav:NavPathStack = new NavPathStack()
  // @Local表示组件内部的状态,使得自定义组件内部的变量具有观察变化的能力:
  @Local text:string = "Hello world"
  build() {
    NavDestination(){
    //   子组件接受夫组件的参数
      SonComponent({text:this.text})
      Button("change")
        .onClick((event: ClickEvent) => {
            // 父组件的text参数被Local装饰 当@Local改变子组件也会同步改变
          this.text = "Hello world changed"
      })
    }
    .title("状态管理")
  }
}
@Event

@Event主要配合@Param实现数据的双向同步。

子组件

ts 复制代码
@ComponentV2
export struct SonComponent{
  @Param text:string = "default value"
  @Event $text:(val:string)=>void = (val:string)=>{}
  build() {
   Column(){
     Text(this.text)
       .padding(10)
       .backgroundColor(Color.Orange)
     Button('son Change').onClick((event: ClickEvent) => {
        // 子组件调用方法传递给父组件
       this.$text("son val")
     })
   }
  }
}

父组件

ts 复制代码
@ComponentV2
export struct stateStudy{
  @Consumer('nav')nav:NavPathStack = new NavPathStack()
  @Local text:string = "Hello world"
  build() {
    NavDestination(){
        // 接受回调函数修改父组件状态变量
      SonComponent({text:this.text,
      $text:(val:string)=>{
        this.text =val
      }})
      Button("change")
        .onClick((event: ClickEvent) => {
          this.text = "Hello world changed"
      })
    }
    .title("状态管理")
  }
}

当然也可以使用语法糖改造优化代码

ts 复制代码
// 原来
SonComponent({
  text: this.text,
  $text: (val: string) => {
    this.text = val;
  },
});
// 修改后
SonComponent({ text: this.text!! });

子组件不变

@Provider和@Consumer

@Provider装饰器和@Consumer装饰器:跨组件层级双向同步

当我们的组件嵌套过多需要很多的param过于繁琐 使用@Provider和@Consumer实现依赖注入

父组件

ts 复制代码
@Provider('nav') nav:NavPathStack = new NavPathStack()

子组件获取 当然也可以是孙组件 间隔多少层都问题不大

ts 复制代码
@Consumer('nav')nav:NavPathStack = new NavPathStack()
相关推荐
熊猫钓鱼>_>10 小时前
鸿蒙AI Agent新范式:从“对话式辅助”到“工程化代理”的Harness架构实战解析
人工智能·笔记·学习·华为·架构·harmonyos
大锅盖110 小时前
HarmonyOS ArkUI 非遗纹样素材平台设计复盘:朱砂宣纸与鎏金黛蓝的文化守护
华为·harmonyos
2501_9197490311 小时前
华为鸿蒙管理学习生活与工作APP—小羊管理
学习·华为·生活·harmonyos·鸿蒙
贾伟康11 小时前
【时光清单|20】HarmonyOS ArkTS AppGallery 发布复查实战:核对包名、版本、设备、素材和离线声明
harmonyos·arkts·agc·appgallery·发布复查
lilian23312 小时前
HarmonyOS 7 新特性(二十三)|hiprofiler + hidumper:跨堆内存分析
华为·harmonyos
嵌入之梦13 小时前
鸿蒙OS IoT设备开发之基础 —— 外设驱动
物联网·华为·harmonyos
贾伟康13 小时前
【时光清单|12】HarmonyOS ArkTS 单页复杂状态实战:拆分 Index 中的导航、弹层和编辑草稿
harmonyos·arkts·状态管理·arkui·navigation
用户09340777351414 小时前
HarmonyOS WPS Open SDK 实践:OpenFileRequest 打开链路与沙箱拷贝
android·typescript·harmonyos
木子雨廷15 小时前
第 01 天|心智模型:iOS/Flutter 开发者学鸿蒙,第一步该换什么思路?
harmonyos
lilian23316 小时前
HarmonyOS 7 新特性(二十一)|FAST Kit:自然排序与向量计算
华为·harmonyos