十、应用级变量的状态变量 原创

亚鲁鲁666
发布于 2024-12-10 21:42
浏览
0收藏

UIAbility内状态-LocalStorage

LocalStorage是页面级的UI状态存储,是针对UIAbility的状态共享,一个UIAbility有多个页面,这些页面通过@Entry 装饰器接收到对应参数, 都可以通过 LocalStorage 共享数据。

LocalStorage 也可以在 同一个UIAbility 内,页面间共享状态。

十、应用级变量的状态变量-鸿蒙开发者社区

十、应用级变量的状态变量-鸿蒙开发者社区

装饰器@LocalStorageProp

:::success 用法

  • 创建​​LocalStorage​​ 实例:
  • ​const storage = new LocalStorage({ key: value })​
  • 设置给@Entry的参数:@Entry(storage)
  • 单向 **@LocalStorageProp('user')** 类似于@Prop,

:::

装饰器@LocalstorageLink

:::success 用法

  • 创建​​LocalStorage​​ 实例:
  • ​const storage = new LocalStorage({ key: value })​
  • 设置给@Entry的参数:@Entry(storage)
  • 双向 **@LocalStorageLink('user')** 类似于@Link,全局均可变

:::

在页面内使用示例

import { router } from '@kit.ArkUI'

export class UserInfo {
  name: string = ''
  age: number = 0
}

let userData: Record<string, UserInfo> = {
  'user': {
    name: 'jack',
    age: 18
  }
}
//1.创建 LocalStorage 实例
export const storage = new LocalStorage(userData)
//2.设置给@Entry参数
@Entry(storage)
@Component
struct Index {
  //3.单向
  @LocalStorageProp('user')
  user: UserInfo = {
    name: 'rose',
    age: 18
  }

  build() {
    Column({ space: 15 }) {
      Text('我是首页:')
        .fontSize(40)
      Text('name:' + this.user.name)
        .fontSize(40)
      Text('age:' + this.user.age)
        .fontSize(40)
      Button('去页面 2')
        .onClick(() => {
          router.pushUrl({ url: 'pages/day11/knowledges/LocalStorage01/LocalStorage02' })
        })

      Divider()
      ChildA()
      Divider()
      ChildB()
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

@Component
struct ChildA {
  //3.双向
  @LocalStorageLink('user')
  user: UserInfo = {
    name: '',
    age: 0
  }

  build() {
    Column() {
      Text('我是子组件A')
        .fontSize(30)
      Text(this.user.name)
        .onClick(() => {
          this.user.name += '!'
        })
    }
    .backgroundColor(Color.Orange)
    .width('100%')

  }
}

@Component
struct ChildB {
  @LocalStorageLink('user')
  user: UserInfo = {
    name: '',
    age: 0
  }

  build() {
    Column() {
      Text('我是子组件B')
        .fontSize(30)
      Text(this.user.age.toString())
        .onClick(() => {
          this.user.age++
        })
    }
    .backgroundColor(Color.Blue)
    .width('100%')

  }
}

:::success 如果要在其他页面使用,通过如下步骤实现:

  1. 页面 A 中导出 LocalStorage
  2. 其他需要使用的页面 导入 并使用 LocalStorage 即可

:::

import { storage, UserInfo } from './LocalStorage01';

@Entry(storage)
@Component
struct LocalStorage02 {
  @LocalStorageLink('user')
  user: UserInfo = {
    name: 'rose',
    age: 18
  }

  build() {
    Row() {
      Column() {
        Text('我是页面 2:')
          .fontSize(40)
        Text(JSON.stringify(this.user))
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.user.name = '罗伯特'
            this.user.age = 99
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

在页面间使用示例

如果想在​​UIAbility​​中共享某个localStorage,可以使用如下方式实现:

  • 可以在loadContent过程中直接传入创建的LocalStorage
  • 页面中通过 const storage = LocalStorage.GetShared() 得到实例
  • 通过 @Entry(storage) 传入页面,后续的使用和之前没有区别

// 传入 LocalStorage 进行初始化
export class FoodInfo {
  name: string = ''
  color: string = ''
}

let foodData: Record<string, FoodInfo> = {
    'food': {
      name: '西兰花',
      color: '黄绿色'
    }
  }

const foodStorage = new LocalStorage(foodData)


windowStage.loadContent('页面', foodStorage, (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) ?? '');
});

AppStorage:应用全局的UI状态存储

一个应用可能有若干个UIAbility,如果要在多个 UIAbility 共享数据,就可以使用 AppStorage

十、应用级变量的状态变量-鸿蒙开发者社区

十、应用级变量的状态变量-鸿蒙开发者社区

装饰器@StorageProp

:::success 用法:

  • 初始化: AppStorage.SetOrCreate(key,value)
  • 单向 @StorageProp('user') 组件内可变

:::

装饰器@StorageLink

:::success 用法:

  • 初始化: AppStorage.SetOrCreate(key,value)
  • 双向 @StorageLink('user') 全局均可变

:::

页面内使用示例

class User {
  name: string = ''
  age: number = 0
}

AppStorage.setOrCreate<User>('user', { name: 'jack', age: 18 })

@Entry
@Component
struct AppStorageUse01 {
  @StorageLink('user')
  user: User = {
    name: '',
    age: 0
  }

  build() {
    Column({ space: 15 }) {
      Text('我是父组件:')
        .fontSize(30)
      Text('name:' + this.user.name)
        .fontSize(30)
        .onClick(() => {
          this.user.name += '!'
        })
      Text('age:' + this.user.age)
        .fontSize(30)
        .onClick(() => {
          this.user.age++
        })


      Divider()
      ChildA()
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

@Component
struct ChildA {
  @StorageProp('user')
  user: User = {
    name: '',
    age: 0
  }

  build() {
    Column({ space: 15 }) {
      Text('子组件 A:')
        .fontColor(Color.White)
      Text('name:' + this.user.name)
        .fontColor(Color.White)
        .onClick(() => {
          this.user.name += '!'
        })

      Text('age:' + this.user.age)
        .fontColor(Color.White)
        .onClick(() => {
          this.user.age++
        })
    }
    .width('100%')
    .padding(10)
    .backgroundColor(Color.Orange)
  }
}

页面间使用示例

// 初始化 基本数据()
AppStorage.setOrCreate('message', '感觉自己萌萌哒')

@Entry
@Component
struct AppStorageUse03 {
  @StorageProp('message')
  message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Text('基本数据类型')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Text(this.message)
          .fontSize(20)
        Button('测试 Api')
          .onClick(() => {
            // 根据 key 获取对应的数据链接,后续通过 get 取值,set 赋值
            const messageLink: SubscribedAbstractProperty<string> = AppStorage.link('message')
            // 获取数据并打印
            AlertDialog.show({
              message: messageLink.get()
            })

            // 修改数据
            messageLink.set('萌你奶奶个腿~')
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

核心API:

// 以下写法 每次都需要通过 key 来指定对应的数据
// 获取数据
// AppStorage.get<ValueType>(key)

// 覆盖数据
// AppStorage.set<ValueType>(key,value)

// 获取数据的 link 后续通过 link 进行取值和修改
// const link: SubscribedAbstractProperty<ValueType> = AppStorage.link(key)
// 取值
// link.get()
// 覆盖
// link.set(value)

PersistentStorage

Environment

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2024-12-12 23:08:40修改
收藏
回复
举报
回复
    相关推荐