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

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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析

本文 一、引言:技术浪潮中的个人视角1.1 AI 和低代码的崛起1.2 为什么选择云开发 Copilot? 二、云开发 Copilot 的核心功能解析2.1 自然语言驱动的低代码开发2.1.1 自然语言输入示例2.1.2 代码生成的模块化支持 2.2 实时预览与调整2.2.1 实时预览窗口功能…

AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。

大家好,我是微学AI,今天给大家介绍一下AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。本文利用专家模…

【前端Vue】day04

一、学习目标 1.组件的三大组成部分(结构/样式/逻辑) ​ scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法父传子子传父非父子通信(扩展) 3.综合案例:小黑记事本(组件版) 拆分…

嵌入式系统应用-LVGL的应用-平衡球游戏 part2

平衡球游戏 part2 4 mpu60504.1 mpu6050 介绍4.2 电路图4.3 驱动代码编写 5 游戏界面移植5.1 移植源文件5.2 添加头文件 6 参数移植6.1 4 mpu6050 4.1 mpu6050 介绍 MPU6050是一款由InvenSense公司生产的加速度计和陀螺仪传感器,广泛应用于消费电子、机器人等领域…

每日十题八股-2024年12月2日

1.你知道有哪个框架用到NIO了吗? 2.有一个学生类,想按照分数排序,再按学号排序,应该怎么做? 3.Native方法解释一下 4.数组与集合区别,用过哪些? 5.说说Java中的集合? 6.Java中的线程…

git 常用命令及问题

一、常用命令 git add filename git add . git commit -m "messge" git commit --amend 修改最近一次的提交 git push origin HEAD:refs/for/master git clone url git checkout branchname 切换分支 git branch -r 查看远程仓库分支列表 git branch br…

DSD-DA

adversarial loss L a d v _{adv} adv​ g() denotes the project function,Gradient Reverse Layer(GRL). ROI features F ( r ) (r) (r) 补充信息 作者未提供代码

医院管理系统

私信我获取源码和万字论文,制作不易,感谢点赞支持。 医院管理系统 摘要 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求,创建了一个计…

SpringBoot 整合 Avro 与 Kafka

优质博文:IT-BLOG-CN 【需求】:生产者发送数据至 kafka 序列化使用 Avro,消费者通过 Avro 进行反序列化,并将数据通过 MyBatisPlus 存入数据库。 一、环境介绍 【1】Apache Avro 1.8;【2】Spring Kafka 1.2&#xf…

Win10+Ubuntu20.04双系统重装Ubuntu22.04单系统

从去年 8 月美化 Ubuntu 系统后一直存在内核错误问题,但因为大部分功能还能正常使用,只是在 apt 时报错,所以一直逃避不想重装,直到最近 12 月新的开始,恰好设置的界面打不开得重装 gnome ,所以下定决心重装…

Linux:进程间通信之system V

一、共享内存 进程间通信的本质是让不同的进程看到同一份代码。 1.1 原理 第一步:申请公共内存 为了让不同的进程看到同一份资源,首先我们需要由操作系统为我们提供一个公共的内存块。 第二步:挂接到要通信进程的地址空间中 &#xff…

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

【Linux网络编程】第四弹---构建UDP服务器与字典翻译系统:源码结构与关键组件解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、UdpServer.hpp 1.1、函数对象声明 1.2、Server类基本结构 1.3、构造函数 1.4、Start() 2、Dict.hpp…

数字IC后端设计实现之分段长clock tree经典案例

最近发现很多读者问到分段长clock tree的做法,小编今天给大家分享几个SoC芯片中复杂时钟结构设计的分段长clock tree的应用案例。希望对各位的学习和工作有所助益。 数字后端设计实现之时钟树综合实践篇 数字IC后端实现专家都具备哪些技能?&#xff08…

计算机毕业设计Spark+SpringBoot旅游推荐系统 旅游景点推荐 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

EasyMedia播放rtsprtmp视频流

学习链接 MisterZhang/EasyMedia - gitee地址 EasyMedia转码rtsp视频流flv格式,hls格式,H5页面播放flv流视频 文章目录 学习链接介绍步骤easydarwin启动rtsp服务,ffmpeg推送摄像头(模拟rtsp视频流)nginx添加rtmp支持…

【Linux】开启你的Linux之旅:初学者指令指南

Linux相关知识点可以通过点击以下链接进行学习一起加油! 在 Linux 开发中,GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题,Git 则提供高效的版本管理与协作支持。本指南将简明介绍两者的核心功能与使用技巧&…

SpringBoot-问题排查 Controller全局打印入参,返回值,响应时间,异常日志

问题: 想要打印每次请求的入参,返回值,响应时间,异常日志,如果给每个方法挨个添加打印日志非常麻烦 解决方案: 使用切面的方式将所有的Controller每个方法加入切入点使用环绕通知的方式可以在切入点执行前后执行切面,符合我们的需求在方法执行前后打印相关日志忽略LogIgnore注解…

mysql数据库varchar截断问题

用了这么多年mysql数据库,才发现varchar是可以截断的,而且是在我们线上数据库。个人觉得dba的这个设置是非常有问题的,用户往数据库里存东西,就是为了以后用的,截断了存放,数据不完整,就用不了了…

C++草原三剑客之一:继承

为王的诞生献上礼炮吧! 目录 1 继承的概念及其定义 1.1 继承的概念 1.2 继承的定义 1.2.1 定义格式 1.2.2 继承方式以及继承基类成员访问方式的变化 1.3 继承类模板 2 基类和派生类之间的转换 3 继承中的作用域 3.1 隐藏规则 3.2 两道考察继承作用的相关…