Hooks

为什么 hooks

class 组件的缺点

hook 为什么不能放在循环、条件、嵌套函数执行(为什么顺序调用对 React Hooks 很重要?)

步骤:

hooks 实现为什么用数组不用 map

React 如何区分 Class 组件和 Function 组件

hooks 特性

定时器的例子

// 先点击 alert,再点击几次 add 增加 count,3 秒后弹出的是点击 alert 时的状态
function Counter() {
  const [count, setCount] = useState(0);

  function handleAlertClick() {
    setTimeout(() => {
      alert('You clicked on: ' + count);
    }, 3000);
  }

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>add</button>
      <button onClick={handleAlertClick}>alert</button>
    </div>
  );
}

// 而如果是在类组件中,则会正确弹出状态的当前值
// 因为类组件的状态保存在实例属性上,状态改变实例不会销毁

hooks 缺点

过度使用 useMemo 后果

使用前应该先思考三个问题:

hooks 常用 API

Hook 使用规则和注意

自定义 hooks

useEffect 为什么不能传入异步函数

理由是 effect function 应该返回一个销毁函数,如果 useEffect 第一个参数传入 async,返回值则变成了 Promise,会导致 react 在调用销毁函数的时候报错:function.apply is undefined

为什么这样设计:

useEffect 的返回值是要在卸载组件时调用的,React 需要在 mount 的时候马上拿到这个值,不能有延迟

解决:

useEffect 实现防抖

useEffect(() => {
  const timer = setTimeout(async () => {
    await fetchData(deps);
  }, 500);

  return () => clearTimeout(timer);
}, [deps]);

不能直接向 useEffect 传递防抖函数,因为 useEffect 常依赖 props 或者 useState 返回的值,当两种值改变后,都会触发 Function 组件重新渲染,那么 useEffect 又会重新执行一遍,生成一个新的防抖后的函数

参考

https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/