HarmonyOS 鸿蒙Next 自定义组件如何写自定义事件

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

HarmonyOS 鸿蒙Next 自定义组件如何写自定义事件

自定义组件如何写自定义事件

2 回复

自定义组件HSCell 中自定义事件tapEvent,通过点击修改数据,实现UI状态的变化

[@Observed](/user/Observed)

class HSItemData {

  choose: boolean = false

  constructor(choose: boolean) {

    this.choose = choose

  }

}

[@Observed](/user/Observed)

class HSTestDataModel {

  itemArray: Array<HSItemData> = new Array()

  constructor(itemArray: HSItemData[]) {

    this.itemArray = itemArray

  }

}

[@Component](/user/Component)

struct HSCell {

  [@ObjectLink](/user/ObjectLink) itemData: HSItemData

  tapEvent?: (item: HSItemData) => void

  build() {

    Row() {

      if (this.itemData.choose) {

        Text("选中")

      }

      else {

        Text("未选中")

      }

    }

    .backgroundColor(Color.Pink)

    .onClick(() => {

      if (this.tapEvent) {

        this.tapEvent(this.itemData)

      }

    })

    .margin({ bottom: 10 })

    .width('100%')

    .height(68)

  }

}

[@Entry](/user/Entry)

[@Component](/user/Component)

export struct HSTestPage {

  listeners: DataChangeListener[] = []

  [@State](/user/State) dataModel: HSTestDataModel = new HSTestDataModel([])

  aboutToAppear(): void {

    for (let i = 0; i < 10; i++) {

      this.dataModel.itemArray.push(new HSItemData(false))

    }

  }

  build() {

    Column() {

      List() {

        LazyForEach(this, (item: HSItemData, index) => {

          HSCell({

            itemData: item, tapEvent: () => {

              item.choose = !item.choose

            }

          })

        }, (item: string) => item.toString())

      }

    }

    .height('100%')

  }

  totalCount() {

    return this.dataModel.itemArray.length

  }

  getData(index: number) {

    return this.dataModel.itemArray[index]

  }

  registerDataChangeListener(listener: DataChangeListener) {

    if (this.listeners.indexOf(listener) < 0) {

      this.listeners.push(listener);

    }

  }

  unregisterDataChangeListener(listener: DataChangeListener) {

    const pos = this.listeners.indexOf(listener);

    if (pos >= 0) {

      this.listeners.splice(pos, 1);

    }

  }

  reloadTableView(): void {

    this.listeners.forEach(listener => {

      listener.onDataReloaded();

    })

  }

}

在HarmonyOS鸿蒙Next系统中,自定义组件编写自定义事件涉及以下几个关键步骤:

  1. 定义事件类型:首先,在自定义组件的Java或Kotlin代码中定义一个新的事件类型,通常使用Event或其子类。这个事件类需要包含所有需要传递的数据。

  2. 发送事件:在组件内部,通过ComponentContextsendEvent方法发送自定义事件。这通常发生在用户交互(如点击、滑动等)触发的回调函数中。

  3. 接收事件:在父组件或监听该事件的组件中,通过实现EventListener接口或相应的监听器方法来接收并处理自定义事件。需要在组件的XML布局文件中,通过ohos:event属性绑定事件监听器。

  4. 处理事件:在事件监听器的回调函数中处理接收到的自定义事件,执行相应的业务逻辑。

请确保自定义事件类、发送和接收逻辑正确无误,并且XML布局文件中的事件绑定正确。此外,还需要注意事件传递的数据类型与接收端期望的数据类型一致。

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

回到顶部