当前位置:   article > 正文

HarmonyOS应用开发:Observed和ObjectLink数据管理

objectlink

意义:

可实现父类和子对象中变量的自由绑定。

  • @Observed应用于,表示该类中的数据变更被UI页面管理,例如:@Observed class ClassA {}。

  • @ObjectLink应用于被@Observed所装饰类的对象(变量),例如:@ObjectLink a: ClassA。

使用要求

  • @Observed 用于类,@ObjectLink 用于变量。

  • @ObjectLink装饰的变量类型必须为类(class type)。

    • 类要被@Observed装饰器所装饰。
    • 不支持简单类型参数,可以使用@Prop进行单向同步
  • @ObjectLink装饰的对象变量是不可变的immutable),但可以修改对象里面变量的值

    • 属性的改动是被允许的,当改动发生时,如果同一个对象被多个@ObjectLink变量所引用,那么所有拥有这些变量的自定义组件都会被通知去重新渲染。
  • @ObjectLink装饰的变量不可设置默认值。

    • 必须让父组件中有一个由@State、@Link、@StorageLink、@Provide或@Consume所装饰变量参与的TS表达式进行初始化。
  • @ObjectLink装饰的变量是私有变量,只能在组件内访问。

示例:

  1. //父组件ViewB中的类对象ClassB,其包含的对象ClassA与子组件ViewA数据同步时,通过ObjectLink将数据c值的变化状态通知给父组件同步变化。
  2. @Observed
  3. class ClassA {
  4. public name : string;
  5. public c: number;
  6. constructor(c: number, name: string = 'OK') {
  7. this.name = name;
  8. this.c = c;
  9. }
  10. }
  11. class ClassB {
  12. public a: ClassA;
  13. constructor(a: ClassA) {
  14. this.a = a;
  15. }
  16. }
  17. @Component
  18. struct ViewA {
  19. label : string = "ep1";
  20. @ObjectLink a : ClassA;
  21. build() {
  22. Column() {
  23. Text(`ViewA [${this.label}]: a.c=${this.a.c}`)
  24. .fontSize(20)
  25. Button(`+1`)
  26. .width(100)
  27. .margin(2)
  28. .onClick(() => {
  29. this.a.c += 1;
  30. })
  31. Button(`reset`)
  32. .width(100)
  33. .margin(2)
  34. .onClick(() => {
  35. this.a = new ClassA(0); // 错误:ObjectLink装饰的变量a是不可变的
  36. })
  37. }
  38. }
  39. }
  40. @Entry
  41. @Component
  42. struct ViewB {
  43. @State b : ClassB = new ClassB(new ClassA(10));
  44. build() {
  45. Flex({direction: FlexDirection.Column, alignItems: ItemAlign.Center}) {
  46. ViewA({label: "ViewA #1", a: this.b.a})
  47. ViewA({label: "ViewA #2", a: this.b.a})
  48. Button(`ViewB: this.b.a.c += 1` )
  49. .width(320)
  50. .margin(4)
  51. .onClick(() => {
  52. this.b.a.c += 1;
  53. })
  54. Button(`ViewB: this.b.a = new ClassA(0)`)
  55. .width(240)
  56. .margin(4)
  57. .onClick(() => {
  58. this.b.a = new ClassA(0);
  59. })
  60. Button(`ViewB: this.b = new ClassB(ClassA(0))`)
  61. .width(240)
  62. .margin(4)
  63. .onClick(() => {
  64. this.b = new ClassB(new ClassA(0));
  65. })
  66. }
  67. }
  68. }

归纳总结:

1、@Observed 用于类,@ObjectLink 用于对象变量;

2、@ObjectLink修饰的变量初始化要求:@Observed修饰的父类中,@State、@Link、@StorageLink、@Provide或@Consume修饰的变量,并且用命名参数的形式。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/319978
推荐阅读
相关标签
  

闽ICP备14008679号