HarmonyOS鸿蒙Next中如何解决父组件无法调用子组件中方法的问题

HarmonyOS鸿蒙Next中如何解决父组件无法调用子组件中方法的问题

【问题现象】

在子组件里重新绑定父组件里的方法,然后在父组件里调用,发现执行的仍是父组件里的方法。问题代码和日志如下,如何才能实现在父组件里调用子组件方法?

问题代码:

// 父组件里申明的方法
testFun = () => {
  console.info('test parent fun');
}

build() {
  Column() {
    // 传递到子组件
    ChildView({ fun: this.testFun });
    Button().onClick(() => {
      // 父组件里调用子组件方法
      this.testFun();
    })
  }
}
// 子组件里
aboutToAppear(): void {
  // 方法重新绑定
  this.fun = this.start.bind(this);
}

start() {
  console.log('test child fun');
}

执行结果: 显示依旧执行的是父组件里的方法。

点击放大

【背景知识】

ArkTs参数传递分为值传递和引用传递,值传递是指将值复制一份传递给下一级,引用传递是指将原参数地址传递给下一级,使两个参数共同指向一个地址。

【定位思路】

原来方法的意图是想通过将父布局里的方法引用传递到子布局里,再在子布局中重新指向新的方法,以此来实现父布局里的方法指向子布局里的方法。但重新指向只能修改子布局里的方法指向,父布局里的方法依旧指向的原来的方法,所以执行的依旧是父布局里的方法,如下图:

点击放大

【解决方案】

定义一个controller类,在这个类里申明想要调用的方法。在父组件里创建该对象,再传递到子组件里。在子组件里将该方法绑定实际要执行的方法,这样父组件调用该对象里的方法时,调用的就是相应的子组件里绑定的方法,如下图:

点击放大

声明controller类:

export class ChildController {
  start = () => {
  }
}

父组件里创建传递和调用:

// 父组件中申明子组件的controller
childController: ChildController = new ChildController();

build() {
  Column() {
    // 传递到子组件
    ChildView({ controller: this.childController });
    Button().onClick(() => {
      // 调用子组件里的方法
      this.childController.start()
    })
  }
}

子组件里重新绑定:

aboutToAppear(): void {
  // 绑定子组件里的方法
  this.controller.start = this.start;
}

start() {
  console.log('test child fun')
}

运行结果: 成功执行了子组件里的方法。

点击放大

【总结】

父组件将controller对象传递给子组件,子组件里仅仅改变对象里的方法指向。这样父组件就能根据该对象找到相应的方法,进而成功的调用到子组件里的方法。


更多关于HarmonyOS鸿蒙Next中如何解决父组件无法调用子组件中方法的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决父组件无法调用子组件中方法的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,父组件无法直接调用子组件中的方法,可以通过定义一个controller类来解决。具体步骤如下:

  1. 声明controller类

    export class ChildController {
      start = () => {
      }
    }
    
  2. 父组件中创建并传递controller对象

    childController: ChildController = new ChildController();
    
    build() {
      Column() {
        ChildView({ controller: this.childController });
        Button().onClick(() => {
          this.childController.start();
        })
      }
    }
    
  3. 子组件中重新绑定方法

    aboutToAppear(): void {
      this.controller.start = this.start;
    }
    
    start() {
      console.log('test child fun');
    }
    

通过这种方式,父组件可以成功调用子组件中的方法。

回到顶部