首页 > 编程笔记 > 通用技能 阅读:16

ArkTS LocalStorage用法详解(附带实例)

装饰器仅能在页面内即一个组件树上,共享状态变量。如果开发者要实现应用级的或者多个页面的状态数据共享,就需要用到应用级别的状态管理的概念。

ArkTS 拥有多种应用状态的管理能力,包括:
LocalStorage 是页面级的 UI 状态存储,通过 @Entry 装饰器接收的参数可以在页面内共享同一个 LocalStorage 实例。

LocalStorage 支持 UIAbility 实例内多个页面间的状态共享。其具有如下特点:

ArkTS @LocalStorageProp装饰器(单向同步)

我们可以通过以下几个步骤来创将一个简单的单向同步实例。

1) 使用构造函数创建 LocalStorage 实例 storage,通过 setOrCreate('key',value) 来设置存储的 valu(e值),同时通过 key 来读取存储的值,代码如下:
let storage = new LocalStorage();
storage.setOrCreate('PropA',47);

2) 使用 @Entry 装饰器将 storage 添加到顶层组件中,以“@LocalStorageProp(key) xxx:类型=值”的形式读取存储的值,其中 xxx 是自定义的变量名称,代码如下:
@Entry(storage)
@Component
struct Demo1 {
  // 与 LocalStorage 中的 'PropA' 建立双向绑定
  @LocalStorageLink('PropA') storageLinkOne: number = 1;

  build() {
    Column({ space: 15 }) {
      Button(`Parent from LocalStorage ${this.storageLinkOne}`)
        .onClick(() => this.storageLinkOne += 1);

      // 子组件 Demo2 自动获得同一 LocalStorage 实例的访问权限
      Demo2();
    }
  }
}

3) 创建一个组件 Demo2() 用作参考,代码如下:
@Component
export struct Demo2 {
  // 单向绑定:仅读取,不受 Demo1 影响
  @LocalStorageProp('PropA') storProp2: number = 2;

  build() {
    Column({ space: 15 }) {
      Text(`Parent from LocalStorage ${this.storProp2}`);
    }
  }
}

@LocalStorageProp 装饰器(单向同步)效果如下图所示:


图 1 @LocalStorageProp 装饰器(单向同步)

通过效果图可以看到,父子组件均可以读取到存储的数据,但是当父组件的数据被修改时,子组件的数据并没有发生改变,或者说通过 storage.setOrCreate 存储的数据并不会发生改变。

注意,需要将 storage 添加到顶层组件 @Entry(storage) 中,否则无法读取到存储的数据。

ArkTS @LocalStorageLink装饰器(双向同步)

双向同步的案例可直接使用 @LocalStorageProp 装饰器中的案例,只需将对应的 @LocalStorageProp 装饰器改为 @LocalStorageLink 即可。同时为了展示双向同步的效果,需要对子组件进行简单的修改。

子组件内容如下:
@Component
struct Demo2 {
  // 双向绑定
  @LocalStorageLink('PropA') storageLinkTwo: number = 1;

  build() {
    Button(`Child from LocalStorage ${this.storageLinkTwo}`)
      // 修改会同步到 LocalStorage 与父组件
      .onClick(() => this.storageLinkTwo += 1);
  }
}

完整代码如下:
// 创建并初始化 LocalStorage
let storage = new LocalStorage();
storage.setOrCreate('PropA', 47);

@Component
struct Demo2 {
  // 双向绑定
  @LocalStorageLink('PropA') storageLinkTwo: number = 1;

  build() {
    Button(`Child from LocalStorage ${this.storageLinkTwo}`)
      // 修改会同步到 LocalStorage 与父组件
      .onClick(() => this.storageLinkTwo += 1);
  }
}

@Entry(storage)
@Component
struct Demo1 {
  // 双向绑定
  @LocalStorageLink('PropA') storageLinkOne: number = 1;

  build() {
    Column({ space: 15 }) {
      Button(`Parent from LocalStorage ${this.storageLinkOne}`)
        .onClick(() => this.storageLinkOne += 1);

      // 子组件自动获得对同一 LocalStorage 实例的访问
      Demo2();
    }
  }
}
此时运行代码,会发现无论是子组件的按钮,还是父组件的按钮,在触发时均会同步修改数据,也就是说 @LocalStorageLink 装饰器是可以和存储的数据进行双向同步的。

相关文章