OpenHarmony 应用 ArkUI 状态管理开发范例

news2024/11/15 4:49:27

本文转载自《#2023 盲盒+码 # OpenHarmony 应用 ArkUI 状态管理开发范例》,作者:zhushangyuan_

本文根据橘子购物应用,实现 ArkUI 中的状态管理。

在声明式 UI 编程框架中,UI 是程序状态的运行结果,用户构建了一个 UI 模型,其中应用的运行时的状态是参数。当参数改变时,UI 作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的 UI 的重新渲染,在 ArkUI 中统称为状态管理机制。

自定义组件拥有变量,变量必须被装饰器装饰才可以成为状态变量,状态变量的改变会引起 UI 的渲染刷新。如果不使用状态变量,UI 只能在初始化时渲染,后续将不会再刷新。 下图展示了 State 和 View(UI)之间的关系。

管理组件拥有的状态

@State 装饰器:组件内状态

@State 装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI 会发生对应的渲染改变。

在状态变量相关装饰器中,@State 是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态变量的数据源。

@link 装饰器:父子双向同步

子组件中被 @Link 装饰的变量与其父组件中对应的数据源建立双向数据绑定。

@Link 装饰的变量与其父组件中的数据源共享相同的值。

@Componentexport struct DetailPage {  @State currentLocation: string = ''}

在父组件 DetailPage 中声明当前定位 currentLocation 变量

Panel(this.isPanel) {    Location({ isPanel: $isPanel, currentLocation: $currentLocation })}

将 currentLocation 变量传给子组件 Location

@Componentexport struct Location {  @Link currentLocation: string}

子组件用 @Link 装饰的 currentLocation 接收。

  @Builder cityList(city: any) {    if (this.currentLocation === city.name) {      List() {        ForEach(city.city, twoCity => {          ListItem() {            Column() {              Text(`${twoCity}`)                .width('100%')                .height(30)                .fontSize(14)                .onClick(() => {                  this.currentLocation = city.name + '/' + twoCity                })            }          }        })      }      .width('100%')      .divider({ strokeWidth: 2, color: $r('app.color.divider'), startMargin: 0, endMargin: 20 })    }  }

子组件中的 currentLocation 变量改变会同步父组件中的 currentLocation。

管理应用拥有的状态

AppStorage 是应用全局的 UI 状态存储,是和应用的进程绑定的,由 UI 框架在应用程序启动时创建,为应用程序 UI 状态属性提供中央存储。

和 LocalStorage 不同的是,LocalStorage 是页面级的,通常应用于页面内的数据共享。而对于 AppStorage,是应用级的全局状态共享。AppStorage 使用场景和相关的装饰器:@StorageProp 和 @StorageLink

@StorageProp

@StorageProp(key)是和 AppStorage 中 key 对应的属性建立单向数据同步,我们允许本地改变的发生,但是对于 @StorageProp,本地的修改永远不会同步回 AppStorage 中,相反,如果 AppStorage 给定 key 的属性发生改变,改变会被同步给 @StorageProp,并覆盖掉本地的修改。

