当前位置:   article > 正文

arkts状态管理使用(@State、@Prop、@Link、@Provide、@Consume、@objectLink和@observed)_arkts props初始值

arkts props初始值

一、状态管理

1.在声明式UI中,是以状态驱动视图更新:

①状态(State):指驱动视图更新的数据(被装饰器标记的变量)

②视图(View):基于UI描述渲染得到用户界面

注意:

①@State装饰器标记的变量必须初始化,不能为空值

②@State支持object、class、string、number、boolean、enum类型以及这些类型的数组

③嵌套类型以及数组中的对象属性无法触发视图更新

例子:

  1. class Person{
  2. name:string
  3. age:number
  4. friend:Person
  5. constructor(name:string,age:number,friend?:Person) {
  6. this.name=name
  7. this.age=age
  8. this.friend=friend
  9. }
  10. }
  11. @Entry
  12. @Component
  13. struct Index {
  14. @State message: string = 'Hello World'
  15. @State P:Person=new Person('张三',18,new Person('zz',10))
  16. build() {
  17. Row() {
  18. Column() {
  19. // 正常发生变化
  20. Text(`${this.P.name}:${this.P.age}`)
  21. .fontSize(80)
  22. .fontWeight(FontWeight.Bold)
  23. .fontColor("red")
  24. .onClick(()=>{
  25. this.P.name="李四"
  26. this.P.age++
  27. })
  28. // 嵌套的对象点击视图不发生变化
  29. Text(`${this.P.friend.name}:${this.P.friend.age}`)
  30. .fontSize(80)
  31. .fontWeight(FontWeight.Bold)
  32. .fontColor("red")
  33. .onClick(()=>{
  34. this.P.friend.name="ss"
  35. this.P.friend.age++
  36. })
  37. }
  38. .width('100%')
  39. }
  40. .height('100%')
  41. }
  42. }

效果:

2.@State和@Prop单项数据同步(父向子传值)

①父组件

  1. //2.引入子组件
  2. import { AnLi }from "./AnLi"
  3. @Entry
  4. @Component
  5. struct Index {
  6. // 1.父组件声明变量
  7. @State a:number=0
  8. build() {
  9. Stack(){
  10. Column(){
  11. // 3.父向子传值
  12. AnLi({a:this.a})
  13. Button("点击").onClick(()=>{
  14. this.a++
  15. })
  16. }.height("30%").width("100%").backgroundColor("green")
  17. }.height("50%").width("100%").backgroundColor("red").alignContent(Alignment.Center)
  18. }}

②子组件

  1. @Component
  2. export struct AnLi {
  3. //4.@prop接收父组件传过来的变量
  4. @Prop a:number
  5. build(){
  6. Column(){
  7. Text( `${this.a}`)
  8. }
  9. }}

2.@State和@Link数据双向同步

①父组件

  1. //2.引入子组件
  2. import { AnLi }from "./AnLi"
  3. @Entry
  4. @Component
  5. struct Index {
  6. // 1.父组件声明变量
  7. @State a:number=0
  8. build() {
  9. Stack(){
  10. Column(){
  11. Text( `${this.a}`)
  12. // 3.父向子传值
  13. AnLi({a:this.a})
  14. Button("点击").onClick(()=>{
  15. this.a++
  16. })
  17. }.height("30%").width("100%").backgroundColor("green")
  18. }.height("50%").width("100%").backgroundColor("red").alignContent(Alignment.Center)
  19. }}

②子组件

  1. @Component
  2. export struct AnLi {
  3. //4.@Link接收父组件传过来的变量
  4. @Link a:number
  5. build(){
  6. Column(){
  7. Text( `${this.a}`)
  8. }
  9. }}

效果如下:

3.@Provide和@Consume与后代组件双向同步例子如下:

  1. //入口组件,根组件
  2. import { AnLi }from "./AnLi"
  3. @Entry
  4. @Component
  5. struct Index {
  6. @Provide a:number=1
  7. build() {
  8. Stack(){
  9. Column(){
  10. AnLi()
  11. }.height("30%").width("100%").backgroundColor("green")
  12. }.height("50%").width("100%").backgroundColor("red").alignContent(Alignment.Center)
  13. }}
  14. //父组件
  15. import { Consum }from "./Consum"
  16. @Component
  17. export struct AnLi {
  18. build(){
  19. Column(){
  20. Consum()
  21. }
  22. }}
  23. //子组件
  24. @Component
  25. export struct Consum {
  26. @Consume a:number
  27. build(){
  28. Column(){
  29. Text( `${this.a}`)
  30. Text( `${this.a}`)
  31. Button("加以").onClick(()=>{
  32. this.a++
  33. })
  34. }
  35. }}

效果如下:

4.@objectLink和@observed装饰器用于在涉及嵌套对象或数组元素为对象的场景中进行双向数据同步

  • 被@Observed装饰的类,可以被观察到属性的变化;
  • 子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中的属性,这个属性同样也需要被@Observed装饰。
  • 单独使用@Observed是没有任何作用的,需要搭配@ObjectLink或者@Prop使用。
限制条件

  • 使用@Observed装饰class会改变class原始的原型链,@Observed和其他类装饰器装饰同一个class可能会带来问题。
  • @ObjectLink装饰器不能在@Entry装饰的自定义组件中使用。
  1. @Observed
  2. class ClassA {
  3. public c: number;
  4. constructor(c: number) {
  5. this.c = c;
  6. }
  7. }
  8. @Observed
  9. class ClassB {
  10. public a: ClassA;
  11. constructor(a: ClassA) {
  12. this.a = a;
  13. }
  14. }
  15. @Component
  16. struct ComB{
  17. @ObjectLink a:ClassA;
  18. build(){
  19. Button(`ViewA this.a.c=${this.a.c} +1`)
  20. .onClick(() => {
  21. this.a.c += 1;
  22. })
  23. }
  24. }
  25. @Entry
  26. @Component
  27. struct Index {
  28. @State b: ClassB = new ClassB(new ClassA(0));
  29. build() {
  30. Stack(){
  31. Column(){
  32. ComB({a:this.b.a})
  33. }.height("30%").width("100%").backgroundColor("green")
  34. }.height("50%").width("100%").backgroundColor("red").alignContent(Alignment.Center)
  35. }}

效果如下:

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

闽ICP备14008679号