鸿蒙应用开发页面间应用内的状态管理之—LocalStorage

LocalStorage是页面级的UI状态存储,通过@Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内,在页面间共享状态。

本文仅介绍LocalStorage使用场景和相关的装饰器:@LocalStorageProp和@LocalStorageLink。

说明

  • 本模块从API version 9开始支持。

概述

LocalStorage是ArkTS为构建页面级别状态变量提供存储的内存内"数据库"。

  • 应用程序可以创建多个LocalStorage实例,LocalStorage实例可以在页面内共享,也可以通过GetShared接口,实现跨页面、UIAbility实例内共享。
  • 组件树的根节点,即被@Entry装饰的@Component,可以被分配一个LocalStorage实例,此组件的所有子组件实例将自动获得对该LocalStorage实例的访问权限;
  • 被@Component装饰的组件最多可以访问一个LocalStorage实例和AppStorage,未被@Entry装饰的组件不可被独立分配LocalStorage实例,只能接受父组件通过@Entry传递来的LocalStorage实例。一个LocalStorage实例在组件树上可以被分配给多个组件。
  • LocalStorage中的所有属性都是可变的。

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

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

  • @LocalStorageProp:@LocalStorageProp装饰的变量和与LocalStorage中给定属性建立单向同步关系。
  • @LocalStorageLink:@LocalStorageLink装饰的变量和在@Component中创建与LocalStorage中给定属性建立双向同步关系。
js 复制代码
import { TodoListViewModel } from '../viewModel/TodoListViewModel'
import {TodoListItem} from '../common/components/TodoListItem'
import TodoListConstants from '../common/constants/TodoListConstants'
import HarmonyStoreUtils from '../uitils/HarmonyStoreUtils'
let storage:LocalStorage = new LocalStorage({'showSwitchTips2':false});
@Entry(storage)
@Component
export struct TodoList{
  // @LocalStorageLink变量装饰器与LocalStorage中的'PropA'属性建立双向绑定
  @LocalStorageLink('PropA') storLink2: number = 1;
  @LocalStorageLink('PropB') storLinkB: boolean = false;
  @State dataSource:any[] =[]
  build(){
    Column({space:16}){
      Text(`待办${this.storLink2}PropB=${this.storLinkB}`)
      .fontSize(16)
      .fontStyle(FontStyle.Normal)
      .fontWeight(FontWeight.Bold)
      .margin({bottom:20})
      .textAlign(TextAlign.Start)
      .width(TodoListConstants.TITLE_WIDTH)
        .onClick(()=>{
          // HarmonyStoreUtils.testLocalStorage()
          // this.printStorageKeys();
          // // this.showSwitchTipsLink = true;
          // let linkShowSwitchTips2=storage.link('showSwitchTips2')
          // linkShowSwitchTips2.set(true)
          // console.log(`==========showSwitchTipsLink=${this.showSwitchTipsLink}`)
          // HarmonyStoreUtils.testLocalStorage()
          // this.printStorageKeys();
          this.storLink2 += 1
          this.storLinkB = !this.storLinkB
        })


        ForEach(this.dataSource,(item,index)=>{
          TodoListItem({index:item.index+1,name:item.name})
        },item =>JSON.stringify(item))
        Child()
    }.justifyContent(FlexAlign.Start)
    .width(TodoListConstants.FULL_SCREEN_WIDTH)
    .height(TodoListConstants.FULL_SCREEN_WIDTH)

  }

  aboutToAppear(){
    this.dataSource = new TodoListViewModel().loadData()
  }

  printStorageKeys(){
    let keys:IterableIterator<string>= storage.keys();
    console.log(">>>>>>Component LocalStorage>>>>>>");
    for (let key of keys) {
      let showSwitchTips = storage.get(key)
      console.log(`Component>>>>>>${key}:${showSwitchTips}`);
    }
    console.log(`------鸿蒙迭代器的遍历-----`);
    // for (const  [name,value] of keys) { //for IterableIterator<[string, string]>
    //   console.log(`鸿蒙迭代器的遍历>>>>>>name=${name},value=${value}`);
    //
    // }
    for (const  [name] of keys) {
      console.log(`鸿蒙迭代器的遍历>>>>>>key=${name}`);

    }
    console.log(`------鸿蒙迭代器的遍历-end----`);
  }
}

@Component
struct Child {
  // @LocalStorageLink变量装饰器与LocalStorage中的'PropA'属性建立双向绑定
  @LocalStorageLink('PropA') storLink2: number = 1;
  @LocalStorageLink('PropB') storLink2B: boolean = false;

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

效果演示:

2.页面间LocalStorage数据共享实例

  1. EntryAbility中设置要共享的数据
js 复制代码
storage:LocalStorage;
para:Record<string, number> = { 'showNumber': 3 };

windowStage.loadContent('pages/MainPage',this.storage, (err, data) => {
  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. Data: %{public}s', JSON.stringify(data) ?? '');
});
  1. 各page通过LocalStorage.GetShared()获取要共享的LocalStorage
  2. 通过第2步获得的storage对象获取存储在LocalStorage中的字段。

这种方法在处理UI界面恢复时特别有用

运行效果:

相关推荐
高一学习c++会秃头吗21 小时前
鸿蒙适应式布局和响应式布局零基础
harmonyos
HwJack201 天前
HarmonyOS应用开发中EmbeddedUIExtensionAbility:跨进程 UI 嵌入的“幕后导演“
ui·华为·harmonyos
早點睡3901 天前
ReactNative项目鸿蒙化三方库集成实战:react-native-calendars(日历展开和日程模块存在兼容性问题)
react native·react.js·harmonyos
云和数据.ChenGuang1 天前
鸿蒙 + ChromaDB:端侧向量检索,打造全场景智能应用新范式
华为·harmonyos·鸿蒙
前端不太难1 天前
AI + 鸿蒙游戏,会不会是下一个爆点?
人工智能·游戏·harmonyos
Gorit1 天前
如何使用 Flutter 开发 HarmonyOS 应用
flutter·华为·harmonyos
键盘鼓手苏苏2 天前
Flutter 三方库 p2plib 的鸿蒙化适配指南 - 实现高性能的端到端(P2P)加密通讯、支持分布式节点发现与去中心化数据流传输实战
flutter·harmonyos·鸿蒙·openharmony
加农炮手Jinx2 天前
Flutter for OpenHarmony:postgrest 直接访问 PostgreSQL 数据库的 RESTful 客户端(Supabase 核心驱动) 深度解析与鸿蒙适配指南
数据库·flutter·华为·postgresql·restful·harmonyos·鸿蒙
加农炮手Jinx2 天前
Flutter 组件 heart 适配鸿蒙 HarmonyOS 实战:分布式心跳监控,构建全场景保活检测与链路哨兵架构
flutter·harmonyos·鸿蒙·openharmony
钛态2 天前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos