【HarmonyOS 4.0】应用级变量的状态管理

news2024/11/15 16:03:10
  1. 组件级变量的状态管理装饰器仅能在页面内,即一个组件树上共享状态变量。
    如果开发者要实现应用级的,或者多个页面的状态数据共享,就需要用到应用级变量的状态管理。

1. LocalStorage(@LocalStorageProp/@LocalStorageLink)

  1. LocalStorage 是页面级UI状态存储,通常用于UIAbility内、页面间的状态共享。
  2. 用于存储页面级的状态数据,位于 LocalStorage 中的状态数据可以在一个页面内的所有组件中共享。

1.1 创建 LocalStorage 实例,并初始化状态变量

let storage = new LocalStorage({ count: 0 }) // 创建新实例并使用给定对象初始化

1.2 将 LocalStorage 实例绑定到页面的入口组件

@Entry(storage)
@Component
struct Index { build(){} }

1.3 在页面内的组件访问 LocalStorage

  1. ArkTs 提供了俩个装饰器用于访问 LocalStorage,分别是 @LocalStorageProp 和 @LocalStorageLink ,@LocalStorageProp 装饰的变量可以和 LocalStorage 实现单向同步,@LocalStorageLink 装饰的变量可以和 LocalStorage 实现双向同步。
    在这里插入图片描述

2. AppStorage(@StorageProp/@StorageLink)

  1. AppStorage 是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。
  2. 用于存储应用级的状态数据,位于 AppStorage 中的状态数据可以在整个应用的所有组件中共享。

2.1 初始化状态变量

AppStorage.SetOrCreate('count', 0);

2.2 在整个应用内的组件中访问 AppStorage

  1. ArkTs 提供了俩个装饰器用于访问 AppStorage 实例,分别是 @StorageProp 和 @StorageLink,@StorageProp 装饰的变量可以和 AppStorage 实现单向同步,@StorageLink 装饰的变量可以和 AppStorage 实现双向同步。
    在这里插入图片描述

3. PersistentStorage

  1. LocalStorage 和 AppStorage 都是将状态数据保存在内存中,应用一旦退出,数据就会被清理,如果需要对数据进行持久化存储,就需要用到 PersistentStorage。比如应用的登录状态。
  2. PersistentStorage 可以将指定的 AppStorage 中的属性存储到磁盘中,并且 PersistentStorage 和 AppStorage 的属性会自动建立双向绑定,开发者不能直接访问 PersistentStorage 中的属性,只能通过 AppStorage 进行访问。
// 将 AppStorage 中的 count 属性存储到磁盘或文件中,需要注意的是 AppStorage 中不需要单独初始化声明 count 这个属性,PersistentStorage 的这个 .PersistProp() 方法会自动在 AppStorage 中创建一个属性出来。
PersistentStorage.PersistProp('count', 0); 

@Entry
@Component
struct Index {
  @StorageLink('count') count: number = 0

  build() {
    Row() {
      Column() {
        // 应用退出时会保存当前结果。重新启动后,会显示上一次的保存结果
        Text(`${this.count}`).fontSize(50)
          .onClick(() => {
            this.count += 1;
          })
      }
    }
  }
}

4. Environment

  1. 开发者如果需要应用程序运行的设备的环境参数,以此来作出不同的场景判断,比如多语言,暗黑模式等,需要用到 Environment 设备环境查询。
  2. @StorageProp 关联的环境参数可以在本地更改,但不能同步回 AppStorage 中,因为应用对环境变量参数是不可写的,只能在Environment中查询。

4.1 将设备运行的环境变量存入 AppStorage 中

Environment.EnvProp('languageCode', 'en');

4.2 在组件中访问 Environment

@StorageProp('languageCode') lang: string = 'en';

4.3 在组件中查询使用 Environment

// 使用 Environment.EnvProp 将设备运行 languageCode 存入 AppStorage 中;
Environment.EnvProp('languageCode', 'en');
// 从 AppStorage 获取单向绑定的 languageCode 的变量
const lang: SubscribedAbstractProperty<string> = AppStorage.Prop('languageCode');

