HarmonyOS 鸿蒙Next关于按钮点击事件节流的问题

发布于 1周前 作者 h691938207 最后一次编辑是 5天前 来自 鸿蒙OS

我在开发中遇到了这样的问题 我的页面中有一个刷新按钮,我希望它在被频繁点击时,可以设置时间间隔来调用刷新方法,达到一个节流的效果。同时我希望这个刷新按钮在刷新时进行一个转圈的动画。 现在的问题时,当我设置好动画时,我发现节流的功能似乎失效了,如果把动画属性去掉又恢复了,我试过属性动画,显示动画,自定义动画效果都存在这个问题。我使用的节流组件来自于第三方库,我自己写了一个简单的节流函数同样存在这样的问题。 想问一下这种情况我需要如何解决问题呢?

//component.ets 
@Builder
rightIcon() {
  Image($r('app.media.futures_icon_refresh_2c2c2c'))
    .width($r('app.float.size_45'))
    .height($r('app.float.size_45'))
    .padding($r('app.float.size_10'))
    .rotate({ angle: this.rotateAngle })
    .animation({
      curve: Curve.Linear, duration: 1100, onFinish: () => {
        this.needRefresh = false
      }
    })
    .onClick(
      //自制的节流函数 
      throttle(() => {
        this.rotateAngle += 360
      }, 1100))
}

//throttleFunc.ts 
export function throttle(func: Function, delay: number) {
  let timer: number | null = null;
  let isThrottled = false
  return function (this: any, ...args: any[]) {
    if (!isThrottled) {
      func.apply(this, args);
      isThrottled = true
      if (timer) {
        clearTimeout(timer)
      }
    }
    timer = setTimeout(() => {
      isThrottled = false
    }, delay);
  }
}

//我另外尝试的显示动画和animator自定义动画,仍然起不到节流的效果,但去掉动画就可以 
/** * 刷新方法 */
private
refreshAction() {
  console.log("YSNBYSNB!")
  // 图标旋转360度 
  animateTo({
    curve: Curve.Linear, duration: 1100, onFinish: () => {
      this.rotateAngle = 0
    }
  }, () => {
    this.rotateAngle = 360
  })
  this.needRefresh = true
  setTimeout(() => {
    this.needRefresh = false
  }, MillisecondTimeInterval.ONE_SECOND)
}

private getAnimationComoponent():AnimatorResult {
  const flingAnimator = animator.create({
    duration: 1100,
    easing: "linear",
    delay: 0,
    fill: "forwards",
    direction: "normal",
    iterations: 1,
    begin: 0,
    end: 360
  })
  flingAnimator.onFrame = (value: number) => {
    this.rotateAngle = value
  }
  flingAnimator.onFinish = () => {
    this.needRefresh = false
  }
  return flingAnimator
}
1 回复

针对HarmonyOS 鸿蒙Next关于按钮点击事件节流的问题,以下提供解决方案:

节流(Throttle)的核心思想是限制在一定时间内的函数执行次数。在HarmonyOS鸿蒙Next中,可以通过设置一个定时器,在指定的时间间隔内只允许一次事件处理。当事件触发时,如果定时器已存在,则忽略本次触发,直到定时器结束后再重新计时。

在ArkUI或ArkTS中,可以利用JavaScript的setTimeout函数来实现节流功能。具体实现方式如下:

  • 定义一个节流函数,该函数接收一个需要被节流的函数和一个延迟时间作为参数。
  • 在节流函数内部,使用一个布尔值变量来记录当前是否处于节流状态。
  • 当事件触发时,首先检查是否处于节流状态,如果是,则忽略本次触发;如果不是,则执行需要被节流的函数,并将节流状态设置为true。
  • 使用setTimeout函数在延迟时间后,将节流状态重置为false,以便允许下一次事件的触发。

通过这种方式,可以有效地限制按钮点击事件的执行频率,避免因为频繁点击而导致的性能问题。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部