鸿蒙Next通过自定义控制器控制自定义下拉组件数据刷新

鸿蒙Next通过自定义控制器控制自定义下拉组件数据刷新

设备信息:Mate60
API版本:Api12
DevEco Studio版本:5.0.3.910
问题描述:我封装了一个自定义的下拉组件,目前是用的监听变量变化的方式触发刷新操作,想请教老师的是,有没有可能我自定一个类似Scroller这种的控制器,创建自定义下拉组件的时候传进来,在组件内部监听控制器方法,进行相应的操作,主要是监听控制器方法这里没有思路
3 回复

可以考虑使用EventHub.on来实现类似功能,在组件初始化订阅事件,在方法触发时触发订阅,实现监听。

import { promptAction } from '@kit.ArkUI';

@Component
struct Child {
  @State private text: string = '初始值'
  private controller: ChildController = new ChildController();

  aboutToAppear() {
    if (this.controller) {
      //给controller对应的方法赋值
      this.controller.changeText = this.changeText
    }
    getContext().eventHub.on('test', () => {
      console.log(`监听到调用`);
    })
  }

  //封装的能力
  private changeText = (value: string) => {
    // this.text = value

    promptAction.showToast({ message: `调用到子组件方法` })
  }

  build() {
    Column() {
      Text(this.text)
    }
  }
}

//定义controller对象
class ChildController {
  changeText = (value: string) => {
  }
}

@Entry
@Component
struct Parent {
  private ChildRef = new ChildController()

  build() {
    Column() {
      Text('调用Child的changeText').fontSize('18vp').fontColor(Color.Gray)
      Divider()
      Child({ controller: this.ChildRef })
      Button('Parent调用childer的changeText').onClick(() => {
        getContext().eventHub.emit('test')
        this.ChildRef.changeText('Parent调用childer的changeText')
      })
    }
    .justifyContent(FlexAlign.Center)
    .width("100%")
    .height("100%")
  }
}

参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-inner-application-eventhub-V5#eventhubon

更多关于鸿蒙Next通过自定义控制器控制自定义下拉组件数据刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


定义自定义控制器类

创建一个控制器类,用于管理下拉组件的相关状态和操作。该类可以包含控制刷新的方法、记录状态的变量等。例如:

class PullDownController {
    private _isRefreshing: boolean = false;
    private _listeners: Array<() => void> = [];

    // 获取刷新状态
    get isRefreshing(): boolean {
        return this._isRefreshing;
    }

    // 开始刷新
    startRefresh(): void {
        if (!this._isRefreshing) {
            this._isRefreshing = true;
            this.notifyListeners();
        }
    }

    // 结束刷新
    endRefresh(): void {
        if (this._isRefreshing) {
            this._isRefreshing = false;
            this.notifyListeners();
        }
    }

    // 添加监听器
    addListener(listener: () => void): void {
        this._listeners.push(listener);
    }

    // 移除监听器
    removeListener(listener: () => void): void {
        const index = this._listeners.indexOf(listener);
        if (index !== -1) {
            this._listeners.splice(index, 1);
        }
    }

    // 通知监听器
    private notifyListeners(): void {
        this._listeners.forEach(listener => listener());
    }
}

鸿蒙Next系统中,自定义控制器可以通过监听用户操作或数据变化来触发自定义下拉组件的刷新逻辑。首先,自定义控制器需继承BaseController,并在onAttachedToWindow方法中绑定相关事件监听。通过@State装饰器定义数据状态,当数据发生变化时,系统会自动触发UI更新。在自定义下拉组件中,使用@Component装饰器定义组件结构,并在build方法中实现布局。通过@Link@Prop装饰器将控制器中的状态数据与组件绑定。当用户触发下拉刷新时,控制器调用refreshData方法更新数据,组件会自动刷新显示新数据。

回到顶部