HarmonyOS | 状态管理(六) | LocalStorage(页面级UI状态存储)

news/2024/7/21 9:05:52 标签: harmonyos, 华为, LocalStorage

系列文章目录

1.HarmonyOS | 状态管理(一) | @State装饰器
2.HarmonyOS | 状态管理(二) | @Prop装饰器
3.HarmonyOS | 状态管理(三) | @Link装饰器
4.HarmonyOS | 状态管理(四) | @Provide和@Consume装饰器
5.HarmonyOS | 状态管理(五) | @Observed装饰器和@ObjectLink装饰器


文章目录

  • 系列文章目录
  • 前言
  • 一、LocalStorage 是 什么?
  • 二、特性
  • 三、LocalStorage 使用场景
  • 四、两种不同的同步类型装饰器
  • 总结


前言

以上文章介绍的 装饰器 仅能页面内,即一个组件树上共享状态变量,后续文章讲解应用级的状态管理。
本篇文章我们讲解的是:LocalStorage (页面级UI状态存储)


LocalStorage___18">一、LocalStorage 是 什么?

页面级UI状态存储,通常用于UIAbility内、页面间的状态共享

二、特性

  • 应用程序可以创建多个LocalStorage实例,LocalStorage实例可以在页面内共享,也可以通过GetShared接口,实现跨页面、UIAbility实例内共享。

  • 组件树的根节点,即被@Entry装饰的@Component,可以被分配一个LocalStorage实例,此组件的所有子组件实例将自动获得对该LocalStorage实例的访问权限。

  • 被@Component装饰的组件最多可访问一个LocalStorage实例,未被@Entry装饰的组件不可被独立分配LocalStorage实例,只能接受父组件通过@Entry传递来的LocalStorage实例。

  • 一个LocalStorage实例在组件树上可以被分配给多个组件。

  • LocalStorage中的所有属性都是可变的。

  • 应用程序决定LocalStorage对象的生命周期。当应用释放最后一个指向LocalStorage的引用时,比如销毁最后一个自定义组件,LocalStorage将被JS Engine垃圾回收。

LocalStorage__36">三、LocalStorage 使用场景

let storage = new LocalStorage({ 'PropA': 47 }); // 创建新实例并使用给定对象初始化
let propA = storage.get('PropA') // propA == 47
let link1 = storage.link('PropA'); // link1.get() == 47
let link2 = storage.link('PropA'); // link2.get() == 47
let prop = storage.prop('PropA'); // prop.get() = 47
link1.set(48); // two-way sync: link1.get() == link2.get() == prop.get() == 48
prop.set(1); // one-way sync: prop.get()=1; but link1.get() == link2.get() == 48
link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49

四、两种不同的同步类型装饰器

LocalStorage 根据与 @Component 装饰的组件的同步类型不同,提供了两个装饰器:

@LocalStorageProp:@LocalStorageProp 装饰的变量与LocalStorage中给定属性建立单向同步关系。
@LocalStorageLink:@LocalStorageLink 装饰的变量与LocalStorage中给定属性建立双向同步关系。

LocalStorageProp___54">1. @LocalStorageProp 装饰器 (单向同步)

let storageProp = new LocalStorage({ 'PropA': 47 });

@Entry(storageProp)
@Component
struct LocalStoragePropPage {
  // @LocalStorageProp变量装饰器与LocalStorage中的'PropA'属性建立单向绑定
  @LocalStorageProp('PropA') storagePropOne: number = 1;

  build() {
     Column({ space: 15 }) {
         // 点击后从47开始加1,只改变当前组件显示的storagePropOne,不会同步到LocalStorage
         Button(`Parent from LocalStorage ${this.storagePropOne}`).onClick(() => this.storagePropOne += 1)
         ChildProp()
     }

  }
}

@Component
struct ChildProp {
  // @LocalStorageProp变量装饰器与LocalStorage中的'PropA'属性建立单向绑定
  @LocalStorageProp('PropA') storagePropTwo: number = 2;

  build(){
    Column({ space: 15 }) {
      // 当LocalStoragePropPage改变时,当前storagePropTwo不会改变,显示47
      Text(`Parent from LocalStorage ${this.storagePropTwo}`)
    }
  }
}
  • LocalStoragePropPage 中对 this.storagePropOne 的修改,只会在 LocalStoragePropPage 中生效,并没有同步回 storageProp ;
  • Child 组件中,Text 绑定的 storagePropTwo 依旧显示47。

LocalStorageLink___90">2. @LocalStorageLink 装饰器 (双向同步)

let storage = new LocalStorage({ 'PropA': 50 });

@Component
struct Child{
    // @LocalStorageLink 与 LocalStorage中的'PropA'属性建立双向绑定
    @LocalStorageLink('PropA') storageLinkTwo : number = 1;

    build(){
       Button(`Child from LocalStorage ${this.storageLinkTwo}`)
         // 更改将同步至LocalStorage中的'PropA'以及Parent.storageLinkOne
         .onClick(()=> this.storageLinkTwo += 1)
    }
}

