HarmonyOS Next应用级状态管理

HarmonyOS Next应用级状态管理

HarmonyOS Next数据持久化主要包括LocalStorage、AppStorage和PersistentStorage。LocalStorage是页面级的UI状态存储,通过@Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。PersistentStorage是应用程序中的可选单例对象。此对象的作用是持久化存储选定的AppStorage属性,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。

嘿哟,上面讲了一箩筐没啥用的东西 。总而言之,言而总之,这三个玩意儿在不一样的地界儿使用:

  • LocalStorage:页面内数据共享(同一页面的各个组件间共享数据,存储在内存中)
  • AppStorage:整个应用数据共享(存储在内存中)
  • PersistentStorage:利用AppStorage实现持久化数据共享(应用关闭再启动数据状态不丢失,存储在磁盘中)

LocalStorage

import { router } from '@kit.ArkUI';

let para: Record<string, number> = { 'count': 0 };
let storage: LocalStorage = new LocalStorage(para);

// 子组件
@Component
struct SonComp {
  @LocalStorageLink('count') count: number = 0;

  build() {
    Column() {
      Text(`子组件:${this.count}`)
      Row({ space: 8 }) {
        Button('+1').onClick((event: ClickEvent) => {
          this.count += 1
        })
        Button('-1').onClick((event: ClickEvent) => {
          this.count -= 1
        })
      }

      GrandSonComp()
    }
    .backgroundColor(Color.Orange)
    .padding(12)
  }
}

// 孙组件
@Component
struct GrandSonComp {
  @LocalStorageProp('count') count: number = 0;

  build() {
    Column() {
      Text(`孙组件:${this.count}`)
      Row({ space: 8 }) {
        Button('+1').onClick((event: ClickEvent) => {
          this.count += 1
        })
        Button('-1').onClick((event: ClickEvent) => {
          this.count -= 1
        })
      }
    }
    .backgroundColor(Color.Pink)
    .padding(12)
  }
}

@Entry(storage)
@Component
struct Index {
  @LocalStorageLink('count') count: number = 0

  build() {
    Column({ space: 12 }) {
      Column() {
        Text(`父组件:${this.count}`)
        Row({ space: 8 }) {
          Button('+1').onClick((event: ClickEvent) => {
            this.count += 1
          })
          Button('-1').onClick((event: ClickEvent) => {
            this.count -= 1
          })
        }
      }
      SonComp()
    }
    .backgroundColor(Color.Grey)
    .width('100%')
  }
}

瞅瞅这效果,嘎嘎板正:
LocalStorageGIF效果图

AppStorage

// 根页面:RootAppStoragePage,子页面1:AppStoragePage1,子页面2:AppStoragePage2
// RootAppStoragePage
import { router } from '@kit.ArkUI';

AppStorage.setOrCreate('count', 0)

@Entry
@Component
struct RootAppStoragePage {
  @StorageLink('count') count: number = 0;

  build() {
    Column({space:12}) {
      Text(`RootAppStoragePage:${this.count}`)
      Row({ space: 8 }) {
        Button('+1').onClick((event: ClickEvent) => {
          this.count += 1
        })
        Button('-1').onClick((event: ClickEvent) => {
          this.count -= 1
        })
      }

      Row({space:12}) {
        Button('AppStoragePage1').onClick((event: ClickEvent) => {
          router.pushUrl({ url: 'pages/appStorage/AppStoragePage1' })
        })
        Button('AppStoragePage2').onClick((event: ClickEvent) => {
          router.pushUrl({ url: 'pages/appStorage/AppStoragePage2' })
        })
      }
    }
    .backgroundColor(Color.Orange)
    .padding(12)
  }
}

// AppStoragePage1
@Entry
@Component
struct AppStoragePage1 {
  @StorageLink('count') count: number = 0;

  build() {
    Column() {
      Text(`AppStoragePage1:${this.count}`)
      Row({ space: 8 }) {
        Button('+1').onClick((event: ClickEvent) => {
          this.count += 1
        })
        Button('-1').onClick((event: ClickEvent) => {
          this.count -= 1
        })
      }
    }
    .backgroundColor(Color.Orange)
    .padding(12)
  }
}

// AppStoragePage2
@Entry
@Component
struct AppStoragePage2 {
  @StorageProp('count') count: number = 0;

  build() {
    Column() {
      Text(`AppStoragePage2:${this.count}`)
      Row({ space: 8 }) {
        Button('+1').onClick((event: ClickEvent) => {
          this.count += 1
        })
        Button('-1').onClick((event: ClickEvent) => {
          this.count -= 1
        })
      }
    }
    .backgroundColor(Color.Orange)
    .padding(12)
  }
}

不出意外,页面之间打通了:
AppStorageGIF效果图

PersistentStorage

PersistentStorage.persistProp('count', 0)

@Entry
@Component
struct PsPage1 {
  @StorageLink('count') count: number = 0;

  build() {
    Column() {
      Text(`PsPage1:${this.count}`)
      Row({ space: 8 }) {
        Button('+1').onClick((event: ClickEvent) => {
          this.count += 1
        })
        Button('-1').onClick((event: ClickEvent) => {
          this.count -= 1
        })
      }
    }
    .backgroundColor(Color.Orange)
    .padding(12)
  }
}

强扭的瓜不甜,这玩意可没法在预览器看效果,找个虚拟机你就看吧,保证一看一个不吱声:
PersistentStorageGIF效果图

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lewiis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值