React 类组件及函数组件结合Lodash debounce需要注意的问题和一种解决方法

在React组件中使用Lodash debounce函数,可能会出现防抖不生效的情况。
导致这个问题的主要原因:重新render导致debounce函数第一个参数是新生成的,而不是对同一个函数的引用
需要注意的就是debounce接收的第一个函数参数在不同的render周期内不是重新生成的,引用保持不变。

  • class组件
<Search style={{ marginBottom: 8 }} placeholder="Search" onChange={this.onChange} />

//class组件中通过绑定到this上来保证不同生命周期中handleChange的引用不变
onChange = e => {
   e.persist();
   if (!this.handleChangeDebounce) {
     this.handleChangeDebounce = debounce(this.handleChange, 500);
   }
   this.handleChangeDebounce(e);
 };

handleChange = e => {
 //具体的业务逻辑
}
  • function组件
<Input placeholder="请输入股数" onChange={debounceHandleChange} />
  
  //在函数组件中用useCallback来确保不同生命周期内函数引用不变
  const changeFun = useCallback(value => {
    console.log('vvv', value);
    //具体的业务逻辑
  }, []);
  
  const debounceFun = useCallback(
    debounce(changeFun, 500, {
      leading: false,
      trailing: true
    }),
    [changeFun]
  );

  const debounceHandleChange = useCallback(
    e => {
      if (e.target && e.target.value) {
        console.log('===', e.target.value);
        debounceFun(e.target.value);
      }
    },
    [debounceFun]
  );
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容