HarmonyOS鸿蒙Next中V1往V2迁移,怎么去掉@StorageLink和@StorageProp?

HarmonyOS鸿蒙Next中V1往V2迁移,怎么去掉@StorageLink@StorageProp@StorageLink@StorageProp配合@AppStorage在V1中很好用,基本就是图方便就用了。

但在迁移时,是个让人头疼的存在,怎么能尽量无痛迁移?

3 回复

《流心播放器》开源鸿蒙项目,目前在从V1往V2迁移。

我们目前只是在做准备工作,不会使用V1和V2的混用(很麻烦,一堆坑),并且我们是单ability的应用,用不上AppStorage的高级特性,所以没有选择使用AppStorageV2。

最终,我们选择使用 makeObserved接口:将非观察数据变为可观察数据,它完全解耦于V1和V2,@Component@ComponentV2都可以使用,完美渡过V1往V2迁移的阵痛期。


首先,创建一个工具类,用makeObserved包装成全局的可观测变量,其他文件要用,直接import就好了。

旧的this.topSafeHeight,直接换成SafeHeight.topSafeHeight,就能用了。

至于@StorageLink@StorageProp,直接删掉就行了,几乎是无痛迁移。

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

class SafeHeightUtil {
  public topSafeHeight: number = 0
  public bottomSafeHeight: number = 0
}

export const SafeHeight = UIUtils.makeObserved(new SafeHeightUtil());

更多关于HarmonyOS鸿蒙Next中V1往V2迁移,怎么去掉@StorageLink和@StorageProp?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,@StorageLink@StorageProp已由@LocalStorageLink@LocalStorageProp替代。迁移时,直接替换注解名称即可。

在HarmonyOS Next中,@StorageLink@StorageProp已被新的状态管理机制取代。要完成从V1到V2的迁移,核心是使用新的@State@Provide/@Consume以及应用级状态管理方案来重构。

主要迁移路径如下:

  1. 替代@AppStorage + @StorageLink/@StorageProp的方案:

    • 对于组件内部的状态共享:直接使用@State@Provide(在父组件)和@Consume(在子组件)进行跨组件层级的状态共享与响应式更新。这替代了原先通过@AppStorage进行全局绑定的模式。
    • 对于真正的全局应用状态:推荐使用**AppStorage全局对象**(这是一个新的、独立的API,并非V1中的装饰器用法)或**LocalStorage** 来管理应用级持久化状态。你可以在应用入口初始化状态,然后在任何UI组件中通过AppStorage.get()AppStorage.set()LocalStorage的API进行访问和修改,并配合@State装饰局部变量来触发UI更新。
  2. 迁移步骤建议:

    • 步骤一:识别作用域。分析每个@StorageLink@StorageProp变量是用于组件树共享,还是真正的全局设置/用户数据。
    • 步骤二:组件树共享迁移。将用于父子或兄弟组件通信的变量改为@Provide@Consume装饰器,或通过@State配合参数传递。
    • 步骤三:全局状态迁移。将用于全局访问的变量移至AppStorageLocalStorage中进行管理。在组件中,使用let globalVar = AppStorage.get('key')获取值,并用@State装饰一个本地变量来关联该值,以响应变化。
    • 步骤四:移除旧装饰器。完成上述重构后,即可安全删除@StorageLink@StorageProp@AppStorage的导入与使用。

示例对比:

  • V1 (HarmonyOS 3.x) 方式:

    // 全局定义
    @AppStorage('selectedTheme') selectedTheme: string = 'light';
    
    // 组件中使用
    @StorageLink('selectedTheme') theme: string = 'light';
    
  • V2 (HarmonyOS Next) 迁移后:

    // 在应用入口或状态管理模块初始化全局状态
    AppStorage.setOrCreate('selectedTheme', 'light');
    
    // 在组件中使用
    @State theme: string = AppStorage.get('selectedTheme');
    
    // 需要更新时
    this.theme = 'dark';
    AppStorage.set('selectedTheme', this.theme);
    

通过以上方式,可以系统性地将V1中基于装饰器的全局状态管理迁移到V2更灵活、模块化的状态管理方案中。

回到顶部