前提:自定义的父子组件之间事件的传递,子组件触发回调函数,父组件执行方法,发现试了官方的例子之后,在父组件调用this的时候发现this指向的是子组件本身,而不是父组件,在尝试调用parent也没有这个方法,重新寻找文档也没有找到好的方法,最后通过博客发现一篇好文章,通过引入对象的方法,传递事件,在父组件中实现对象的方法就可以实现子组件的回调,而且this这时候也指向了父组件本身,这样就可以调用父组件的方法了。
下面就是示例用法:
1.声明一个class对象
export class BlockController {
//无参无返回值的回调
clickBlock: () => void = () => {
console.log('我是无参无返回的公共方法');
};
}
export default new BlockController();
2.在父组件中实现对象方法,以及传递对象给子组件
//引入对象
import blcokVC from '../model/BlockController'
@Entry
@Component
export struct StoreListPage{
//声明对象
private BlockRef = blcokVC;
aboutToAppear(): void {
//注册公共回调事件
this.BlockRef.clickBlock = this.changeRouteBlock;
}
//触发方法
test(){
}
//切换路线
changeRouteBlock: () => void = () => {
console.info('父组件action');
this.test();
};
build() {
Column(){
//顶部搜索导航栏
Row(){
TodayVisitRoutePage({blockController:this.BlockRef});
}
}
}
@Component
export struct TodayVisitRoutePage{
private blockController: BlockController = blcokVC;
build() {
Text('')
.onClick(()=>{
this.blockController.clickBlock();
})
}
}
如果不借助对象的传递,只传递函数给子组件,你会发现触发父组件的方法的时候,发生闪退,这是因为this指向的不是父组件本身,这样就可以避免闪退发生,正常使用this了。
官方示例如下:
@Component
export struct ParentChildComEventTransfer {
@State message: string = '来自父组件的内容';
//触发方法
test(){
}
build() {
Row() {
Column() {
Child({
message: this.message,
onClickOK: (): void => {
console.info('onClickOK action');
}
})
}
.width('100%')
}
.height('100%')
}
}
@Component
struct Child {
@Prop message: string;
onClickOK?: () => void;
build() {
Row() {
Column() {
Text(this.message)
Button('事件')
.onClick(() => {
if (this.onClickOK !== undefined) {
this.onClickOK();
}
})
}
.width('100%')
}
.height('100%')
}
}
如果你在回调方法里面调用this方法,必定闪退