useLayoutEffect

2021-01-10  本文已影响0人  我是Msorry

布局副作用

特点

经验

function App() {
  const [n, setN] = useState(0)
  useEffect(()=>{
    document.querySelector('#App').innerText = `n: 1000`
  },[n])
  return (
    <div id="App">
      n:{n}
    </div>
  );
}

因为useEffect在render之后调用,页面会有一个从0变成1000的短暂闪烁


function App() {
  const [n, setN] = useState(0)
  useLayoutEffect(()=>{
    document.querySelector('#App').innerText = `n: 1000`
  },[n])
  return (
    <div id="App">
      n:{n}
    </div>
  );
}
image.png

正常情况下,DOM操作很多,等DOM操作完,再去渲染,useLayoutEffect在渲染前,改变DOM

useEffect和useLayoutEffect的时序

function App() {
  const [n, setN] = useState(0)
  const time = useRef(null)
  const onClick = () => {
    setN(i => i + 1)
    time.current = performance.now()
  }
  useEffect(() => {
    if(time.current){
      console.log('useEffect时序')
      console.log(performance.now()-time.current)
    }
  })
  useLayoutEffect(() => {
    if(time.current){
      console.log('useLayoutEffect时序')
      console.log(performance.now()-time.current)
    }
  })
  return (
    <div className="App">
      n:{n}
      <button onClick={onClick}>+1</button>
    </div>
  );
}

image.png
上一篇 下一篇

猜你喜欢

热点阅读