【HarmonyOS】深入理解LocalStorage之逻辑处理存取

news2024/11/20 2:47:02

【HarmonyOS】深入理解LocalStorage

一、前言

鸿蒙应用中关于状态管理的处理机制有很多。从状态装饰器@State @prop等,LocalStrong,AppStrong到首选项,再到数据库。内存到持久化。轻量级到重量级。全方位覆盖。

学习和记忆技术点,建议知其然,才能知其所以然。搞清楚定位,才能如指臂使。

首先LocalStorage是页面级的UI状态存储,用于在@Entry修饰的页面,及其子View之间的状态存储,数据同步更新。

LocalStorage的读写操作是同步的,即当读取或写入LocalStorage时,程序会阻塞等待操作完成才会继续执行后续代码,所以不推荐频繁修改复杂对象。

UI装饰器,实现数据link同步更新的操作在第二章,本章主要讲解逻辑数据存取操作。

二、逻辑类中使用LocalStorage进行数据存取

在逻辑类中使用LocalStorage基本就脱离了UI的绑定,我们的数据基本在逻辑运算中使用。不考虑UI的动态刷新和渲染。

使用LocalStorage进行数据存储,可以将数据存储单元控制在单个页面或者单个Ability为单元,进行分割保存。

当我们直接使用LocalStorage进行set,get操作,该实例的作用范围是@Entry修饰的单个页面,以及其子页面(当然你需要透传实例对象才能实现)。

如果我们将实例对象捆绑到stage舞台上,就可以达到在单Ability中共享一个LocalStorage实例对象,扩大其作用范围。

所以为了达到能在逻辑类中便捷的使用LocalStorage,我们是需要:

1.将LocalStorage的实例绑定在舞台上。
如果不绑定,该实例仅仅在一个@Entry装饰的组件和其所属的子组件(一个页面)中共享,如果希望其在多个视图中共享,可以在所属UIAbility中创建LocalStorage实例,并调用windowStage.loadContent。

2.获取实例对象,使用setOrCreate 进行数据的存储。
使用Share函数进行绑定在舞台上的LocalStorage实例对象获取。
使用setOrCreate 进行数据存储,如果propName已经在LocalStorage中存在,并且newValue和propName对应属性的值不同,则设置propName对应属性的值为newValue,否则状态变量不会通知UI刷新propName对应属性的值。

3.使用get进行数据的获取,注意判空处理。

三、DEMO示例:

Demo验证思路,使用localStorage在UIAbility中共享的能力。进行页面间共享实例对象。进行key-val数据存储和获取。
在这里插入图片描述

import { UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends UIAbility {

  storage: LocalStorage = new LocalStorage();

  onWindowStageCreate(windowStage: window.WindowStage): void {
    windowStage.loadContent('pages/Index', this.storage, (err) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
  }

}
import { router } from '@kit.ArkUI';
import systemDateTime from '@ohos.systemDateTime';
import TestMgr from './TestMgr';



struct Index {
   message: string = 'Hello World';

  aboutToAppear(): void {
    let pageID: string = systemDateTime.getTime() + "";
    console.log("debugStorage", " pageID: " + pageID);
    TestMgr.Ins().setPageID(pageID);
    let tempID: string = TestMgr.Ins().getPageID();
    console.log("debugStorage", " tempID: " + tempID);
  }

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(()=>{
          router.pushUrl({
            url: "pages/Index2"
          })
        })
    }
    .height('100%')
    .width('100%')
  }
}
import TestMgr from './TestMgr';



struct Index2 {
   message: string = 'Hello World222';

  aboutToAppear(): void {

    let tempID: string = TestMgr.Ins().getPageID();
    console.log("debugStorage", " Index2 tempID: " + tempID);
  }

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('Index2HelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
    }
    .height('100%')
    .width('100%')
  }
}

export default class TestMgr{

  private static mTestMgr: TestMgr | undefined = undefined;

  public static Ins(): TestMgr {
    if(TestMgr.mTestMgr){
      return TestMgr.mTestMgr;
    }else{
      TestMgr.mTestMgr = new TestMgr();
      return TestMgr.mTestMgr;
    }
  }

