鸿蒙:PersistenceV2页面间持久化存储数据

前言

PersistenceV2是V2状态管理,本博客展示.connect方法存储数据,用于页面间的持久化数据共享,需要配合使用@ObservedV2@Trace使用。

参考文档

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-persistencev2https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-persistencev2

核心思路

  1. 将@ObservedV2@Trace修饰的类,通过PersistenceV2.connect绑定到具体的实例上。
  2. 只要修改这个实例的值,UI会更新,持久化也会更新。

运行效果

任一页面点击姓名或年龄,即可全部页面都修改

并且重新运行,依然和最后一次的数据一样,保持不变。

完整代码

1、Index01.ets

复制代码
import { student, Student, student02, student03 } from './StudentClass';


@Entry
@ComponentV2
struct Index01 {
  @Builder
  studentBuilder(title: string, student: Student) {
    Column({ space: 10 }) {
      Text(title)
      Column({ space: 20 }) {
        Button(student.name)
          .fontColor(Color.White)

          .fontSize(30)
          .onClick(() => {
            const name = ["老王", "张三", "王五", "赵六", "小王", "小张",]
            student.name = name[Math.floor(Math.random() * name.length)]

          })
        Button(student.age?.toString())
          .fontSize(30)
          .fontColor(Color.White)
          .onClick(() => {
            student.age = student.age! + 1
          })
      }
      .padding(20)
      .width("100%")

      .backgroundColor(Color.Black)
    }
  }

  build() {
    Column({ space: 20 }) {
      Text("PersistenceV2 使用示例")
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .padding({ bottom: 60 })
      Button(" 01点击跳转到下一页 ")
        .onClick(() => {
          this.getUIContext().getRouter().pushUrl({ url: "pages/Index02" })
        })
      this.studentBuilder("学生一", student,)
      this.studentBuilder("学生一", student02,)
      this.studentBuilder("学生一", student03,)


    }
    .justifyContent(FlexAlign.Center)
    .height("100%")
    .width("100%")
  }
}

2、Indext02.ets

复制代码
import { student, Student, student02, student03 } from './StudentClass';


@Entry
@ComponentV2
struct Index02 {
  @Builder
  studentBuilder(title: string, student: Student) {
    Column({ space: 10 }) {
      Text(title)
      Column({ space: 20 }) {
        Button(student.name)
          .fontColor(Color.White)

          .fontSize(30)
          .onClick(() => {
            const name = ["老王", "张三", "王五", "赵六", "小王", "小张",]
            student.name = name[Math.floor(Math.random() * name.length)]

          })
        Button(student.age?.toString())
          .fontSize(30)
          .fontColor(Color.White)
          .onClick(() => {
            student.age = student.age! + 1
          })
      }
      .padding(20)
      .width("100%")

      .backgroundColor(Color.Black)
    }
  }

  build() {
    Column({ space: 20 }) {
      Button(" 02 ")
        .onClick(() => {
          this.getUIContext().getRouter().pushUrl({ url: "pages/Index03" })
        })
      this.studentBuilder("学生一", student,)
      this.studentBuilder("学生一", student02,)
      this.studentBuilder("学生一", student03,)


    }
    .justifyContent(FlexAlign.Center)
    .height("100%")
    .width("100%")
  }
}

3、Index03.ets

复制代码
import { student, Student, student02, student03 } from './StudentClass';


@Entry
@ComponentV2
struct Index03 {
  @Builder
  studentBuilder(title: string, student: Student) {
    Column({ space: 10 }) {
      Text(title)
      Column({ space: 20 }) {
        Button(student.name)
          .fontColor(Color.White)

          .fontSize(30)
          .onClick(() => {
            const name = ["老王", "张三", "王五", "赵六", "小王", "小张",]
            student.name = name[Math.floor(Math.random() * name.length)]

          })
        Button(student.age?.toString())
          .fontSize(30)
          .fontColor(Color.White)
          .onClick(() => {
            student.age = student.age! + 1
          })
      }
      .padding(20)
      .width("100%")

      .backgroundColor(Color.Black)
    }
  }

  build() {
    Column({ space: 20 }) {
      Button(" 03 ")
        .onClick(() => {
          this.getUIContext().getRouter().pushUrl({ url: "pages/Index04" })
        })
      this.studentBuilder("学生一", student,)
      this.studentBuilder("学生一", student02,)
      this.studentBuilder("学生一", student03,)


    }
    .justifyContent(FlexAlign.Center)
    .height("100%")
    .width("100%")
  }
}

4、StudentClass.ets

复制代码
import { PersistenceV2 } from "@kit.ArkUI";

@ObservedV2
export class Student {
  @Trace
  name?: string;
  @Trace
  age?: number;

  constructor() {
    this.name = "李华";
    this.age = 21;
  }
}

export const student: Student = PersistenceV2.connect(Student, "student01", () => new Student())!;

export const student02: Student = PersistenceV2.connect(Student, "student02", () => new Student())!;

export const student03: Student = PersistenceV2.connect(Student, "student03", () => new Student())!;

觉得有用可以点赞或收藏

相关推荐
Utopia^1 天前
鸿蒙flutter第三方库适配 - 联系人备份工具
flutter·华为·harmonyos
音视频牛哥1 天前
国产化最后一公里:鸿蒙 NEXT 低延迟音视频技术方案破局之路
音视频·harmonyos·鸿蒙next·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器
zhgjx-dengkewen1 天前
eNSP实验:配置NAT Server
服务器·网络·华为·智能路由器
HwJack201 天前
HarmonyOS UI 开发中eventHub用标准化 OHMUrl 拿捏集成态 HSP
华为·harmonyos
音视频牛哥1 天前
鸿蒙 NEXT 行业视频方案选型:消费级播放器、自研、SmartMediaKit,哪条路走得通?
华为·harmonyos·大牛直播sdk·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器·鸿蒙 rtmp播放器
Geek_Vision1 天前
鸿蒙原生APP接入小程序运行能力:数字园区场景实战复盘
微信小程序·harmonyos
音视频牛哥1 天前
鸿蒙 NEXT 下 RTSP/RTMP 播放器如何调用录像与快照?
华为·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器·鸿蒙rtsp rtmp流录像
音视频牛哥1 天前
鸿蒙 NEXT 下 RTSP/RTMP 播放器如何实时调节音量、亮度、对比度与饱和度?
harmonyos·音视频开发·直播
音视频牛哥1 天前
鸿蒙 NEXT RTSP/RTMP 播放器如何回调 RGB 数据并实现 AI 视觉算法分析
人工智能·算法·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器
音视频牛哥1 天前
HarmonyOS鸿蒙 Next 中如何实现低延迟 RTSP 流媒体播放?
华为·harmonyos·鸿蒙next·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器