【HarmonyOS 5】鸿蒙中@State的原理详解

GeorgeGcs
• 阅读 3

##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、@State在鸿蒙中是做什么的? @State 是 HarmonyOS ArkTS 框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动 UI 的响应式编程模式。通过将变量标记为 @State,开发者可以确保当状态值发生变化时,依赖该状态的 UI 组件会自动重新渲染,从而保持数据与界面的实时同步。 @State 是 HarmonyOS ArkTS 实现响应式编程的大基础核心,可以说整个V1和V2都是围绕它来进行组合使用。

二、@State的基本原理 @State 的响应式机制基于 依赖收集 和 变更通知 两大核心流程,结合 TypeScript 装饰器和元编程技术实现。其核心原理是通过依赖收集和变更通知机制,确保状态变化自动同步到 UI。

  1. 依赖关系的收集 当组件渲染时,ArkUI框架会追踪所有被 @State 修饰的变量在 UI组件 中的使用情况。 通过装饰器在变量的 getter 中注入依赖收集逻辑,记录当前组件对该状态的依赖关系。观察者的模式来进行数据变化的监控。 例如,当组件的Text中使用 this.message,框架会将该组件注册为 message 的依赖者。 @Entry @Component struct Index { @State message: string = 'Hello World';

    build() { RelativeContainer() { Text(this.message)

     .id('HelloWorld')
     .fontSize($r('app.float.page_text_font_size'))
     .fontWeight(FontWeight.Bold)
     .alignRules({
       center: { anchor: '__container__', align: VerticalAlign.Center },
       middle: { anchor: '__container__', align: HorizontalAlign.Center }
     })
     .onClick(() => {
       this.message = 'Welcome';
     })

    } .height('100%') .width('100%') } }

  2. 数据变更通知 当 @State 变量通过 this.message = xxxxxx 被修改时,框架会检测到值的变化。 使用 Proxy 或 Object.defineProperty 拦截属性的赋值操作,触发变更通知。 框架遍历所有依赖该状态的组件,并调用其更新方法重新渲染 UI。 采用 脏检查优化 和 异步渲染队列,合并多次更新操作,避免频繁重绘 响应式系统的核心流程 数据变化 → 依赖追踪 → 自动重渲染(60FPS 高帧率更新)

(1)数据变化:开发者通过 this.xxx = value 修改状态。 (2)依赖追踪:ArkUI框架根据之前收集的依赖关系,确定哪些组件需要更新。(哪个UI组件用了@State修饰的变量。) (3)自动重渲染:仅重新渲染依赖该状态的组件,提升性能。(最小限度的刷新UI) 三、使用@State的注意事项 在使用 @State 时,需注意以下关键点以避免潜在问题:

  1. 必须初始化: @State 变量必须在组件构造函数中初始化,否则会导致编译错误。 @Component struct MyComponent { @State count: number = 0; // 正确初始化 // @State message: string; // 错误:未初始化 }
  2. 通过 this 赋值: 必须通过 this.xxx = value 修改状态,直接赋值(如 xxx = value)不会触发 UI 更新。 onClick() { this.count = 1; // 正确,触发 UI 更新 this.obj = { ...this.obj, key: 'new' }; // 正确,整体赋值 this.obj.key = 'new'; // 错误,直接修改属性不触发更新 }
  1. 避免频繁更新: 连续多次修改状态会导致多次重绘,可通过合并操作优化。

注意:

  1. 将独立变化的状态拆分为多个 @State 变量,避免不必要的组件刷新。
  2. 深层嵌套的对象或数组可能导致性能下降,建议使用扁平结构。
  3. 组件销毁时,@State 变量会自动释放,但需注意手动清理定时器等外部资源。
点赞
收藏
评论区
推荐文章
GeorgeGcs GeorgeGcs
13小时前
【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解
【HarmonyOS5入门系列】鸿蒙HarmonyOS示例项目讲解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言:移动开发声明式UI框架的技术变革在移动操作系统的发展历程中,UI开发模式经历了从命令式到声明式的重大变革。根据
GeorgeGcs GeorgeGcs
13小时前
【HarmonyOS 5】AttributeModifier和AttributeUpdater区别详解
【HarmonyOS5】AttributeModifier和AttributeUpdater区别详解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、AttributeModifier和AttributeUpdater的定义和作用1
GeorgeGcs GeorgeGcs
7小时前
从“备胎”到领航者,鸿蒙操作系统的传奇进化
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财【HarmonyOS5】2019年,在全球科技产业的风云变幻中,华为正式推出了鸿蒙操作系统(HarmonyOS),这一消息如同一颗重磅炸弹,瞬间吸引了全世界的目光。彼时,外界对鸿蒙的诞生背
GeorgeGcs GeorgeGcs
5小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
5小时前
【HarmonyOS 5】鸿蒙中的UIAbility详解(一)
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、UIAbility是什么?Stage模型中的组件类型名,即UIAbility组件,包含UI,提供展示UI的能力,主要用于和用户交互。UIAbility类似于传统移动开发Android中
GeorgeGcs GeorgeGcs
5小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
5小时前
【HarmonyOS 5】鸿蒙的装饰器原理和自定义装饰器
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、鸿蒙中的装饰器是什么?在ArkTS中装饰器(Decorator)是一种特殊的声明,能够对类、方法、属性等进行标注和修改。因为ArkTS是TypeScript扩展而来的编程语言,Type
GeorgeGcs GeorgeGcs
3小时前
【HarmonyOS 5】makeObserved接口详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、makeObserved接口是什么?makeObserved接口(APIversion12起可用)用于将非观察数据转为可观察数据,适用于三方包类、@Sendable装饰的类、JSON.
GeorgeGcs GeorgeGcs
3小时前
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在ArkUI开发中,Web组件(Web)允许开发者在应用内嵌入网页,实现混合开发场景。本文将通过完整DEMO,详解如何通过WebviewController实现ArkUI与内嵌网页
GeorgeGcs GeorgeGcs
3小时前
【HarmonyOS 5】鸿蒙中进度条的使用详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、HarmonyOS中Progress进度条的类型HarmonyOS的ArkUI框架为开发者提供了多种类型的进度条,每种类型都有其独特的样式,以满足不同的设计需求。以下是几种常见的进度条
GeorgeGcs
GeorgeGcs
Lv1
男 · 金融头部企业 · 鸿蒙应用架构师
HarmonyOS认证创作先锋,华为HDE专家,鸿蒙讲师,作者。目前任职鸿蒙应用架构师。 历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 AAE,Harmony(OpenHarmony\HarmonyOS),MAE(Android\IOS),FE(H5\Vue\RN)。
文章
56
粉丝
1
获赞
2