arkTS:持久化储存UI状态的基本用法(PersistentStorage)

news2024/12/27 10:49:54

arkUI:持久化储存UI状态的基本用法(PersistentStorage)

  • 1 主要内容说明
  • 2 例子
    • 2.1 持久化储存UI状态的基本用法(PersistentStorage)
      • 2.1.1 源码1的相关说明
        • 2.1.1.1 数据存储
        • 2.1.1.2 数据读取
        • 2.1.1.3 动态更新
        • 2.1.1.4 显示数据
      • 2.1.2 源码1 (持久化储存)
      • 2.1.3 源码1运行效果
        • 2.1.3.1 效果视频
        • 2.1.3.2 效果截图
          • 2.1.3.2.1 默认情况下
          • 2.1.3.2.2 点击按钮第一下
          • 2.1.3.2.3 点击按钮第二下
          • 2.1.3.2.4 点击按钮第三下
          • 2.1.3.2.5 退出程序
          • 2.1.3.2.6 重新进入程序
  • 3.结语
  • 4.定位日期

1 主要内容说明

持久化存储 (PersistentStorage) ,它提供了一种将数据保存到磁盘的机制,使得数据在应用关闭后仍能被保留和访问。通过调用 PersistentStorage.persistProp 方法,可以将各种类型的数据(如数字、字符串、布尔值以及复杂对象)存储起来。例如,代码中存储了用户的年龄、名字、布尔状态,以及包含多个属性的用户信息对象。这些存储的数据会与磁盘同步,确保数据的持久性。

关于后面源码1的内容,为了方便使用,代码通过 @StorageLink 装饰器将持久化存储的数据绑定到组件的属性中。例如,@StorageLink(“age”) 将磁盘中的 age 数据直接关联到组件的 age 属性。这种绑定方式的优势在于,属性值的变化会自动更新到存储中,反之亦然。

此外,源码1还展示了如何动态更新持久化数据。通过按钮点击事件,代码修改了存储中的多个值,例如年龄递增、字符串追加、布尔值变更,以及对象属性的更新。更新后的值会立即反映在存储中,并通过绑定属性实时同步到用户界面。也就是说点击后的效果会一直保持,退出程序后再进入程序,显示的也是上次退出前的状态。对比,若不使用持久化储存,每次关闭程序后再打开,显示的都是初始默认情况的画面,并不会储存上传退出前的状态。

2 例子

2.1 持久化储存UI状态的基本用法(PersistentStorage)

2.1.1 源码1的相关说明

2.1.1.1 数据存储

使用 PersistentStorage.persistProp 方法将各种类型的数据(数值、字符串、布尔值和对象)持久化存储到磁盘,例如:

	数字:PersistentStorage.persistProp("age", 22)
	字符串:PersistentStorage.persistProp("name", "jack")
	布尔值:PersistentStorage.persistProp("bool", true)
	对象:PersistentStorage.persistProp("UserMessage", {...})
2.1.1.2 数据读取

使用 @StorageLink 装饰器将存储的数据绑定到组件的属性中,数据会在组件中自动更新。如:

	@StorageLink("age") age: number = 0; 通过 "age" 属性访问存储的年龄。
2.1.1.3 动态更新

通过点击按钮,更新存储的值,并实时同步到 UI,例如:

	年龄自增:this.age += 1;
	更新对象中的字段:this.myUserMessage.age += 2;
2.1.1.4 显示数据

将存储的值通过 UI 元素(如 Text)展示出来,并支持 JSON 格式化显示对象。

2.1.2 源码1 (持久化储存)

// 定义用户信息的接口,包含名字、年龄、身高三个属性
export interface User_Message {
  name: string;  // 用户的名字
  age: number;   // 用户的年龄
  height: number; // 用户的身高
}

// 使用 PersistentStorage 初始设置磁盘存储的值
// 数值类型存储:年龄
PersistentStorage.persistProp("age", 22);

// 字符串类型存储:名字
PersistentStorage.persistProp("name", "jack");

// 布尔类型存储:一个布尔值
PersistentStorage.persistProp("bool", true);

// 对象类型存储:存储用户信息对象,遵循 User_Message 接口
PersistentStorage.persistProp("UserMessage", { name: "jack", age: 23, height: 168 } as User_Message);

@Entry
@Component
struct Page_PersistentStorage {
  // 将存储的值链接到组件属性
  @StorageLink("age")
  age: number = 0; // 默认值为0

  @StorageLink("name")
  name: string = ""; // 默认值为空字符串

  @StorageLink("bool")
  bool: boolean = false; // 默认值为 false

