HarmonyOS 鸿蒙Next组件间的通信和方法调用

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next组件间的通信和方法调用

一个页面中多个组件通信和方法调用,有没有更简单的方式

2 回复

组件间变量传递可以参考链接中@Prop装饰器和@Link装饰器使用方法,参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-component-state-management-V5

子组件调用父组件的方法可参考@BuilderParam装饰器:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builderparam-V5

父组件调用子组件方法,请参考如下demo,谢谢

[@Component](/user/Component)

struct Child {

  [@State](/user/State) private text: string = '初始值'

  private controller: ChildController = new ChildController();

  aboutToAppear() {

    if(this.controller) {

      this.controller.changeText = this.changeText

    }

    console.log('aaa')

  }

  private changeText = (value: string) =>{

    this.text = value

    console.log('bbb')

  }

  build() {

    Column() {

      Text(this.text)

    }

  }

}

class ChildController {

  changeText = (value: string) => {

    console.log('11111')

  }

}

export let ChildRef = new ChildController()

[@Entry](/user/Entry)

[@Component](/user/Component)

struct Parent {

  // ChildRef = new ChildController()

  [@State](/user/State) noShow: boolean = false

  build() {

    Column() {

      Text('获取Child的exposeMethods!').fontSize('18vp').fontColor(Color.Gray)

      Divider()

      Child({ controller: ChildRef })

      Child()

      Button('Parent调用childer的changeText').onClick(() => {

        ChildRef.changeText('Parent调用childer的changeText')

      })

    }

  }

}

HarmonyOS鸿蒙Next组件间的通信和方法调用主要通过以下几种方式实现:

  1. 父子组件通信

    • 父传子:使用@Prop装饰器,子组件定义@Prop变量,父组件通过对象形式传入数据,这种方式是单向传递。
    • 子传父:虽然@Prop不支持子传父,但可以通过@Link装饰器实现双向绑定,子组件变量值改变时,父组件数据也会相应变化。
  2. 兄弟组件及不相关组件通信

    • 可以借助父组件作为中转,或者使用全局状态管理(如通过服务或全局变量)来实现。
  3. 方法调用

    • 组件间的方法调用一般通过事件机制实现,如子组件触发事件,父组件监听并处理该事件,进而调用相关方法。
  4. 高级通信方式

    • @Provide/@Consume:用于后代组件间的通信,提供方组件使用[@Provide](/user/Provide)装饰器暴露数据或方法,消费方组件使用[@Consume](/user/Consume)装饰器接收。
    • @Observed/@ObjectLink:用于嵌套对象数组属性变化的监听和通信。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部