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 نیستند.
البته روشهای اجرای ذکر شده کامل نیست و ممکن است روشهای دیگری برای اجرای آنها وجود داشته باشد. شما می توانید مورد مناسب را در توسعه واقعی انتخاب کنید.