HarmonyOS:自定义父子组件之间如何进行事件传递以及解决this指向问题

前提:自定义的父子组件之间事件的传递,子组件触发回调函数,父组件执行方法,发现试了官方的例子之后,在父组件调用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方法,必定闪退

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值