防抖踩坑详细教程

防抖踩坑超详细

  • 1.为啥我的防抖不生效

保持干净的防抖

/* 首先先正常调用我们频繁调用的函数 */
/* 但是 但是 我们不能在这里做任何操作 并使用 persist() 来保留合成事件对象 */
/* 接下来执行一个我们写的防抖函数 */
/* 举个🌰: */

const myDebounceFun = _.undebounce((e) => {
  /* after 300ms dosomething.... */
}, 300);

const onChange = (e) => {
  e.persist();
  myDebounceFun(e);
};

return (
  <div>
    <Input onChange={onChange} />
  </div>
);

状态变量更新导致函数重新加载导致渲染

const [value, setValue] = useState();

const myDebounceFun = _.debounce((data) => {
  console.log("我触发了接口", data);
}, 1000);

/* 如果此处咩有进行使用useCallback包裹,使用setState之后,页面重新渲染,从而导致生成新的onchange函数,不同的函数去调用myDebounceFun函数,那也就是意味着onchange执行多少遍,那这个防抖函数就回执行多少遍(不是来源于同一个onchange函数),所有加上usecallback之后就会能保证每次调用的onchange函数都是同一个  */
const onchange = useCallback((e) => {
  const data = e.target.value;
  setValue(data);
  myDebounceFun(e.target.value);
}, []);

return (
  <div>
    <Input value={value} onChange={onchange} />
  </div>
);
  • 2.为啥设置完防抖无法输入
 /* 首先频繁触发事件的组件中的 value是不需要使用状态变量去绑定的 */
 /* 举个🌰: */
 /* bad */
 <Input value={inputValue} onChange={onChange}>

 <Input onChange={onChange}>

究其原因你还要一直,

setState({inputValue: ....})
posted @ 2023-09-15 10:54  郭杰前端开发  阅读(23)  评论(0编辑  收藏  举报
## 希望内容对你有帮助,如果有错误请联系我 q: 1911509826,感谢支持