组件的状态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()
相关推荐
zd2005722 分钟前
我给x86版本开源鸿蒙系统装上了 Homebrew,还塞了整个 Node 和 opencode 进去
华为·开源·harmonyos
song5019 分钟前
React Native for OpenHarmony 实战:三方库 react-native-popup-menu 的鸿蒙化适配指南
css·深度学习·react native·react.js·transformer·harmonyos
打工仔折腾 AI22 分钟前
鸿蒙版ToDesk远控实测:蓝牙键鼠、双模式鼠标与跨端剪贴板怎么用
后端·python·华为·性能优化·计算机外设·harmonyos·ai agent 实战
特立独行的猫a36 分钟前
仓颉语言实现强大的Modbus调试工具Modbus Poll:cj-tauri项目介绍与实战
harmonyos·tauri·modbus·仓颉·modbus poll
m0_7381858212 小时前
Flutter 鸿蒙化实战:screen_protector 适配 OpenHarmony,防截屏/防泄露
flutter·华为·harmonyos·鸿蒙
CV工程师丁Sir13 小时前
# ArkWeb 手记 03|本地资源加载与 $rawfile 路径踩坑
harmonyos
OH_TPC21 小时前
HarmonyOS APP开发---"菜谱汇"美食菜谱App,需要用到这个库
harmonyos
老陈说编程1 天前
2. 鸿蒙(HarmonyOS)超级终端与生态
华为·harmonyos
2501_919749031 天前
华为鸿蒙免费时钟工具—小羊时钟
华为·harmonyos