赞
踩
LocalStorage是页面级的UI状态存储,通过@Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内,在页面间共享状态。
内存--非持久化--非全应用
LocalStorage是ArkTS为构建页面级别状态变量提供存储的内存内“数据库”。
应用程序决定LocalStorage对象的生命周期。当应用释放最后一个指向LocalStorage的引用时,比如销毁最后一个自定义组件,LocalStorage将被JS Engine垃圾回收。
LocalStorage提供了两个装饰器:
- class Person {
- name?: string
- age?: number
- }
-
- const storage: LocalStorage = new LocalStorage({
- user: { name: "lili", age: 18 }
- })
-
- @Entry(storage)
- @Component
- struct Index {
- @LocalStorageProp("user")
- user: Person = { name: "Tom", age: 20 }
-
- build() {
- Column({ space: 10 }) {
- Text(this.user.name + "----" + this.user.age)
- Button("修改age").onClick(() => {
- this.user.age++
- })
- ChildA()
- ChildB()
- }
- .width('100%')
- .height('100%')
- }
- }
-
- @Component
- struct ChildA {
- @LocalStorageProp("user")
- user: Person = { name: "Tom", age: 20 }
-
- build() {
- Column({ space: 10 }) {
- Text(this.user.name + "----" + this.user.age)
- .fontColor(Color.White)
- Button("修改age").onClick(() => {
- //不会同步
- this.user.age++
- })
- }
- .width('100%')
- .height(100)
- .backgroundColor(Color.Blue)
- }
- }
-
-
- @Component
- struct ChildB {
- @LocalStorageLink("user")
- user: Person = { name: "Tom", age: 20 }
-
- build() {
- Column({ space: 10 }) {
- Text(this.user.name + "----" + this.user.age)
- .fontColor(Color.White)
- Button("修改age").onClick(() => {
- //会同步
- this.user.age++
- })
- }
- .width('100%')
- .height(100)
- .backgroundColor(Color.Brown)
- }
- }

页面间共享LocalStorage实例,请确保在模拟器上进行测试以验证功能是否正常工作
修改 EntryAbility.ts
- import UIAbility from '@ohos.app.ability.UIAbility';
- import hilog from '@ohos.hilog';
- import window from '@ohos.window';
-
- export default class EntryAbility extends UIAbility {
- onCreate(want, launchParam) {
- hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
- }
-
- onDestroy() {
- hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
- }
-
- storage: LocalStorage = new LocalStorage({
- user: {
- name: "lili", age: 18
- }
- })
-
- onWindowStageCreate(windowStage: window.WindowStage) {
- // Main window is created, set main page for this ability
- hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
-
- windowStage.loadContent('pages/Index', 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) ?? '');
- });
- }
-
- onWindowStageDestroy() {
- // Main window is destroyed, release UI related resources
- hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
- }
-
- onForeground() {
- // Ability has brought to foreground
- hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
- }
-
- onBackground() {
- // Ability has back to background
- hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
- }
- }

新建 models/index.ets
- export class Person {
- name?: string
- age?: number
- }
修改 pages/Index.ets
- import router from '@ohos.router'
- import { Person } from '../models'
-
- const storage = LocalStorage.GetShared()
-
-
- @Entry(storage)
- @Component
- struct Index {
- @LocalStorageLink("user")
- user: Person = { name: "Tom", age: 28 }
-
- build() {
- Column() {
- Text(`${this.user.name}--${this.user.age}`)
- Button("修改age").onClick(() => {
- this.user.age++
- })
-
- Button("去otherPage").onClick(() => {
- router.pushUrl({
- url: "pages/OtherPage"
- })
- })
-
- }
- .width('100%')
- .height('100%')
- }
- }

新建页面 OtherPage.ets
- import router from '@ohos.router'
- import { Person } from '../models'
-
- const storage = LocalStorage.GetShared()
-
- @Entry(storage)
- @Component
- struct OtherPage {
- @LocalStorageLink("user")
- user: Person = { name: "lisa", age: 38 }
-
- build() {
- Row() {
- Column() {
- Text(`${this.user.name}--${this.user.age}`)
- Button("修改age").onClick(() => {
- this.user.age++
- })
- Button("返回").onClick(() => {
- router.back()
- })
- }
- .width('100%')
- }
- .height('100%')
- }
- }

AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。
内存--非持久化--应用退出再次启动后 数据消失
AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这些状态数据在应用级别都是可访问的。AppStorage将在应用运行过程保留其属性。属性通过唯一的键字符串值访问。
AppStorage可以和UI组件同步,且可以在应用业务逻辑中被访问。
AppStorage中的属性可以被双向同步,数据可以是存在于本地或远程设备上,并具有不同的功能,比如数据持久化(详见PersistentStorage)。这些数据是通过业务逻辑中实现,与UI解耦,如果希望这些数据在UI中使用,需要用到@StorageProp和@StorageLink。
修改 pages/Index.ets
- import router from '@ohos.router'
- import { Person } from '../models'
-
- AppStorage.SetOrCreate<Person>("user", { name: "lili", age: 18 })
-
- @Entry
- @Component
- struct Index {
- @StorageLink("user")
- user: Person = { name: "Tom", age: 20 }
-
- build() {
- Column({ space: 10 }) {
- Text(this.user.name + "----" + this.user.age)
- Button("修改age").onClick(() => {
- this.user.age++
- })
- Button("跳转到TwoPage").onClick(() => {
- router.pushUrl({
- url: "pages/TwoPage"
- })
- })
- }
- .width('100%')
- .height('100%')
- }
- }

