news 2026/5/1 8:59:03

鸿蒙中级课程笔记2—状态管理V2—@Computed装饰器:计算属性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙中级课程笔记2—状态管理V2—@Computed装饰器:计算属性

当开发者使用相同的计算逻辑重复绑定在UI上时,为了防止重复计算,可以使用@Computed计算属性。计算属性中的依赖的状态变量变化时,只会计算一次。这解决了UI多次重用该属性导致的重复计算和性能问题。如下面例子。

@Computed get sum() { return this.count1 + this.count2 + this.count3; } Text(`${this.count1 + this.count2 + this.count3}`) // 计算this.count1 + this.count2 + this.count3 Text(`${this.count1 + this.count2 + this.count3}`) // 重复计算this.count1 + this.count2 + this.count3 Text(`${this.sum}`) // 读取@Computed sum的缓存值,节省上述重复计算 Text(`${this.sum}`) // 读取@Computed sum的缓存值,节省上述重复计算

说明

@Computed装饰器从API version 12开始支持。

从API version 12开始,该装饰器支持在元服务中使用。

概述

@Computed为方法装饰器,装饰getter方法。@Computed会检测被计算的属性变化,当被计算的属性变化时,@Computed只会被求解一次。不建议在@Computed中修改变量,错误的使用会导致数据无法被追踪或appfreeze等问题,详情见使用限制。

但需要注意,对于简单计算,不建议使用计算属性,因为计算属性本身也有开销。对于复杂的计算,@Computed能带来性能收益。

装饰器说明

@Computed语法:

@Computed get varName(): T { return value; }
@Computed方法装饰器说明
支持类型getter访问器。
从父组件初始化禁止。
可初始化子组件@Param。
被执行的时机

@ComponentV2中的@Computed会在自定义组件创建的时候初始化,触发@Computed计算。

@ObservedV2装饰的类中的@Computed,会在@ObservedV2装饰的类实例创建后,异步初始化,触发@Computed计算。

在@Computed中计算的状态变量被改变时,计算属性会重新计算。

是否允许赋值@Computed装饰的属性是只读的,不允许赋值,详情见使用限制。

使用限制

参考@Computed装饰器:计算属性

  • @Computed为方法装饰器,仅能装饰getter方法,其他用法编译时报错。

  • @Computed装饰的方法只有在初始化,或者其被计算的状态变量改变时,才会发生重新计算。不建议开发者在@Computed装饰的getter方法中做除获取数据外其余的逻辑操作。

  • 在@Computed装饰的getter方法中,不能改变参与计算的属性,以防止重复执行计算属性导致的appfreeze。

  • @Computed不能和双向绑定!!连用,@Computed装饰的是getter访问器,不会被子组件同步,也不能被赋值。开发者自己实现的计算属性的setter不生效,且产生编译时报错。

    @ComponentV2 struct Child { @Param double: number = 100; @Event $double: (val: number) => void; build() { Button('ChildChange') .onClick(() => { this.$double(200); }) } } @Entry @ComponentV2 struct Index { @Local count: number = 100; @Computed get double() { return this.count * 2; } // @Computed装饰的属性是只读的,开发者自己实现的setter不生效,编译时报错。 set double(newValue : number) { this.count = newValue / 2; } build() { Scroll() { Column({ space: 3 }) { Text(`${this.count}`) // 错误写法,@Computed装饰的属性是只读的,无法与双向绑定连用,编译时报错。 Child({ double: this.double!! }) } } } }
  • @Computed为状态管理V2提供的能力,只能在@ComponentV2和@ObservedV2中使用。

  • 多个@Computed一起使用时,警惕循环求解,以防止计算过程中的死循环。

使用场景

参考@Computed装饰器:计算属性

当被计算的属性变化时,@Computed装饰的getter访问器只会被求解一次

计算属性本身会带来性能开销,在实际应用开发中需要注意:

  • 对于简单的计算逻辑,可以不使用计算属性。
  • 如果计算逻辑在视图中仅使用一次,则不使用计算属性,直接求解。

@Computed装饰的属性可以被@Monitor监听变化

@Computed装饰的属性可以初始化@Param

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:46:09

什么是资产负债重分类?

简单来说,资产负债重分类是指在编制资产负债表时,根据会计科目的实际经济实质,对某些在总账中余额方向不正确的科目进行调整,使其在报表中列示到正确的项目下。为什么会产生这个问题?根源:在日常做账时&…

作者头像 李华
网站建设 2026/5/1 4:44:58

学霸同款2026 AI论文工具TOP9:专科生毕业论文写作全测评

学霸同款2026 AI论文工具TOP9:专科生毕业论文写作全测评 2026年AI论文工具测评:为何值得一看? 随着人工智能技术的不断进步,越来越多的专科生开始借助AI工具提升论文写作效率。然而,面对市场上琳琅满目的产品&#x…

作者头像 李华
网站建设 2026/5/1 4:45:28

指针与数组:为什么数组名是特殊的指针?

指针与数组:为什么数组名是特殊的指针? 在C编程中,指针与数组的关系是入门阶段的核心难点,也是高频考点。很多开发者会发现一个有趣的现象:数组名既能像普通变量一样通过下标访问元素,又能像指针一样进行地…

作者头像 李华
网站建设 2026/4/30 10:01:09

AI人工智能-Agent相关介绍-第十四周(小白)

一、Agent是什么 Agent翻译过来时“智能体”,你可以把它理解为一个“有自主能力的智能助手”——它不用人一步步指挥,能自己理解任务,规划步骤、使用工具、记住过往经历,甚至和其他Agent或人类协作,最终完成目标。 简单说:普通LLM是“你问我答”的工具,二Agent是“你交…

作者头像 李华
网站建设 2026/5/1 5:44:03

马斯克又开源了。。。

B站:啥都会一点的研究生公众号:啥都会一点的研究生 最近一周AI科技圈又发生了啥新鲜事? Qwen3-TTS全家桶开源 Qwen3-TTS系列模型正式开源,包含1.7B和0.6B两种参数规模,基于自研Qwen3-TTS-Tokenizer-12Hz多码本语音编…

作者头像 李华
网站建设 2026/5/1 6:52:24

大数据领域中RabbitMQ的消息积压问题解决

大数据领域中RabbitMQ的消息积压问题解决关键词:RabbitMQ、消息积压、吞吐量优化、消费者负载、流量控制、死信队列、分布式架构摘要:在大数据处理场景中,RabbitMQ作为主流的消息中间件,常因流量突增、消费者处理能力不足等问题导…

作者头像 李华