if (lang.get() === 'zh') {
  console.info('你好');
} else {
  console.info('Hello!');
}

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

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

相关文章

软考有哪些科目一年考两次?

软考高级【系统分析师】及【系统架构设计师】是一年考两次的。 软考中级【软件设计师】和【网络工程师】也是一年考两次的。 其他科目一年都只开考一次&#xff0c;或者上半年开考&#xff0c;或者下半年开考&#xff0c;具体考试时间可看下图。 软考考题类型/数量/考试方式&…

西安运营服务体系完善的产业园在哪里?

在西安这片充满历史底蕴与创新活力的土地上&#xff0c;有一处运营服务体系完善的产业园正熠熠生辉&#xff0c;成为众多企业追逐梦想、实现发展的理想之地。 这个产业园坐落在 [西安市长安区东长安街481号]的西安国际数字影像产业园&#xff0c;园区正以其卓越的运营服务体系吸…

为什么音视频SDK成为线上招投标不可或缺的技术支持?

随着信息技术的飞速发展和数字化转型的深入&#xff0c;线上招投标已成为现代商业活动中不可或缺的部分。这一过程不仅提高了招投标的效率&#xff0c;还增强了透明度和公平性。在这个过程中&#xff0c;音视频SDK&#xff08;软件开发工具包&#xff09;作为关键技术之一&…

nvm管理node版本解决node版本冲突问题

nvm管理node版本解决node版本冲突等乱七八糟的问题 说明一、node环境检查二、安装nvm三、node安装说明 本文主要内容为nvm的安装,包括node环境的检查,nvm下载安装以及不同版本的node安装 更新时间:2024/09/01 16:39 本文仅为记录学习轨迹,如有侵权,联系删除 一、node环…

webros机器人控制软件

一、可显示轨迹。 二、可显示机器人状态&#xff0c;如速度、位置等。 三、可以对机器人进行多点导航设置并下发导航点。 技术栈&#xff1a;rosbrige_server ,vue3,ros1,robotwebtool

美畅物联丨智能安防新趋势:IPC规格参数详解与选型建议

在畅联AIoT开放云平台的应用生态中&#xff0c;"端-边-网-云-用"这一核心理念始终是我们构建视频及AIoT底座平台的基石。其中&#xff0c;网络摄像机&#xff08;IPC&#xff0c;即Internet Protocol Camera&#xff09;&#xff0c;作为端侧设备的核心成员&#xff…

2024-09-02 Ubuntu固定USB串口名(包括1拖N的USB串口)

在运行Ubuntu系统的开发板上,如果使用可插拔的USB串口,有时候程序正在运行时,如果突然连接传感器的USB串口设备被插拔了一下,这时,会发现系统中的USB串口名发生了改变。例如,插拔之前是/dev/ttyUSB0,插拔之后变成了/dev/ttyUSB3。发生这种情况的时候,有时候会导致程序无…

Harbor部署docker私人仓库

1、新建虚拟机rhel9 2、配置网络 #修改内核参数使网卡名称为ethxxx grubby --update-kernel ALL --args net.ifnames0reboot #配置网络 vim /etc/NetworkManager/system-connections/eth0.connection 内容为&#xff1a;[connection] ideth0 typeethernet interface-nameeth0…

Git创建项目

方法一 1.在gitee中新建仓库demo01&#xff0c;并勾选开源许可证&#xff0c;完成后gitee上面的项目demo01里只包含一个LICENSE文件 2.直接在本地电脑中新建项目文件夹demo01&#xff0c;双击进入这个文件夹&#xff0c;右键Git bash here&#xff0c;输入 git clone https:…

git commit添加emoji表情

先看样板&#xff1a; 完整表情见&#xff1a;gitmoji | An emoji guide for your commit messages 中文解释见&#xff1a;https://github.com/liuchengxu/git-commit-emoji-cn 示例&#xff1a; git commit -m :wrench: 修改supervisor配置 git commit -m :zap: 使用C扩展…

