背景: 在函数组件中使用debounce 不生效,函数依然会执行多次 原因: 重新render 导致debounce函数的第一个参数是新生成的,而不是对同一个函数的引用, 需要注意的就是 debounce 接收的第一个函数参数在不同的render 周期内不是重新生成的,引用保持不变

类组件使用debounce

  1. <Search style={{ marginBottom: 8 }} placeholder="Search" onChange={this.onChange} />
  2. //class组件中通过绑定到this上来保证不同生命周期中handleChange的引用不变
  3. onChange = e => {
  4. e.persist();
  5. if (!this.handleChangeDebounce) {
  6. this.handleChangeDebounce = debounce(this.handleChange, 500);
  7. }
  8. this.handleChangeDebounce(e);
  9. };
  10. handleChange = e => {
  11. //具体的业务逻辑
  12. }

函数组件中使用 debounce

  1. <Input placeholder="请输入股数" onChange={debounceHandleChange} />
  2. //在函数组件中用useCallback来确保不同生命周期内函数引用不变
  3. const changeFun = useCallback(value => {
  4. console.log('vvv', value);
  5. //具体的业务逻辑
  6. }, []);
  7. const debounceFun = useCallback(
  8. debounce(changeFun, 500, {
  9. leading: false,
  10. trailing: true
  11. }),
  12. [changeFun]
  13. );
  14. const debounceHandleChange = useCallback(
  15. e => {
  16. if (e.target && e.target.value) {
  17. console.log('===', e.target.value);
  18. debounceFun(e.target.value);
  19. }
  20. },
  21. [debounceFun]
  22. );