  public getPageID(){
    let storage = LocalStorage.getShared();
    let temp: string = storage.get("pageID") ?? "";
    return temp;
  }

  public setPageID(pageID: string){
    let storage = LocalStorage.getShared();
    storage.setOrCreate("pageID", pageID);
  }

}

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

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

相关文章

springboot实现沙箱支付退款

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>商城与订单管理</title><link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/index.css"><…

websocket集群部署遇到的一些事

最近刚好有个场景&#xff0c;业务处理一份报告需要关注实时处理的进度。 本来打算使用前端轮训方式&#xff0c;但是考虑到这样效率比较低&#xff0c;也无法精确知道处理进度&#xff0c;就想到用websocket和前端实时交互&#xff0c;进度有更新就通知前端&#xff0c;避免了…

【Qt】系统相关学习--底层逻辑--代码实践

Qt事件 基本概念 理解Qt事件 事件是用户与应用程序之间交互的基础。它允许应用程序对用户的输入做出响应&#xff0c;例如鼠标点击一下又或者用户键盘输入相应内容。也就是说每一次用户与应用程序交互的时候&#xff0c;都会产生一个事件&#xff0c;然后传递给相应的控件或者…

如何制作小程序商城

在这个瞬息万变的数字时代&#xff0c;每一个商业决策的背后都蕴含着对市场趋势的深刻洞察与把握。随着移动互联网的飞速发展&#xff0c;小程序商城以其便捷性、高效性和低门槛的特点&#xff0c;正逐步成为众多企业商家竞相布局的营销新阵地。今天&#xff0c;就让我们一起深…

sql-server【bcp工具】

目录 1.查看bcp是否可用 2.bcp 命令的基本语法 3.数据导出 4.数据导入 bcp&#xff08;Bulk Copy Program&#xff09;是 SQL Server 提供的一个命令行工具&#xff0c;用于在 SQL Server 实例与用户指定格式的数据文件之间批量复制表或视图数据。bcp 工具非常适合进行大量…

雷池 WAF 如何配置才能正确获取到源 IP

经常有大哥反馈说雷池攻击日志里显示的 IP 有问题。 这里我来讲一下为什么一些情况下雷池显示的攻击 IP 会有问题。 问题说明 默认情况下&#xff0c;雷池会通过 HTTP 连接的 Socket 套接字读取客户端 IP。在雷池作为最外层网管设备的时候这没有问题&#xff0c;雷池获取到的…

康谋分享 | 数据隐私和匿名化:PIPL与GDPR下,如何确保数据合规?(一)

目录 一、自动驾驶数据合规挑战 二、PIPL和GDPR的异同点 1、覆盖范围 2、个人信息定义 3、敏感数据 自动驾驶技术的快速发展伴随着数据隐私保护的严峻挑战。中国《个人信息保护法》&#xff08;PIPL&#xff09;与欧盟《通用数据保护条例》&#xff08;GDPR&#xff09;为…

Unity实战案例全解析:RTS游戏的框选和阵型功能(4)阵型功能

前篇&#xff1a;Unity实战案例全解析&#xff1a;RTS游戏的框选和阵型功能&#xff08;3&#xff09;生成范围检测框 重置框选操作-CSDN博客 本案例来源于unity唐老狮&#xff0c;有兴趣的小伙伴可以去泰克在线观看该课程 我只是对重要功能进行分析和做出笔记分享&#xff0c;…

PCIE XDMA

1 硬件电路 2 XDMA IP说明 2.1 Basic Mode:配置模式,选择 Basic 配置模式就可以了,Advanced 高级配置一般用不到; Lane Width:链路宽度,对于 ZYNQ MPSOC开发板,选择x2; Max Link Speed:最大链路速度,选择 8.0GT/s,即 PCIe 3.0 的传输速率; Refere

ultralytics yolo v8 示例:加载官方模型进行推理

Ultralytics YOLO 是计算机视觉和 ML 领域专业人士的高效工具。 安装 ultralytics 库&#xff1a; pip install ultralytics 实现代码如下&#xff1a; import cv2 from ultralytics import YOLO# 加载预训练的 YOLOv8n 模型 ckpt_dir "./ckpt/" # 模型缓存地址…

