HarmonyOS 如何在层级深的component中获取当前页面的localstorage.

在开发过程中,需要使用到LocalStorage组件,LocalStorage组件需要@Entry标识的页面创建,但是使用的地方可能是层级较深的自定义组件中,请问在自定义组件中,能否有什么系统方法能够获取当前页面的LocalStorage.一层一层的传递,感觉太繁琐了。

HarmonyOS
2025-01-09 14:27:40
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
fox280

目前只能通过以下方式:

如果要建立LocalStorage和自定义组件的联系,需要使用@LocalStorageProp和@LocalStorageLink装饰器。使用@LocalStorageProp(key)/@LocalStorageLink(key)装饰组件内的变量,key标识了LocalStorage的属性。

当自定义组件初始化的时候,@LocalStorageProp(key)/@LocalStorageLink(key)装饰的变量会通过给定的key,绑定LocalStorage对应的属性,完成初始化。本地初始化是必要的,因为无法保证LocalStorage一定存在给定的key(这取决于应用逻辑是否在组件初始化之前在LocalStorage实例中存入对应的属性)。

@LocalStorageProp(key)是和LocalStorage中key对应的属性建立单向数据同步,我们允许本地改变的发生,但是对于@LocalStorageProp,本地的修改永远不会同步回LocalStorage中,相反,如果LocalStorage给定key的属性发生改变,改变会被同步给@LocalStorageProp,并覆盖掉本地的修改。

@LocalStorageProp和LocalStorage单向同步的简单场景:

在下面的示例中,CompA 组件和Child组件分别在本地创建了与storage的’PropA’对应属性的单向同步的数据,我们可以看到:

CompA中对this.storProp1的修改,只会在CompA中生效,并没有同步回storage;

Child组件中,Text绑定的storProp2 依旧显示47。

// 创建新实例并使用给定对象初始化
let para:Record<string,number> = { 'PropA': 47 };
let storage: LocalStorage = new LocalStorage(para);
// 使LocalStorage可从@Component组件访问
@Entry(storage)
@Component
struct CompA {
  // @LocalStorageProp变量装饰器与LocalStorage中的'PropA'属性建立单向绑定
  @LocalStorageProp('PropA') storProp1: number = 1;
  build() {
    Column({ space: 15 }) {
      // 点击后从47开始加1,只改变当前组件显示的storProp1,不会同步到LocalStorage中
      Button(`Parent from LocalStorage ${this.storProp1}`)
        .onClick(() => this.storProp1 += 1)
      Child()
    }
  }
}
@Component
struct Child {
  // @LocalStorageProp变量装饰器与LocalStorage中的'PropA'属性建立单向绑定
  @LocalStorageProp('PropA') storProp2: number = 2;
  build() {
    Column({ space: 15 }) {
      // 当CompA改变时,当前storProp2不会改变,显示47
      Text(`Parent from LocalStorage ${this.storProp2}`)
    }
  }
}
分享
微博
QQ
微信
回复
2025-01-09 17:09:23
相关问题
HarmonyOS 如何动态获取当前页面
1292浏览 • 1回复 待解决
WebView支持获取当前页面url吗?
1391浏览 • 1回复 待解决
Web中加载网页后获取当前页面和url
1654浏览 • 1回复 待解决
鸿蒙注销当前页面是哪个方法?
8771浏览 • 1回复 已解决