HarmonyOS Search组件中函数防抖的实现方式

定义:debounce

debounce(fn: Function, wait: number = 300) {  
  let timeout: number = -1;  
  console.log("debounce");  
  console.log("this",JSON.stringify(this))  
  return () => {  
    if(timeout!=-1){  
      clearTimeout(timeout);  
    }  
    timeout = setTimeout(fn.bind(this), wait);  
    console.log("==timeout==",timeout);  
  }  
}  
setFinalInput() {  
  console.log("setFinalInput this", JSON.stringify(this));  
  this.finalSearchInput = this.searchInput;  
}

​调用:

this.debounce(this.setFinalInput, 300)

调用debounce函数后无法执行this.setFinalInput函数​。

HarmonyOS
2024-10-28 10:36:28
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

调用this.debounce(this.setFinalInput, 300)没有执行return的函数是因为return的函数本身没有被调用导致,可以通过this.debounce(this.setFinalInput, 300)()调用到,但是这样会不停调用debounce函数无限创建闭包每一个闭包分别引用一个timeout,不能清除原定时器,最终每一次点击都会生效无法达到防抖的效果,建议可以全局设一个变量以达到防抖的目的:

@Entry  
@Component  
struct SearchDemo{  
  @State timeout: number = -1;  
  build() {  
    Column(){  
      Text('点击')  
        .fontSize('25fp')  
        .fontColor(Color.White)  
        .fontWeight(FontWeight.Bold)  
        .borderRadius(15)  
        .padding(8)  
        .backgroundColor(Color.Blue)  
        .onClick(() => {  
          this.debounce(this.setFinalInput, 3000);  
        })  
    }  
  }  
  debounce(fn: Function, wait: number = 300) {  
    if(this.timeout !== -1){  
      clearTimeout(this.timeout);  
    }  
    this.timeout = setTimeout(fn.bind(this), wait);  
    console.log("==timeout==",this.timeout);  
  }  
  
  setFinalInput() {  
    console.log("setFinalInput this", JSON.stringify(this));  
    // this.finalSearchInput = this.searchInput;  
  }  
}

如果需要将防抖函数封装,可以试下以下方式:

@Entry  
@Component  
struct SearchDemo{  
  build() {  
    Column(){  
      Text('点击')  
        .fontSize('25fp')  
        .fontColor(Color.White)  
        .fontWeight(FontWeight.Bold)  
        .borderRadius(15)  
        .padding(8)  
        .backgroundColor(Color.Blue)  
        .onClick(() => {  
          this.funDebounce();  
        })  
    }  
  }  
  funDebounce = this.debounce(this.setFinalInput, 300);  
  debounce(fn: Function, wait: number = 300) {  
    let timeout: number = -1;  
    console.log("debounce");  
    console.log("this",JSON.stringify(this))  
    console.log('测试');  
    return () => {  
      console.log('返回中---');  
      if(timeout!=-1){  
        clearTimeout(timeout);  
      }  
      timeout = setTimeout(fn.bind(this), wait);  
      console.log("==timeout==",timeout);  
    }  
  
  }  
  
  setFinalInput() {  
    console.log("setFinalInput this", JSON.stringify(this));  
    // this.finalSearchInput = this.searchInput;  
  }  
}
分享
微博
QQ
微信
回复
2024-10-28 16:26:00
相关问题
HarmonyOS 如何在builder函数传入组件
216浏览 • 0回复 待解决
HarmonyOS web组件onalert函数咨询
112浏览 • 1回复 待解决
HarmonyOS ArkTS如何实现泛型构造函数
359浏览 • 1回复 待解决
求大佬告知如何实现截屏功能
1912浏览 • 1回复 待解决
求告知如何实现截屏功能
480浏览 • 1回复 待解决
气泡组件有推荐实现方式么?
313浏览 • 1回复 待解决
如何实现截屏功能,有人知道吗?
1898浏览 • 1回复 待解决
组件自定义回调函数实现
266浏览 • 1回复 待解决
HarmonyOS 应用灰度设置实现方式
363浏览 • 1回复 待解决
HarmonyOSCPP crash具体方案吗
268浏览 • 1回复 待解决
http并行下载实现方式
340浏览 • 1回复 待解决
弹窗组件调用父组件函数传递
908浏览 • 1回复 待解决