useCallback只创建一次事件句柄,每次渲染都是同一个函数
useCallback是 useMemo的一种变体
【注意:】不要滥用 useCallback

useCallback用法

  1. let prevFunc;
  2. function App() {
  3. // 每次渲染都会创建一个新的函数,性能低
  4. const onChange = () => {}
  5. // 每次渲染都是同一个函数
  6. const onChange = useCallback(() => {}, [])
  7. console.log(prevFunc === onChange)
  8. prevFunc = onChange
  9. }

useCallback不需要传入 clickCount

  1. function App(props) {
  2. const [count, setCount] = useState(0)
  3. // useMemo的值参与渲染
  4. const onClick = useCallback(() =>{
  5. setCount(clickCount => clickCount + 20)
  6. }, [clickCount])
  7. }

debounce

表单实时 onChange搜索,useCallback + debounce函数防抖

  1. import { debounce } from '@utils/func';
  2. function App() {
  3. const onSearch = useCallback(debounce((value) => {
  4. console.log(value)
  5. }, 1000));
  6. return (
  7. <Form onChange={onSearch}>
  8. ...
  9. </Form>
  10. )
  11. }