HarmonyOS鸿蒙Next中V1往V2迁移,怎么去掉@StorageLink和@StorageProp?
HarmonyOS鸿蒙Next中V1往V2迁移,怎么去掉@StorageLink和@StorageProp? @StorageLink和@StorageProp配合@AppStorage在V1中很好用,基本就是图方便就用了。
但在迁移时,是个让人头疼的存在,怎么能尽量无痛迁移?
《流心播放器》开源鸿蒙项目,目前在从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以及应用级状态管理方案来重构。
主要迁移路径如下:
-
替代
@AppStorage+@StorageLink/@StorageProp的方案:- 对于组件内部的状态共享:直接使用
@State、@Provide(在父组件)和@Consume(在子组件)进行跨组件层级的状态共享与响应式更新。这替代了原先通过@AppStorage进行全局绑定的模式。 - 对于真正的全局应用状态:推荐使用**
AppStorage全局对象**(这是一个新的、独立的API,并非V1中的装饰器用法)或**LocalStorage** 来管理应用级持久化状态。你可以在应用入口初始化状态,然后在任何UI组件中通过AppStorage.get()、AppStorage.set()或LocalStorage的API进行访问和修改,并配合@State装饰局部变量来触发UI更新。
- 对于组件内部的状态共享:直接使用
-
迁移步骤建议:
- 步骤一:识别作用域。分析每个
@StorageLink和@StorageProp变量是用于组件树共享,还是真正的全局设置/用户数据。 - 步骤二:组件树共享迁移。将用于父子或兄弟组件通信的变量改为
@Provide和@Consume装饰器,或通过@State配合参数传递。 - 步骤三:全局状态迁移。将用于全局访问的变量移至
AppStorage或LocalStorage中进行管理。在组件中,使用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更灵活、模块化的状态管理方案中。