24.9.1(康托展开)

上星期三: 补 24牛客多校 二 C 牛客传送门 思路: 赛时写模拟写的很臭,如果用dp写就很方便 代码如下: const int N2e610; const int mod1e97; ll n; char s[N][2]; int dp[N][2]; void solve(){cin >> n;for(int i1;…

别再被假WiFi坑!正规品牌教你如何慧眼识珠!随身wifi哪些才是正规品牌?全网最靠谱的随身wifi推荐!

如今的随身 WiFi 市场&#xff0c;可谓是热闹非凡。各种品牌如雨后春笋般涌现&#xff0c;让人眼花缭乱。然而&#xff0c;当流量告急时&#xff0c;我们也不能病急乱投医&#xff0c;随便购买随身 WiFi。毕竟&#xff0c;市场上的随身 WiFi 品牌五花八门&#xff0c;质量参差不…

活动系统开发之采用设计模式与非设计模式的区别-需求设计及拓展

通过活动系统流程图拆分成5个业务流程图 1、签到与滚动抽奖业务流程图 2、签到与答题领取奖品业务流程图 3、签到与抽奖业务流程图 4、答题与组团业务流程图 5、答题与美图分享业务流程图 6、总结 因业务流程相互嵌套&#xff0c;所以将每个系统模板化后可以动态组合目前的子业…

【卷起来】VUE3.0教程-02-模板语法

&#x1f341; 项目目录结构 在上面的案例中&#xff0c;我们创建出了一个vue项目&#xff0c;项目结构如下&#xff1a; .vscode&#xff1a;vscode工具的配置文件node_modules&#xff1a;Vue 项目的运行依赖文件public&#xff1a;资源文件夹&#xff08;浏览器图标&#x…

Leetcode Day18 堆

Python中关于堆的操作 注意, python默认的是最小堆 什么时候想到用堆 A: 流!或者我们只关心k个元素 373 查找和最小的前k对数字 给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff…

Learing——protobuf(一)

目录 前言 一、protobuf的简介 二、编写一个.proto文件 1.选择使用的protobuf版本 2.指定命名空间&#xff08;package&#xff09; 3.定义一个“消息”&#xff08;message&#xff09; 4.定义消息字段 标量类型&#xff1a; 枚举类型(enum): 多选一类型(oneof)&…

论文速读|I-CTRL:通过受限强化学习使人型机器人模仿和控制

论文地址&#xff1a;https://arxiv.org/pdf/2405.08726 I-CTRL&#xff08;Imitation to Control Humanoid Robots Through Constrained Reinforcement Learning&#xff09;是一个旨在解决现有人类运动到人型机器人的转换方法在物理可行性上的不足的框架。该框架通过在非物理…

基础闯关3

一、基础任务 大模型在浮点数大小比较上表现不佳&#xff0c;直接询问大模型浮点数大小往往会出现错误&#xff0c;而通过设定适当的提示词可以引导大模型生成正确的答案。提示工程是指设计和优化输入提示&#xff08;prompts&#xff09;的过程&#xff0c;这些提示用于指导大…

一网统管政企联动:计讯构建城市生命线安全智能体的应急管理革新

城市生命线国家政策推动生命线风险频发 随着城市化进程加速&#xff0c;城市安全问题日益凸显&#xff0c;包括自然灾害、建筑老化、环境污染和公共卫生事件等潜在风险。城市不仅要更新“硬设施”&#xff0c;更在于通过大数据、云计算、5G等新兴技术提升城市管理的“软实力”。…

three.js 开发粒子系统

在 three.js 中开发粒子系统&#xff0c;你通常会使用 THREE.Points 和 THREE.PointsMaterial。这些组件允许你创建一个由大量点组成的系统&#xff0c;每个点都可以代表一个粒子&#xff0c;并可以自定义其大小、颜色、透明度等属性。以下是一个基本的步骤指南&#xff0c;用于…