HarmonyOS鸿蒙Next中请问更新WEDDING_NEWCOMER_STORE 全局变量对象,@StorageProp能获取到变化的值吗

HarmonyOS鸿蒙Next中请问更新WEDDING_NEWCOMER_STORE 全局变量对象,@StorageProp能获取到变化的值吗 请问更新WEDDING_NEWCOMER_STORE 全局变量对象,@StorageProp能获取到变化的值吗

cke_463.png


更多关于HarmonyOS鸿蒙Next中请问更新WEDDING_NEWCOMER_STORE 全局变量对象,@StorageProp能获取到变化的值吗的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

当AppStorage中的属性值发生变化时(例如通过AppStorage.set()或AppStorage.setOrCreate()修改),所有使用@StorageProp(key)绑定了该key的组件变量都会自动同步更新,从而触发组件重新渲染,UI得以刷新。代码中修改的k值与监听的值不一致导致@StorageProp无法监听到

更多关于HarmonyOS鸿蒙Next中请问更新WEDDING_NEWCOMER_STORE 全局变量对象,@StorageProp能获取到变化的值吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


名字不同这细节。
温馨提示:AppStorage只在主线程使用,taskpool和worker线程里不支持AppStorage。

分情况。

如果你这样更新:

AppStorage.SetOrCreate('WEDDING_NEWCOMER_STORE', newObj)

或者整体重新赋值一个新对象,@StorageProp 能感知到变化,会刷新。

但如果只是改对象内部字段:

this.newcomer.xxx = 'xxx'

这种深层属性修改默认不一定触发 @StorageProp 响应更新,因为 @StorageProp 主要监听的是 key 对应引用是否变化,不是对象内部每个字段的细粒度监听。

你图里的:

AppStoreUtil.setOrProp(Commons.WEDDING_USER_STORE, this.currentUser)

如果 this.currentUser 只是原对象改完再 set 回去,可能因为引用没变,页面上的:

@StorageProp(...)
newcomer

不一定触发更新。

稳妥写法是重新创建新对象再 set:

const newValue = {
  ...this.currentUser,
  mood: mood
}
AppStorage.SetOrCreate(Commons.WEDDING_NEWCOMER_STORE, newValue)

这样引用变了,@StorageProp 一定能收到。

一句话:

@StorageProp 更可靠监听“对象整体替换”,不要依赖对象内部属性原地修改触发更新。

@StorageProp 和 AppStorage 是单向同步关系:
当 AppStorage 中同一个 key 的值发生变化时,绑定这个 key 的 @StorageProp 会同步拿到新值;但它只是不回写 AppStorage,本地改动还会被 AppStorage 后续更新覆盖。

你这里必须是同一个 key,如果你更新的是 WEDDING_NEWCOMER_STORE,那么 @StorageProp(WEDDING_NEWCOMER_STORE) 才会收到变化。

在状态管理 V1 里,普通对象场景主要能观察到对象整体替换和第一层属性变化。
也就是说,如果改的是 newcomer.mood 这种第一层属性,通常可以同步到。
但如果改的是更深层嵌套属性,比如 newcomer.xxx.yyy,就不一定能刷新,官方建议这种场景用 @Observed + @ObjectLink,或者直接上状态管理 V2。

**总结:**同 key,并且更新的是对象整体或第一层属性,@StorageProp 能拿到变化;不同 key 或深层对象属性变化,就不能指望它稳定感知。

应该可以的,加个Text测试一下,User类应该加@Observed修饰。

是的,

更新 WEDDING_NEWCOMER_STORE 所引用的对象属性时,@StorageProp 无法获取变化。因为 @StorageProp 仅监听存储的引用变化,不监听对象内部属性变动。若要触发更新,需整体赋值新对象。

在 HarmonyOS Next 中,@StorageProp 为单向同步,它会在组件内创建一个本地状态副本。当 AppStorage 中的键值整体被替换(即引用发生变化)时,@StorageProp 能收到通知并获取到新值,触发组件重新渲染。
但如果你只是更新 WEDDING_NEWCOMER_STORE 对象内部的某个属性(引用未变),@StorageProp 无法感知此变更,不会更新。要响应深层属性变化,应使用 @StorageLink 实现双向同步,或在更新时重新赋值整个对象(如通过 AppStorage.Set 替换新对象)。

回到顶部