在 React hook 中,useEffect 用來取代 componentDidMount 和 componentDidUpdate。主要做用是當頁面渲染後,進行一些反作用操做(好比訪問 DOM,請求數據)。javascript
而 useLayoutEffect 的做用和 useEffect 幾乎差很少,你把你現有代碼的 useEffect 所有替換成 useLayoutEffect,你幾乎看不到任何差異。java
那它們的區別是什麼?看以下代碼:markdown
function App() { const [count, setCount] = useState(0); useEffect(() => { if (count === 0) { const randomNum = 10 + Math.random()*200 setCount(10 + Math.random()*200); } }, [count]); return ( <div onClick={() => setCount(0)}>{count}</div> ); } 複製代碼
運行上面的組件,點擊div,頁面會更新一串隨機數。dom
當你連續點擊時,你會發現這串數字在發生抖動。oop
緣由在於,當你每次點擊 div, count 會更新爲 0, 以後 useEffect 內又把 count 改成一串隨機數。spa
因此頁面會先渲染成0,而後再渲染成隨機數,因爲更新很快,因此出現了閃爍。code
接下來咱們將 useEffect 改成 useLayoutEffect:component
function App() { const [count, setCount] = useState(0); useLayoutEffect(() => { if (count === 0) { const randomNum = 10 + Math.random()*200 setCount(10 + Math.random()*200); } }, [count]); return ( <div onClick={() => setCount(0)}>{count}</div> ); } 複製代碼
閃爍消失了。orm
相比使用 useEffect,當你點擊 div,count 更新爲 0,此時頁面並不會渲染,而是等待 useLayoutEffect 內部狀態修改後,纔會去更新頁面,因此頁面不會閃爍。ip