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