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

一、@State在鸿蒙中是做什么的?

@State 是 HarmonyOS ArkTS 框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动 UI 的响应式编程模式。通过将变量标记为 @State,开发者可以确保当状态值发生变化时,依赖该状态的 UI 组件会自动重新渲染,从而保持数据与界面的实时同步。

@State 是 HarmonyOS ArkTS 实现响应式编程的大基础核心,可以说整个V1和V2都是围绕它来进行组合使用。

image.png

二、@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 变量必须在组件构造函数中初始化,否则会导致编译错误。

 @Componentstruct 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'; // 错误,直接修改属性不触发更新}

3. 避免频繁更新
连续多次修改状态会导致多次重绘,可通过合并操作优化。

注意:

  1. 将独立变化的状态拆分为多个 @State 变量,避免不必要的组件刷新。
  2. 深层嵌套的对象或数组可能导致性能下降,建议使用扁平结构。
  3. 组件销毁时,@State 变量会自动释放,但需注意手动清理定时器等外部资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

influxdb数据导出笔记

influx query ‘from(bucket: “byt-grid-data”) |> range(start: 2025-04-01T00:00:00Z, stop: 2025-04-02T23:59:59Z) |> filter(fn: > r[“_measurement”] “byt-gzsn-hsxn-sc-dcs”) |> filter(fn: > r[“_field”] “F_ACT_FZZ02_FB_O”) |> filt…

HTTP Content-Type:深入解析与应用

HTTP Content-Type:深入解析与应用 引言 在互联网世界中,数据传输是至关重要的。而HTTP协议作为最常用的网络协议之一,其在数据传输过程中扮演着关键角色。其中,HTTP Content-Type头字段在数据传输中发挥着至关重要的作用。本文将深入解析HTTP Content-Type,并探讨其在实…

使用SQL查询ES数据

使用SQL查询ES数据 32 进阶:使用SQL查询ES数据环境准备利用脚本导入测试数据 SQL学习基本查询排序查询过滤查询范围查询分组查询(group)分组过滤查询(grouphaving)聚合函数统计limit查询分页查询 32 进阶:使用SQL查询ES数据 环境准备 需要首先安装ES8.…

禁止页面滚动的方法-微信小程序

在微信小程序中,有几种方法可以禁止页面滚动: 一、通过页面配置禁止滚动 在页面的JSON配置文件中设置,此方法完全禁止页面的滚动行为: {"disableScroll": true }二、通过 CSS 样式禁止滚动 在页面的WXSS文件中添加&…