添加页面 TwoPage.ets
- import router from '@ohos.router'
- import { Person } from '../models'
-
- @Entry
- @Component
- struct TwoPage {
- @StorageLink("user")
- user: Person = { name: "Tom", age: 20 }
-
- build() {
- Column({ space: 10 }) {
- Text(this.user.name + "----" + this.user.age)
- Button("修改age").onClick(() => {
- this.user.age++
- })
- Button("返回Index页面").onClick(() => {
- router.back()
- })
-
- }.width('100%')
- .height('100%')
- }
- }

修改 pages/Index.ets
- import promptAction from '@ohos.promptAction'
- import { Person } from '../models'
-
- AppStorage.SetOrCreate<Person>("user", { name: "lili", age: 18 })
-
- @Entry
- @Component
- struct Index {
- @StorageLink("user")
- user: Person = { name: "Tom", age: 20 }
-
- build() {
- Column({ space: 10 }) {
- Text(this.user.name + "----" + this.user.age)
- Button("修改age").onClick(() => {
- this.user.age++
- })
-
- Button("获取user信息").onClick(() => {
- const user = AppStorage.Get<Person>("user");
- console.info(user.name)
- promptAction.showToast({
- message: "user.name:" + user.name + " user.age:" + user.age,
- bottom: 20
- })
- })
- Button("覆盖user信息").onClick(() => {
- AppStorage.Set<Person>("user", { name: "Tom", age: 28 });
- })
-
- Button("通过 Link 覆盖user信息").onClick(() => {
- const userLink: SubscribedAbstractProperty<Person> = AppStorage.Link("user");
- userLink.set({ name: "Jack", age: 38 })
- })
-
- }
- .width('100%')
- .height('100%')
- }
- }

写入磁盘--持久化状态--应用退出 数据不消失
PersistentStorage将选定的AppStorage属性保留在设备磁盘上。应用程序通过API,以决定哪些AppStorage属性应借助PersistentStorage持久化。UI和业务逻辑不直接访问PersistentStorage中的属性,所有属性访问都是对AppStorage的访问,AppStorage中的更改会自动同步到PersistentStorage。
PersistentStorage允许的类型和值有:
PersistentStorage不允许的类型和值有:
PersistentStorage的持久化变量最好是小于2kb的数据。
PersistentStorage只能在UI页面内使用,否则将无法持久化数据。
static PersistProp<T>(key: string, defaultValue: T): void
将AppStorage中key对应的属性持久化到文件中。该接口的调用通常在访问AppStorage之前。
static DeleteProp(key: string): void
将key对应的属性从PersistentStorage删除,后续AppStorage的操作,对PersistentStorage不会再有影响。
static PersistProps(properties: {key: string, defaultValue: any;}[]): void
行为和PersistProp类似,不同在于可以一次性持久化多个数据,适合在应用启动的时候初始化。
static Keys(): Array<string>
返回所有持久化属性的key的数组。
- PersistentStorage.PersistProp("num", 100)
-
- @Entry
- @Component
- struct Index {
- @StorageLink("num")
- num: number = 0
-
- build() {
- Column({ space: 10 }) {
- Text(`${this.num}`)
- Button("修改age").onClick(() => {
- this.num++
- })
- }
- .width('100%')
- .height('100%')
- }
- }

修改 pages/Index.ets
- import router from '@ohos.router'
- import { Person } from '../models'
-
-
- PersistentStorage.PersistProp("user", '{"name":"lili","age":18}')
-
- @Entry
- @Component
- struct Index {
- @StorageLink("user")
- @Watch("update")
- userData: string = ""
- @State user: Person = JSON.parse(this.userData)
-
- update() {
- this.user = JSON.parse(this.userData)
- }
-
- build() {
- Column() {
- Text(this.user.name + "----" + this.user.age)
- Button("修改age").onClick(() => {
- this.user.age++
- AppStorage.Set<string>("user", JSON.stringify(this.user))
- })
- Button("去其他页面").onClick(() => {
- router.pushUrl({
- url: "pages/OtherPage"
- })
- })
-
- Button("获取").onClick(() => {
- const user = AppStorage.Get<string>("user")
- console.log(user)
- })
-
- Button("AppStorage Set 修改1").onClick(() => {
- AppStorage.Set<string>("user", JSON.stringify({ "name": "lisa", "age": 20 }))
- })
-
- Button("AppStorage Link 修改2").onClick(() => {
- const userLink: SubscribedAbstractProperty<string> = AppStorage.Link("user")
- userLink.set(JSON.stringify({ "name": "jack", "age": 20 }))
- })
- }
- .width("100%")
- .height("100%")
- }
- }
-
-

添加页面 OtherPage.ets
- import router from '@ohos.router'
- import { Person } from '../models'
-
-
- @Entry
- @Component
- struct OtherPage {
- @StorageLink("user")
- userData: string = ""
- @State user: Person = JSON.parse(this.userData)
-
- build() {
- Column() {
- Text(this.user.name + "----" + this.user.age)
- Button("修改age").onClick(() => {
- this.user.age++
- AppStorage.Set<string>("user", JSON.stringify(this.user))
- })
- Button("返回Index页面").onClick(() => {
- router.back()
- })
- }
- .width("100%")
- .height("100%")
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。