@Entry@Componentstruct HomePage {  @State curBp: string = 'md' // curBp指当前窗口断点,sm代表小屏,md代表中屏,lg代表大屏}

在Home.ets页面中,用 @State 声明当前窗口类型:curBp 变量并赋初值为 md,代表中屏。

  isBreakpointSM = (mediaQueryResult) => {    if (mediaQueryResult.matches) {      this.curBp = 'sm'      AppStorage.SetOrCreate('curBp', this.curBp)    }  }  isBreakpointMD = (mediaQueryResult) => {    if (mediaQueryResult.matches) {      this.curBp = 'md'      AppStorage.SetOrCreate('curBp', this.curBp)    }  }  isBreakpointLG = (mediaQueryResult) => {    if (mediaQueryResult.matches) {      this.curBp = 'lg'      AppStorage.SetOrCreate('curBp', this.curBp)    }  }

根据屏幕尺寸,将 curBp 设置为相应的值,并用 SetOrCreate()方法保存在 AppStorage 中。

在子组件 NavigationHomePage 中直接使用 curBp 变量

@Entry@Componentexport struct NavigationHomePage {  @StorageProp('curBp') curBp: string = 'sm'}

curBp 是根据窗口的尺寸判断的,是不能改变的,因此使用 @StorageProp(‘curBp’)与 AppStorage(‘curBp’)建立单向数据同步。

@StorageLink

@StorageLink(key)是和 AppStorage 中 key 对应的属性建立双向数据同步:

1.  本地修改发生,该修改会被同步回 AppStorage 中;

2.  AppStorage 中的修改发生后,该修改会被同步到所有绑定 AppStorage 对应 key 的属性上,包括单向(@StorageProp 和通过 Prop 创建的单向绑定变量)、双向(@StorageLink 和通过 Link 创建的双向绑定变量)变量和其他实例(比如 PersistentStorage)。

@Entry@Componentstruct HomePage {  @StorageLink('shoppingCartGoodsList') shoppingCartGoodsList: { data: { id: number } }[] = []}

在Home.ets页面中,用 @StorageLink 装饰器定义 shoppingCartGoodsList,用于获取全局的购物车商品列表。

this.emitterClass.setShoppingCartGoodsList((eventData)=>{    this.shoppingCartGoodsList.push(eventData.data.id)    AppStorage.SetOrCreate('shoppingCartGoodsList', this.shoppingCartGoodsList)})

使用 AppStorage.SetOrCreate(‘shoppingCartGoodsList’, this.shoppingCartGoodsList)将购物车商品列表保存在 AppStorage 中。

因为购物车中的商品会联动的变化,比如在商品的详情页将商品添加至购物车,在首页也需要更新购物车信息,因此购物车商品列表采用 @StorageLink 装饰器装饰,与 AppStorage(‘shoppingCartGoodsList’)建立双向同步。

运行测试效果

执行以下命令,可以下载橘子购物应用工程:

git initgit config core.sparsecheckout trueecho code/Solutions/Shopping/OrangeShopping/ > .git/info/sparse-checkoutgit remote add origin https://gitee.com/openharmony/applications_app_samples.gitgit pull origin master

参考资料

橘子购物示例应用

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

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

相关文章

技术奇瑞高能出击,四大品牌联袂燃擎成都车展

8月25日,成都国际汽车展览会于中国西部国际博览城正式拉开帷幕。成都车展作为西南地区首屈一指的国内四大A级车展之一,不仅是下半年国内车市的风向标,也因天府之国弥漫着火锅味与茶香的烟火气而独具一番风味。成都车展上,奇瑞集团…

【校招VIP】前端算法考点之大数据相关

考点介绍: 大数据的关键技术分为分析技术和处理技术,可用于大数据分析的关键技术主要包括A/B测试,关联规则挖掘,数据挖掘,集成学习,遗传算法,机器学习,自然语言处理,模式…

17.看楼房

Description 小张在暑假时间进行了暑期社会调查。调查的内容是楼房的颜色如何影响人们的心情。于是他找到了一个楼房从左到右排成一排的小区,这个小区一共有 栋楼房,每个楼房有一个颜色 和一个高度 。小张调查的内容为每次他站在第 栋楼和第 栋楼之间向…

2240. 买钢笔和铅笔的方案数

文章目录 Tag题目来源题目解读解题思路复杂度分析写在最后 Tag 【枚举】【数学】 题目来源 2240. 买钢笔和铅笔的方案数 题目解读 现在你有一笔钱 total,用来购买钢笔和铅笔,它们的价格分别为 cost1 和 cost2,试问你可以有多少种不同的购…

CASAIM与北京协和医院达成合作,通过CT重建和3D打印技术为医学实验提供技术辅助和研究样本

近期,CASAIM与北京协和医院达成合作,通过CT重建和3D打印技术为医学实验提供技术辅助和研究样本,在实验样本的一致性和实验研究的严谨性原则下设计方案,推动产学研一体化发展。 北京协和医院是集医疗、教学、科研于一体的现代化综合…

【Tkinter系列04/15】界面小部件(选择钮、行编辑器)

九. 小部件Checkbutton 复选框小部件(有时称为 “复选框”)是允许用户阅读和 选择双向选项。上图显示了如何 复选按钮在关闭 (0) 和打开 (1) 状态下查看 实现:这是两个复选按钮的屏幕截图 使用 …

C#基础详解

Excerpt C#是微软公司发布的一种面向对象的、运行于 .NET Framework和 .NET Core(完全开源,跨平台)之上的高级程序设计语言。- C#是一种安全的、稳定的、简单的、优雅的,由C和C衍生出来的面向对象的编程语言。它在继承C和C强大功能…

threejs加载file格式的gltf模型,使用input type=file加载gltf模型

项目场景: 使用input选择gltf加载模型 问题描述 gltf有多个文件如何塞给GLTFLoader加载(不知道怎么办)。 解决方案: 最后在threejs官网看到解决办法 解决思路 URL.createObjectURL(bolb/file) 1:input输入文件获…

HummerRisk V1.4.0发布

大家好,HummerRisk 1.4.0和大家见面了,在这个版本中我们变更了多云检测的底层逻辑,增加了每次检测的project概念,更好的去支持检测历史和检索需要,增加阿里云最佳实践中资源监控检测规则,增加资源态势中的细…

TypeScript_队列结构-链表

队列 队列(Queue),它是一种受限的线性表,先进先出(FIFO First In First Out) 受限之处在于它只允许在队列的前端(front)进行删除操作而在队列的后端(rear)进…

python后端,一个账户,多设备登录管理

一个账号,多台设备同时登陆的问题,设计以及实现 参考这篇文章: https://www.alibabacloud.com/help/zh/tair/use-cases/manage-multi-device-logon-from-a-single-user-by-using-tairhash1.0 设计思路 利用的是Redis,主设备的保…

Webgoat-Hijack a session通关答题教程

Webgoat-Hijack a session Hijack session是会话劫持,先了解需要用到的知识: Cookie原理: 1.客户端向服务端发起请求 2.服务端返回cookie,自己也保存了一份 3.客户端收到后,将cookie也保存起来 4.客户端再次发起请求时…

某物联网数智化园区行业基于 KubeSphere 的云原生实践

公司简介 作为物联网 数智化园区一体化解决方案提供商,我们致力于为大中型园区、停车场提供软硬件平台,帮助园区运营者实现数字化、智能化运营。 在使用 K8s 之前我们使用传统的方式部署上线,使用 spug(一款轻量级无 Agent 的自…

算术化电路中如何使用定制gates?

1. 引言 现有ZKP证明系统中,除关注proof size和verification time之外,Prover Time是一个重要瓶颈。 当侧重Prover Time时,可考虑STARK方案。并借助recursive STARKSNARK,来获得small proof。 Prover Time: 直接取…

【VM】保姆级VM算法平台二次开发之-环境配置

VM算法平台二次开发 1.下载Visual Studio 20222.项目的创建 C# 应用3.设置属性,去掉属选型32位4. 进行引用的导入工作5. 重新加载,查看引用6. 工具箱添加Dll的依赖。(只需要加载一次就行) 1.下载Visual Studio 2022 可以直接在官…

PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化实践技术应用

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…

未来芯片设计领域的药明康德——青芯如何在N个项目间游走平衡

总部位于上海张江的青芯半导体(CyanSemi),ASIC定制设计是其核心业务之一。 青芯在单纯的设计服务维度之上,打造了从设计到生产的一套完整ASIC定制业务,不仅做芯片设计,还提供封装、测试服务,也…

ikuai配置内外网及动态域名,外部可以直接通过域名进行访问私网的网络服务环境。

1.安装ikuai虚拟机,这里可以自行百度,网上一堆教程用vm安装ikuai 2.重要的,配置网卡, 先上图在说。下图是虚拟机配置了两个网卡, 第一个网卡vmnet0配置为自动桥接模式。 第二个网卡vmnat1配置为NAT模式。 配置前需要…

C语言递归写n的k次方

int Func(int n,int k) {if (k 0){return 1;}else if (k > 1){return n * Func(n, k - 1);;}}int main() {int i 0;int j 0;printf("请输入数n和他的k次方\n");scanf("%d %d", &i,&j);int r Func(i,j);printf("%d的%d次方 %d\n"…

气传导耳机排名,四款市面上热销相当不错的气传导耳机推荐

​在当今快速的生活节奏中,气传导耳机成为了越来越多人的选择。它们以出色的音质和舒适度而广受好评。在本文中,我们将为您推荐四款市面上热销相当不错的气传导耳机,帮助你找到最适合自己的耳机。 推荐一:NANK南卡00压开放式耳机…