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

news/2024/12/25 8:55:15/文章来源:https://www.cnblogs.com/freerain/p/18629188

一、引言

在鸿蒙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装饰器将在更多的应用场景中发挥重要作用,帮助开发者构建更加稳定和高效的应用程序。

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

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

相关文章

如何解决域名转移过程中授权码错误的问题?

您在域名转移过程中遇到了授权码错误的问题。域名转移是一个相对复杂的过程,涉及到多个环节的验证和配置。为了帮助您顺利解决授权码错误的问题,以下是详细的排查步骤和解决方案。 1. 确认授权码格式 首先,确保您输入的授权码格式正确。授权码通常由字母和数字组成,长度固定…

manim边学边做--同伦变换

在Manim中,移动一个元素除了之前介绍的方法之外,还可以通过同伦运算来移动一个元素。 与普通的移动元素方式相比,使用同伦运算移动一个元素时,实际上是在考虑整个空间的连续变形过程中元素的相应变化。 这种移动不是孤立地看待元素的位置改变,而是将元素置于空间的整体结构…

破解多区域协作难题,打造无缝连接新生态,让企业效率倍增!

跨国公司在全球范围内拥有多个分支机构、生产基地和供应链,为了实现高效的运营和多区域协作,跨国公司需要建立稳定、安全的网络连接,确保不同地区之间的数据传输顺畅。例如,苹果、微软、可口可乐等全球知名企业均在全球范围内进行商品和服务的国际贸易、资本投资以及资产配…

网站迁移处理-云服务器问题

关于您提到的网站迁移过程中遇到的问题,包括数据丢失、文件丢失以及迁移前后不一致的情况,我们将为您提供详细的解决方案。确保在迁移过程中不会出现数据丢失和文件丢失,并且迁移后的网站与原网站保持一致是至关重要的。以下是具体的排查和解决步骤:备份与恢复: 在进行任何…

域名解析很久始终无法访问

关于您提到的域名解析很长时间但始终无法访问的问题,这可能是由于DNS传播延迟、服务器配置错误或解析设置不当引起的。为了帮助您顺利解决问题,建议您从以下几个方面进行排查和调整:DNS传播延迟: 域名解析通常需要一定的时间才能在全球范围内传播。DNS传播时间可能从几分钟…

无法访问网站-虚拟主机/数据库问题

关于您提到的无法访问网站的问题,可能是由多种原因引起的,包括DNS解析错误、服务器配置问题、数据库连接失败等。为了帮助您顺利解决问题,建议您从以下几个方面进行排查和调整:域名解析检查: 首先,请确认域名解析是否正常。DNS传播可能需要一定时间才能在全球范围内生效。…

Fortify:静态代码分析器

Fortify静态代码分析器,‌是一款强大的静态代码分析工具,主要用于检测源代码中的安全漏洞和缺陷。它支持多种编程语言,包括Java、C#、C、C++、Swift、PHP等,能够发现并修复潜在的代码泄露风险点‌。 兼容系统: Windows/MacOS/Linux安装步骤 一、解压补丁压缩包,把fortify…

【安全就业】2024年网络安全技术技能人才职业能力图谱+工控安全

工控安全,是指针对工业控制系统进行网络安全保障的相关工作。由于工控系统与一般的民用办公系统、Web系统等都有很大不同,因此想要做好工控安全工作,需要掌握很多工业控制领域的专业知识和能力,具体包括资产识别、工控协议、工业安全检测(漏洞挖掘)、工业自动化、主机安全…

跟着 8.6k Star 的开源数据库,搞 RAG!

过去 9 年里,HelloGitHub 月刊累计收录了 3000 多个开源项目。然而,随着项目数量的增加,不少用户反馈:“搜索功能不好用,找不到想要的项目!” 这让我意识到,仅仅收录项目是不够的,还需要通过更智能的方式,帮助用户找到心仪的开源项目。于是,我开始探索如何通过 RAG 技…

【内网】内网远程桌面密码获取

一、远程桌面历史IP获取 1.1 mstsc查看历史登录IP 1.2 注册表地址获取历史登录IP地址 1.3 ListRDPConnections 二、获取 RDP 远程桌面连接凭据 2.1 在凭据管理器中查看 Windows 凭据 2.2 使用 Mimikatz 导出远程桌面连接凭据 2.3 从 svchost 中获取 RDP 连…

直击心灵:别让‘在吗’成为沟通障碍

在聊天过程中,我特别反感收到“在吗”的询问或是“微笑”表情。 当需要请求他人协助时,相较于冷冰冰又显敷衍的“在吗?”或是让人感觉虚伪的“微笑”表情,我更倾向于在“在吗”前加上对方的名字或昵称,随后直接切入主题。这样的沟通方式更为亲切且高效,也更容易得到对方的…

【半解决】开启代理后无法连接github仓库,开启tun模式后无法连接github仓库

背景 如图所示。问题 无法连接github仓库,代理可以正常访问外网。 PS C:\Users\acer\bin\ps> ssh -Tv git@github.com OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2 debug1: Reading configuration data C:\\Users\\acer/.ssh/config debug1: C:\\Users\\acer/.ssh/config l…