用户画像(https://github.com/memodb-io/memobase)应用

1.下载项目的源代码,我们要先启动后端,用docker启动 cd src/server cp .env.example .env cp ./api/config.yaml.example ./api/config.yaml 这里我的配置内容如下config.yaml(因为我是调用的符合openai格式的大模型,所以我没改,如果要是别的大模型的话,需要自己再做兼容…

微信小程序生成某个具体页面的二维码

微信小程序,如果要生成某个具体页面,而非首页的二维码,体验和正式的生成方法如下: 1、体验版二维码: 管理---版本管理---修改页面路径,输入具体页面的路径以及参数,生成的是二维码 2、正式小程…

【今日三题】小乐乐改数字 (模拟) / 十字爆破 (预处理+模拟) / 比那名居的桃子 (滑窗 / 前缀和)

⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 小乐乐改数字 (模拟)十字爆破 (预处理模拟)比那名居的桃子 (滑窗 / 前缀和) 小乐乐改数字 (模拟) 小乐乐改数字…

四旋翼无人机手动模式

无人机的手动模式(Manual Mode)是指飞手完全通过遥控器手动控制无人机的飞行姿态、高度、方向和速度,‌无需依赖自动稳定系统或辅助功能‌(如GPS定位、气压计定高、视觉避障等)。这种模式赋予操作者最大的操控自由度&a…

C++高精度算法(加、减、乘)

首先声明,没有除法是因为我不会(手动狗头_doge) 简介 顾名思义,高精度算法是用来算一些超级大的数,比如长到 longlong 都存不下的那种,还有就是小数点后好多位,double都存不下的那种&#xff…

思科交换机配置

以下是交换机配置的详细步骤指南,适用于Cisco交换机,其他品牌需调整命令: 1. 初始连接与基本配置 连接方式:使用Console线连接交换机,通过终端软件(如PuTTY)登录。波特率:9600&…

数据质量问题中,数据及时性怎么保证?如何有深度体系化回答!

数据治理,数据质量这快是中大厂,高阶大数据开发面试必备技能,企业基于大数据底座去做数仓,那么首先需要保障的就是数据质量。 数据质量的重要性在现代企业中变得越发突出。以下是数据质量的几个关键方面,说明其对企业…

【学习笔记】CPU 的“超线程”是什么?

1. 什么是超线程? 超线程(Hyper-Threading)是Intel的技术,让一个物理CPU核心模拟出两个逻辑核心。 效果:4核CPU在系统中显示为8线程。 本质:通过复用空闲的硬件单元(如ALU、FPU)&a…

闭包的理解

一、闭包的概念 当通过调用外部函数返回的内部函数后,即使外部函数已经执行结束了,但是被内部函数引用的外部函数的变量依然会保存在内存中,我们把引用了其他函数作用域变量的函数和这些被引用变量的集合,称为闭包(Clo…

从小米汽车事故反思 LabVIEW 开发

近期,小米汽车的一起严重事故引发了社会各界的广泛关注。这起事故不仅让我们对智能汽车的安全性产生了深深的思考,也为 LabVIEW 开发领域带来了诸多值得汲取的知识与领悟。 在智能汽车领域,尤其是涉及到智能驾驶辅助系统时,安全是…

项目进度延误的十大原因及应对方案

项目进度延误主要源于以下十大原因:目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中,需求频繁变更是导致延误的关键因素之一&…

AI 赋能 DBA:如何用 DeepSeek 等大模型简化数据库管理工作

AI 赋能 DBA:如何用 DeepSeek 等大模型简化数据库管理工作 摘要: 数据库管理员(DBA)的工作涉及 SQL 优化、故障排查、性能监控等复杂任务。而 DeepSeek、ChatGPT 等大模型可以大幅减少重复劳动,提高 DBA 的工作效率。本文将结合真实案例,介绍如何利用 AI 优化 DBA 工作流…

vxe-table4.6 + vue3.2 + ant-design-vue 3.x 实现对列的显示、隐藏、排序

概要 vxe-table中的vxe-toolbar没有拖拽功能&#xff0c;故自己实现 源码 <template><a-popover v-model:visible"open" placement"bottomRight" trigger"click"><template #content><div class"content">…

c++基础知识二

1.面向对象 1.1 定义 面向对象编程是一种程序设计方法,它将数据和操作数据的方法封装在一起,形成类。类是一种用户自定义的数据类型,它包含了数据和对数据的操作方法。面向对象编程的特点包括封装、继承、多态 1.2 访问控制符 public 公有属性,方法。都可以访问 prot…

Netty之ChannelOutboundBuffer详解与实战

深入理解Netty的高低水位线机制及其应用实践 在高性能网络编程中&#xff0c;Netty作为一个广泛使用的异步事件驱动的Java框架&#xff0c;其高效的流量控制机制对于系统的稳定性和性能至关重要。本文将深入探讨Netty中的高低水位线&#xff08;High/Low Water Mark&#xff0…

(自用)WebSocket创建流程

在Spring Boot项目中新建WebSocket服务&#xff0c;可以按照以下详细步骤进行操作&#xff1a; 1.创建Spring Boot项目 可以通过Spring Initializr&#xff08;<>&#xff09;快速创建一个新的Spring Boot项目&#xff0c;添加Spring Web和Spring Boot DevTools依赖&…