برنامه نویسی

Hongmeng Development: چگونه یک مؤلفه والدین روش را در یک مؤلفه کودک می نامد؟

مقدمه

این مقاله بر اساس API13 است

در بسیاری از سناریوها ، مؤلفه والدین باید برای اجرای برخی از منطق خاص ، روشی را در مؤلفه کودک ایجاد کند ، اما Arkui یک UI اعلامیه است و نمی تواند به طور مستقیم روش های موجود در مؤلفه کودک را فراخوانی کند. بنابراین چگونه می توان این عملکرد را پیاده سازی کرد؟

برای ارائه یک مورد بسیار متداول ، با فراخوانی یک روش در زیرمجموعه ، به روزرسانی UI زیرمجموعه تحقق می یابد. کد ساده به شرح زیر است. فقط با فراخوانی روش ChangeUi می توان UI را تحریک کرد.

@Component
struct Child {
  @State message: string = "我是子组件"

  /**
   *AUTHOR:AbnerMing
   *INTRODUCE:子组件方法
   */
  changeUI() {
    this.message = "子组件UI更新了"
  }

  build() {
    Text(this.message)
      .width("100%")
      .height(50)
      .backgroundColor(Color.Pink)
      .textAlign(TextAlign.Center)
  }
}

روش 1: دکوراتور Watch

اگر از نسخه V1 دکوراتور استفاده می کنید ، می توانیم با استفاده از دکوراتور Watch به راحتی آن را پیاده سازی کنیم.

تعریف زیرمجموعه watch دکوراتور

@Component
struct Child {
  @State message: string = "我是子组件"
  @Prop @Watch("changeUI") isChangeStatus: boolean = false

  /**
   *AUTHOR:AbnerMing
   *INTRODUCE:子组件方法
   */
  changeUI() {
    this.message = "子组件UI更新了"
  }

  build() {
    Text(this.message)
      .width("100%")
      .height(50)
      .backgroundColor(Color.Pink)
      .textAlign(TextAlign.Center)
  }
}

تماس جزء والدین

خاصیت ischangestatus تعریف شده توسط مؤلفه کودک می تواند به طور مداوم تغییر کند.

@Entry
  @Component
  struct DemoPage {
    @State isChangeStatus: boolean = false

    build() {
      Column() {
        Child({ isChangeStatus: this.isChangeStatus })
        Button("点击")
          .onClick(() => {
            this.isChangeStatus = !this.isChangeStatus
          })
      }
      .height('100%')
        .width('100%')
        .justifyContent(FlexAlign.Center)
    }
  }

روش 2: دکوراتور Monitor

این با روش اجرای روش 1 سازگار است ، به جز اینکه دکوراتور Monitor نسخه V2 است ، به این معنی که اگر از دکوراتور نسخه V2 استفاده می کنید ، می توانید از این استفاده کنید.

دکوراتور تعریف فرعی monitor

@ComponentV2
struct Child {
  @Local message: string = "我是子组件"
  @Param isChangeStatus: boolean = false

  /**
   *AUTHOR:AbnerMing
   *INTRODUCE:子组件方法
   */
  @Monitor("isChangeStatus")
  changeUI() {
    this.message = "子组件UI更新了"
  }

  build() {
    Text(this.message)
      .width("100%")
      .height(50)
      .backgroundColor(Color.Pink)
      .textAlign(TextAlign.Center)
  }
}

تماس جزء والدین

@Entry
@ComponentV2
struct DemoPage {
  @Local isChangeStatus: boolean = false

  build() {
    Column() {
      Child({ isChangeStatus: this.isChangeStatus })
      Button("点击")
        .onClick(() => {
          this.isChangeStatus = !this.isChangeStatus
        })
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

روش 3: پاسخ به رابط

عملکرد پاسخ به تماس را تعریف کنید

class ChangeController {
  change = () => {}
}

مؤلفه های فرعی تماس های برگشتی را اجرا می کنند

@Component
struct Child {
  @State message: string = "我是子组件"
  changeController: ChangeController = new ChangeController()

  aboutToAppear(): void {
    if (this.changeController.change != undefined) {
      this.changeController.change = () => {
        this.changeUI()
      }
    }
  }

  /**
   *AUTHOR:AbnerMing
   *INTRODUCE:子组件方法
   */
  changeUI() {
    this.message = "子组件UI更新了"
  }

  build() {
    Text(this.message)
      .width("100%")
      .height(50)
      .backgroundColor(Color.Pink)
      .textAlign(TextAlign.Center)
  }
}

عملکرد مؤلفه والدین

@Entry
@Component
struct DemoPage {
  changeController: ChangeController = new ChangeController()

  build() {
    Column() {
      Child({ changeController: this.changeController })
      Button("点击")
        .onClick(() => {
          this.changeController.change()
        })
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

روش 4: EventHub اشتراک رویداد

مشترک شدن در رویدادها

@Component
struct Child {
  @State message: string = "我是子组件"

  aboutToAppear(): void {
    getContext().eventHub.on("changeUI", ()=>{
      this.changeUI()
    })
  }

  /**
   *AUTHOR:AbnerMing
   *INTRODUCE:子组件方法
   */
  changeUI() {
    this.message = "子组件UI更新了"
  }

  build() {
    Text(this.message)
      .width("100%")
      .height(50)
      .backgroundColor(Color.Pink)
      .textAlign(TextAlign.Center)
  }
}

رویداد ماشه

@Entry
@Component
struct DemoPage {
  build() {
    Column() {
      Child()
      Button("点击")
        .onClick(() => {
          getContext().eventHub.emit('changeUI')
        })
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

خلاصه مرتبط

شاید شما ممکن است سوالی داشته باشید. اگر زیرمجموعه UI را به روز کند ، کافی نیست که مستقیماً توسط دکوراتور ایجاد شود. امیدوارم همه بتوانند درک کنند که موارد فوق فقط یک مورد ساده است. در توسعه واقعی ، ممکن است منطق زیادی در روش زیرمجموعه مانند درخواست های شبکه ، ذخیره داده ها و غیره وجود داشته باشد که به روزرسانی های ساده UI نیستند.

البته روشهای اجرای ذکر شده کامل نیست و ممکن است روشهای دیگری برای اجرای آنها وجود داشته باشد. شما می توانید مورد مناسب را در توسعه واقعی انتخاب کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا