hooks不能用于class组件

useEffect

可以在函数组件中执行副作用操作
副作用操作:数据获取,设置订阅,手动更改 React 组件中的 DOM 等

控制执行

React 会等待浏览器完成画面渲染之后才会延迟调用 useEffect

useEffect(()=>{}),不传第二个参数(默认情况下)每次渲染完成后都执行

useEffect(()=>{},[x]),如果传入[x]作为第二个参数,当渲染结束后,React把渲染前的[x]与渲染后的[x]做一个对比,如果x===x,那么React回跳过effect。
如果数组中有多个元素,只要任意一个发生变化,React也会执行effect。

useEffect(()=>{},[]),如果第二个参数是一个空数组[],那么effect仅在组件挂载和卸载时执行。

自定义Hook

实现第一次渲染不执行,此后每一次渲染后都执行

  1. const useUpdate=(fn,dep)=>{
  2. const [count,setCount]= useState(0)
  3. useEffect(()=>{
  4. setCount(x=>x+1)
  5. },[dep])
  6. useEffect(()=>{
  7. if(count>1){
  8. fn()
  9. }
  10. },[count,fn])
  11. }