// 使LocalStorage可从@Component组件访问
@Entry(storage)
@Component
struct LocalStoragePager {
  // @LocalStorageLink 与 LocalStorage中的'PropA'属性建立双向绑定
  @LocalStorageLink('PropA') storageLinkOne : number = 1

  build() {
    Column({ space: 15 }) {
      Button(`Parent from LocalStorage ${this.storageLinkOne}`)
        .onClick(() => this.storageLinkOne += 1)
      // @Component子组件自动获得对LocalStoragePager LocalStorage实例的访问权限。
      Child()
    }
  }
}

LocalStorageUIAbility_128">3. 将LocalStorage实例从UIAbility共享到一个或多个视图

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

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

let para:Record<string,number> = { 'PropB': 47 };
let localStorage: LocalStorage = new LocalStorage(para);

export default class EntryAbility extends UIAbility {

  storage: LocalStorage = localStorage
  
  onWindowStageCreate(windowStage: window.WindowStage) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/status/LocalStorageUIAbilityPage', this.storage);
  }
}
// 通过GetShared接口获取stage共享的LocalStorage实例
let storages = LocalStorage.GetShared()

@Entry(storages)
@Component
struct LocalStorageUIAbilityPage {
  @LocalStorageLink('PropB') varA: number = 1;

  build() {
    Column() {
      Text(`${this.varA}`).fontSize(50)
    }
  }
}

注:

  • 在UI页面通过getShared接口获取在通过loadContent共享的LocalStorage实例。

  • LocalStorage.getShared只在模拟器或者实机上才有效,不能在Preview预览器中使用。


总结

1.LocalStorage实例可以在页面内共享,也可以通过GetShared接口,实现跨页面、UIAbility实例内共享。

2.@LocalStorageProp 装饰的变量与LocalStorage中给定属性建立单向同步关系。

3.@LocalStorageLink 装饰的变量与LocalStorage中给定属性建立双向同步关系。

4.通过windowStage.loadContent设置LocalStorage的属性,可以在多个页面共享该属性值。


http://www.niftyadmin.cn/n/5397698.html

相关文章

HarmonyOS | 状态管理(五) | @Observed装饰器和@ObjectLink装饰器

系列文章目录 1.HarmonyOS | 状态管理(一) | State装饰器 2.HarmonyOS | 状态管理(二) | Prop装饰器 3.HarmonyOS | 状态管理(三) | Link装饰器 4.HarmonyOS | 状态管理(四) | Provide和Consume装饰器 文章目录 系列文章目录前言一、ObjectLink和Observed类装饰器用于哪些场景…

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

【Redis | 第一篇】快速了解Redis

文章目录 1.快速了解Redis1.1简介1.2与其他key-value存储的不同处1.3Redis安装——Windows环境1.3.1下载redis1.3.2启动redis1.3.3进入redis客户端1.3.4修改配置 1.4Redis安装——Linux环境1.4.1安装命令1.4.2启动redis1.4.3进入redis客户端 1.5配置修改1.6小结 1.快速了解Redi…

EAP-TLS实验之Ubuntu20.04环境搭建配置(FreeRADIUS3.0)(四)

该篇主要介绍了利用配置ca.cnf、server.cnf、client.cnf在certs路径下生成证书文件&#xff08;非执行bootstrap脚本&#xff0c;网上也有很多直接通过openssl命令方式生成的文章&#xff09;&#xff0c;主要参考&#xff08;概括中心思想&#xff09;官方手册&#xff0c;以及…

docker-redis

[rootlocalhost ~]# docker pull redis 运行redis # -d&#xff1a;后台运行 # -p&#xff1a;端口 宿主机&#xff1a;容器 # --name启名 # --restartalways: 开机自启 # --privilegedtrue -v 数据卷 # redis-server /etc/redis/redis.conf redis去读容器内部redis.conf文件…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(5.详解List数据结构)

本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇&#xff5e;前4篇可移步(&#xffe3;∇&#xffe3;)/ 【Redis】深入理解 Redis 常用数据类型源码及底层实现&#xff08;1.结构与源码概述&#xff09;-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底…

matlab实现不同窗滤波器示例

1 汉明窗低通滤波器 &#xff1a; 在Matlab中使用汉明窗设计低通滤波器可以通过fir1函数实现。汉明窗通常用于设计滤波器&#xff0c;可以提供更突出的频率特性。 下面是一个示例代码&#xff0c;演示如何在Matlab中使用汉明窗设计低通滤波器&#xff1a; % 定义滤波器参数 fs …

Python调用ChatGPT API使用国内中转key 修改接口教程

大家好&#xff0c;我是淘小白~ 有的客户使用4.0的apikey ,直接使用官方直连的apikey消费很高&#xff0c;有一位客户一个月要消费2万&#xff0c;想使用4.0中转的apikey&#xff0c;使用中转的apikey 需要修改官方的openai库&#xff0c;下面具体说下。 1、首先确保安装的op…