鸿蒙Next状态管理V2-Local装饰器总结

一、引言

在鸿蒙Next的开发中,状态管理是构建高效、响应式应用的关键部分。@Local装饰器作为状态管理V2中的重要特性,为开发者提供了一种有效的方式来管理组件内部状态。本文将对@Local装饰器进行全面总结,包括其功能、使用方法、与@State装饰器的对比以及常见问题的解决方法等。

二、@Local装饰器概述

(一)功能

@Local装饰器用于标识组件内部状态,使自定义组件内被装饰的变量具备观测变化的能力,当变量值改变时,能自动刷新使用该变量的组件。

(二)版本支持

从API version 12开始,可在@ComponentV2装饰的自定义组件中使用@Local装饰器。需注意当前状态管理(V2试用版)仍在开发中,功能尚未成熟。

三、装饰器说明

(一)参数

无参数。

(二)可装饰变量类型

支持Object、class、string、number、boolean、enum等基本类型以及Array、Date、Map、Set等内嵌类型,还支持null、undefined以及联合类型。

(三)变量初始化

必须在组件内部进行初始化,不允许从外部传入初始化值。

四、变量传递规则

(一)从父组件初始化

@Local装饰的变量不允许从外部传入初始化。

(二)初始化子组件

可以用于初始化子组件中@Param装饰的变量。

五、观察变化机制

(一)简单类型(boolean、string、number)

能观测到对变量的赋值变化,如在示例中对countmessageflag的操作,改变值后UI会刷新。

(二)类对象类型

仅能观测到对类对象整体赋值的变化,对类成员属性赋值的变化需依赖@ObservedV2@Trace装饰器。例如,对rawObject整体赋值可观测,而直接修改其成员属性name无法观测,但对于observedObject(其name属性被@Trace装饰),修改name可被观测。

(三)简单类型数组

可以观察到数组整体或数组项的变化,如修改numArr的数组项或整体赋值,UI都会刷新。

(四)嵌套类或对象数组

@Local无法观察深层对象属性的变化,深层对象属性的观测依赖@ObservedV2@Trace装饰器。如infoArr数组中Info类对象的name属性(被@Trace装饰)变化可被观测,而直接修改region属性(被@Trace装饰)无法被@Local观测到,但originInfo整体赋值可被观测。

(五)内置类型(Array、Date、Map、Set)

可以观察到变量整体赋值以及通过相应API调用带来的变化,如Date类型可通过特定API更新属性,MapSet类型可通过其接口进行数据更新并被观测到。

六、限制条件

(一)组件使用限制

只能在@ComponentV2装饰的自定义组件中使用,在@Component装饰的组件中使用会报错。

(二)外部初始化限制

表示组件内部状态,不允许从外部传入初始化值,否则会报错。

七、@Local与@State对比

(一)从父组件初始化

  • @State可选从外部初始化。
  • @Local不允许外部初始化。

(二)观察能力

  • @State能观测变量本身以及一层的成员属性,但无法深度观测。
  • @Local能观测变量本身,深度观测依赖@Trace装饰器。

(三)数据传递

两者都可以作为数据源和子组件中状态变量同步。

八、使用场景

(一)观测对象整体变化

对于被@ObservedV2@Trace装饰的类对象实例,虽有深度观测属性能力,但对象整体赋值时UI可能无法刷新,而@Local装饰对象可观测对象本身变化,如info2整体赋值时UI会刷新。

(二)装饰Date类型变量

可观察到Date整体赋值及通过其接口更新属性,如在DatePickerExample中对selectedDate的操作。

(三)装饰Map类型变量

能观察到Map整体赋值及通过接口setcleardelete更新数据,如MapSample中的message

(四)装饰Set类型变量

可观察到Set整体赋值及通过接口addcleardelete更新数据,如SetSample中的message

(五)联合类型

支持null、 undefined以及联合类型,如countnumber | undefined类型,改变其类型时UI会刷新。

九、常见问题及解决方法

(一)问题描述

复杂类型常量重复赋值给状态变量会触发刷新,即使新值和本地初始化值相同。

(二)原因分析

状态管理V2中,对使用状态变量装饰器(如@Trace@Local)装饰的Date、Map、Set、Array添加了代理用于观测API调用变化,再次赋值时,由于类型判断不同(代理类型和原始类型)会触发赋值和刷新。

(三)解决方法

使用UIUtils.getTarget()获取原始对象提前进行新旧值判断,当两者相同时不执行赋值,避免不必要的刷新。

十、总结

@Local装饰器在鸿蒙Next状态管理V2中为组件内部状态管理提供了重要功能,但在使用时需注意其限制条件和与其他装饰器的区别,根据具体场景合理运用,同时要注意常见问题的处理,以确保应用的高效运行和正确响应。随着鸿蒙系统的不断发展,@Local装饰器将在更多的应用场景中发挥重要作用,帮助开发者构建更加稳定和高效的应用程序。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容