3、练习常用的HBase Shell命令+HBase 常用的Java API 及应用实例

目录 &#xff08;一&#xff09;练习常用的HBase Shell命令1、启动HBase2、练习shell命令create scan list describe alterputgetdeletedrop 关于NoSQL数据库中的列族和列3、关闭hbase服务 &#xff08;二&#xff09;HBase 常用的Java API 及应用实例1、启动hbase服务2、启动…

C++版本更新历史

前言 C语言发展至今已经迭代了很多版本&#xff0c;而在不同环境中编写代码时经常看到C标准的设定&#xff0c;比如 Leetcode 中可以看到版本信息&#xff1a; 这说明Leetcode已经支持最新C23标准了&#xff0c;但某些环境并不一定支持这些语法&#xff0c;如果不清楚使用的语法…

提示词工程 (Prompt Engineering) 最佳实践

prompt Engineering 概念解析 提示工程是一门较新的学科&#xff0c;关注提示词开发和优化&#xff0c;帮助用户将大语言模型&#xff08;Large Language Model, LLM&#xff09;用于各场景和研究领域。研究人员可利用提示工程来提升大语言模型处理复杂任务场景的能力&#xf…

Jetson nano (4GB版本)跑yolov8n(TensorRT 加速)网络

大家好&#xff0c;我是王硕&#xff0c;项目原因需要在Jetson nano平台上跑yolov8s &#xff0c;需要使用TensorRt加速&#xff0c;看了网上的教程&#xff0c;写的太差了&#xff0c;资料零零散散的&#xff0c;故详细介绍一下步骤。 如果想使用jetson Nano平台部署yolov8&a…

Selenium与数据库结合:数据爬取与存储的技术实践

目录 一、Selenium与数据库结合的基础概念 1.1 Selenium简介 1.2 数据库简介 1.3 Selenium与数据库结合的优势 二、Selenium爬取数据的基本步骤 2.1 环境准备 2.2 编写爬虫代码 2.3 数据提取 2.4 异常处理 三、数据存储到数据库 3.1 数据库连接 3.2 数据存储 3.3 …

windows10录屏工具,四款新手必备软件!

今天要和大家聊的是-——win10的录屏工具。在Win10电脑上&#xff0c;那些让我们爱不释手的录屏神器有很多&#xff0c;不管是哪个行业的人&#xff0c;录屏软件简直是日常工作的得力助手&#xff0c;比如说对于程序员来说&#xff0c;不管是分享代码教程、记录bug复现&#xf…

RKLLM部署

RKLLM 写在前面&#xff1a;建议去阅读官方提供的RKLLM doc&#xff0c;本文基于官方的RKLLM doc制作而成&#xff08;没有将flask相关内容添加进来&#xff09;&#xff0c;仅仅添加了完整流程的执行过程截图和在做这以流程过程中遇到的问题 RKLLM可以帮助用户快速将人工智能…

【vite】搭建完整项目流程、项目配置

文章目录 完整项目源码项目技术栈&#xff1a;项目地址&#xff1a; 一、创建项目二、安装scss三、安装路由router四、项目配置 参考文章&#xff1a;vite搭建完整项目 完整项目源码 觉得创建太麻烦就直接从github克隆吧&#xff0c;https://github.com/fruge365/vite-common…

金智维KRPA之Excel自动化

Excel自动化操作概述 Excel自动化主要用于帮助各种类型的企业用户实现Excel数据处理自动化&#xff0c;Excel自动化是可以从单元格、列、行或范围中读取数据&#xff0c;向其他电子表格或工作簿写入数据等活动。 通过相关命令&#xff0c;还可以对数据进行排序、进行格式…

开发者如何自主绑定和解除小程序和公众号长期/短期运营者微信号?

开发者如何自主绑定和解除小程序和公众号长期/短期运营者微信号&#xff1f; 1、什么是长期/短期运营者微信号&#xff1f; 为了让更多人管理公众号更方便与安全&#xff0c;每个公众号可由管理员添加绑定5个长期运营者微信号、20个短期运营者微信号&#xff0c;运营者微信号…