  @StorageLink("UserMessage")
  myUserMessage: User_Message = {} as User_Message; // 默认值为空对象,类型为 User_Message

  build() {
    Column() {
      // 显示存储的年龄(number 类型)
      Text("储存的年龄age,number类:")
      Text(this.age + "")
        .backgroundColor("#fcc")
        .fontSize(30)
        .margin({ bottom: 30, top: 10 });

      // 显示存储的名字(string 类型)
      Text("储存的名字name,string类:")
      Text(this.name + "")
        .backgroundColor("#ff4bd94b")
        .fontSize(30)
        .margin({ bottom: 30, top: 10 });

      // 显示存储的布尔值
      Text("储存的布尔值bool,boolean类:")
      Text(this.bool + "")
        .backgroundColor("#ff4798fa")
        .fontSize(30)
        .margin({ bottom: 30, top: 10 });

      // 显示存储的用户信息(对象类型)
      Text("储存的个人信息,自 User_Message 类:")
      Text(JSON.stringify(this.myUserMessage)) // 使用 JSON.stringify 显示对象内容
        .backgroundColor("#ffe3e349")
        .fontSize(30)
        .margin({ bottom: 30, top: 10 });

      // 按钮用于更改存储值
      Button("点击变换")
        .onClick(() => {
          // 每次点击年龄加1
          this.age += 1;

          // 名字追加【-GO-】
          this.name += "【-GO-】";

          // 布尔值变为 false
          this.bool = false;

          // 更新用户信息对象
          this.myUserMessage.name += "【-go-】";
          this.myUserMessage.age += 2;
          this.myUserMessage.height += 10;
        });

      // 说明点击按钮后数据的变化
      Text(` --age++ \n --name += 【-GO-】 \n --bool =false \n --对象类:名字+【-go-】,年龄+2,身高+10`);
    }
    .height("100%") // 列组件的高度设置为全屏
    .width("100%"); // 列组件的宽度设置为全屏
  }
}

2.1.3 源码1运行效果

2.1.3.1 效果视频
  • 视频效果

PersistentStorage持久化储存的基本使用

2.1.3.2 效果截图
2.1.3.2.1 默认情况下
  • 运行程序默认情况下
    在这里插入图片描述
2.1.3.2.2 点击按钮第一下
  • 点击 “点击变换” 摁钮第一下
    在这里插入图片描述
2.1.3.2.3 点击按钮第二下
  • 点击 “点击变换” 摁钮第二下
    在这里插入图片描述
2.1.3.2.4 点击按钮第三下
  • 点击 “点击变换” 摁钮第三下
    在这里插入图片描述
2.1.3.2.5 退出程序
  • 使用手机的手势,摁住页面上滑退出,或如下图点击退出
    在这里插入图片描述
2.1.3.2.6 重新进入程序
  • 点击模拟器应用重新进入程序
    在这里插入图片描述
  • 进入程序后的效果,内容还是之前点击三次以后的状态。若不使用持久化储存,每次关闭应用后再此打开应用都会为前面 默认情况下 的运行效果
    在这里插入图片描述

3.结语

持久化存储 (PersistentStorage) 为轻量级的储存方式,若想对于庞大的数据内容进行储存,还是得使用数据库的储存方式。本文关于持久化储存只是简单的逻辑结构的编写记录,目的在于我们先了解持久化储存的基本格式,以后再逐步添加复杂的用法。

持久化PersistentStorage的相关的内容,华为官方的指南地址:PersistentStorage:持久化存储UI状态

由于笔者的能力有限,创作的内容有所不足在所难免,也敬请读者包涵和指出,万分感谢!

4.定位日期

待视频审核通过;
2024-11-30;
10:48;

2024-11-30;
11:07;

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

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

相关文章

《Django 5 By Example》阅读笔记:p455-p492

《Django 5 By Example》学习第 16 天,p455-p492 总结,总计 38 页。 一、技术总结 1.myshop (1)打折功能 使用折扣码实现,但是折扣码是手动生成的,感觉实际业务中应该不是这样的。 (2)推荐功能 使用 Redis 做缓存&#xff0…

深入浅出:开发者如何快速上手Web3生态系统

Web3作为互联网的未来发展方向,正在逐步改变传统互联网架构,推动去中心化技术的发展。对于开发者而言,Web3代表着一个充满机遇与挑战的新领域,学习和掌握Web3的基本技术和工具,将为未来的项目开发提供强大的支持。那么…

otter 高可用策略

