HarmonyOS 鸿蒙Next ArkTS实现防抖和节流
HarmonyOS 鸿蒙Next ArkTS实现防抖和节流
// 废话不多说,直接上代码,有尝试在onClick()里面直接写,但是尝试了几种办法均有问题,最终暂时采用如下代码中的解决方案,应该还有更好的,期待大佬分享
@Observed
class Obj {
name:string
age:number
address:string
constructor(p1:string,p2:number,p3:string) {
this.name = p1
this.age = p2
this.address = p3
}
}
// 防抖 在一段时间内函数被多次触发,防抖让函数在一段时间后最终只执行一次
function fd(fn: Function, delay: number) {
let timer: any = null
return function () {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(this, arguments)
}, delay)
}
}
// 节流 函数被连续触发多少次,节流就是让函数按照特定的频率去执行
function jl(fn, delay) {
let flag = true
return function () {
if (!flag) return
flag = false
setTimeout(() => {
fn(this, arguments)
flag = true
}, delay)
}
}
@Entry
@Component
struct parent {
@State arr: Obj[] = [new Obj(‘张三’, 18, ‘云南’), new Obj(‘李四’, 20, ‘浙江’)]
// 防抖实现
testFD(item) {
console.log(‘防抖’,item)
}
debouncedTestFd=fd(this.testFD.bind(this),1000)
// 节流实现
testJL(item) {
console.log(‘节流’,item)
}
throttleDTestJl = jl(this.testJL.bind(this),1000)
build() {
Column() {
ForEach(this.arr, (item, index) => {
Column() {
Text(‘姓名:’ + item.name)
Divider().padding({ top: 10, bottom: 10 }).color(’#ff870be0’)
Row() {
Text(‘年龄:’ + item.age)
Blank()
Button(‘change’).fontColor(’#ffd0c606’).stateStyles({
pressed: {
.backgroundColor(Color.Gray)
},
normal: {
.backgroundColor(Color.Brown)
}
})
// 防抖
// .onClick(this.debouncedTestFd) //不可用fd(this.testFD.bind(this),1000)替换this.debounceTestFd
// 节流
.onClick(this.throttleDTestJl) //同理,不可使用jl(this.testJL.bind(this),1000)替换this.throttledTestJl
}.width(‘100%’)
Divider().padding({ top: 10, bottom: 10 }).color(’#ff870be0’)
Text(‘地址:’ + item.address)
}
.border({ width: 1, color: ‘#ff34d5dd’, radius: 8 })
.padding(15)
.width(‘100%’)
.alignItems(HorizontalAlign.Start)
.colorBlend(’#ff676966’)
.margin({ top: 10 })
})
}
}
}
5 回复
封装成工具类,然后直接使用吗?
点击事件,在方法里面重写就好了,看我发布的论坛
定时器不关闭,会导致每次都会生成一个新的定时器吗?
在HarmonyOS鸿蒙Next中,ArkTS实现防抖和节流功能,可以通过扩展修饰器(Decorator)来实现。以下是具体的实现方法:
-
防抖(Debounce):
- 防抖是指在一段时间内函数被多次触发时,让函数在一段时间后最终只执行一次。
- 可以创建一个防抖修饰器
Debounce
,通过闭包和setTimeout
来实现延时执行。
-
节流(Throttle):
- 节流是指函数被连续触发时,让函数按照特定的频率去执行。
- 可以创建一个节流修饰器
Throttle
,通过闭包和setTimeout
来忽略指定时间区间内的重复触发。
在ArkTS中使用这些修饰器非常简单,只需在需要防抖或节流的函数前添加对应的修饰器注解,并传入合适的延迟时间即可。
如果在使用过程中遇到问题,可以检查以下几点:
- 确保修饰器正确导入并应用到目标函数上。
- 检查延迟时间设置是否合理。
- 确认函数调用的上下文环境是否正确。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。