关于otter高可用在设计之初,提供了这样几个基本的需求: 1.网络不可靠,异地机房尤为明显. 2.manager/node的jvm不可靠,需要考虑异常crash情况 3.node的jvm不可靠,需要考虑异常crash的情况 4.数据库不可靠,需…

C底层 函数栈帧

文章目录 一,什么是寄存器 二,栈和帧 前言 我们在学习c语言程序的时候,是不是有很多的疑问,如 1,为什么形参不可以改变实参 2,为什么我们编写程序的时候会出现烫烫烫......这个乱码 3,那些局…

力扣1382:将二叉搜索树便平衡

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。 如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二…

亚马逊自研大语言模型 Olympus 即将亮相,或将在 LLM 竞赛中掀起新波澜

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

指针与引用错题汇总

int *p[3]; // 定义一个包含 3 个指向 int 的指针的数组int a 10, b 20, c 30; p[0] &a; // p[0] 指向 a p[1] &b; // p[1] 指向 b p[2] &c; // p[2] 指向 c // 访问指针所指向的值 printf("%d %d %d\n", *p[0], *p[1], *p[2]); // 输出: 10 20 30…

vscode ctrl+/注释不了css

方式一.全部禁用插件排查问题. 方式二.打开首选项的json文件,注释掉setting.json,排查是哪一行配置有问题. 我的最终问题:需要将 "*.vue": "vue",改成"*.vue": "html", "files.associations": { // "*.vue": &qu…

医疗知识图谱的问答系统详解

一、项目介绍 该项目的数据来自垂直类医疗网站寻医问药,使用爬虫脚本data_spider.py,以结构化数据为主,构建了以疾病为中心的医疗知识图谱,实体规模4.4万,实体关系规模30万。schema的设计根据所采集的结构化数据生成&…

上传镜像docker hub登不上和docker desktop的etx4.vhdx占用空间很大等解决办法

平时使用docker一般都在Linux服务器上,但这次需要将镜像上传到docker hub上,但是服务器上一直无法登录本人的账号,(这里的问题应该docker 网络配置中没有开代理的问题,因服务器上有其他用户使用,不可能直接…

大型复杂项目管理怎么结合传统与敏捷

大型复杂项目管理需要综合运用传统的瀑布模型与敏捷方法,两者各具优势,可以在不同的项目阶段和需求下发挥最大效能。首先,在项目的初期阶段,传统方法的详细规划和需求分析能够帮助确保项目方向正确、资源充足;敏捷方法…

PVE中VLAN的设置要点

使用这个拓扑进行连接无法直接访问PVE PVE 设置如下: 核心重点:PVE 的 vmbr0 接口直接绑定了 enp2s0,这会导致 VLAN 流量无法正确处理,因为 PVE 没有专门为 VLAN 3 配置接口。 1.vmbr0 和 vmbr0.3 都是绑定在物理接口 enp2s0 上&…

网络安全防范技术

1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性,信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论,典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能抵抗…

.net —— Razor

文章目录 项目地址一、创建一个Razor项目1.1 创建项目1.2 创建项目所需文件夹1.3 配置项目二、创建Category页面2.1 创建Category的展示页面2.2 增删改2.2.1 创建Edit的razor视图项目地址 教程作者:教程地址:代码仓库地址:所用到的框架和插件:dbt airflow一、创建一个Razo…

学习视频超分辨率扩散模型中的空间适应和时间相干性(原文翻译)

文章目录 摘要1. Introduction2. Related Work3. Our Approach3.1. Video Upscaler3.2. Spatial Feature Adaptation Module3.3. Temporal Feature Alignment Module3.4. Video Refiner3.5. Training Strategy 4. Experiments4.1. Experimental Settings4.2. Comparisons with …

Netty的心跳机制怎么实现的?

大家好,我是锋哥。今天分享关于【Netty的心跳机制怎么实现的?】面试题。希望对大家有帮助; Netty的心跳机制怎么实现的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 的心跳机制用于维持客户端和服务器之间的…

深度学习:自然语言处理

一、引言 自然语言处理作为人工智能领域的关键分支,致力于使计算机能够理解、分析和生成人类语言。近年来,随着深度学习技术的迅猛发展,自然语言处理取得了前所未有的突破,一系列创新技术和应用不断涌现,极大地推动了…

Android 系统之Init进程分析

1、Init进程流程 2、Init细节逻辑 2.1 Init触发shutdown init进程触发系统重启是一个很合理的逻辑,为什么合理? init进程是android世界的一切基石,如果android世界的某些服务或者进程出现异常,那么会导致整个系统无法正常使用…

轻量化的长时间序列预测模型

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接: 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】&…