React hooks - useLayoutEffect

useLayoutEffect

用法

useLayoutEffect 和 useEffect 的使用方式很相似:

  1. useLayoutEffect 接收一个函数和一个依赖项数组作为参数
  2. 只有在数组中的依赖项发生改变时才会再次执行副作用函数
  3. useLayoutEffect 也可以返回一个清理函数
javascript 复制代码
useEffect(()=>{
  return () => {}
}, 依赖项数组)
区别
hooks名称 执行时机 执行过程
useEffect 在浏览器重新绘制屏幕 之后 触发 异步 执行,不阻塞浏览器绘制
useLayoutEffect 在浏览器重新绘制屏幕 之前 触发 同步 执行,阻塞浏览器重新绘制
javascript 复制代码
export const RandomNumber: React.FC = () => {
  const [num, setNum] = useState(Math.random() * 200)

  useEffect(() => {
    if (num === 0) {
      setNum(10 + Math.random() * 200)
    }
  }, [num])

  return (
    <>
      <h1>num 的值是:{num}</h1>
      <button onClick={() => setNum(0)}>重置 num</button>
    </>
  )
}

将useEffect改成useLayoutEffect后数字不再闪烁

因为点击按钮时,num 更新为 0,但此时页面不会渲染,而是等待 useLayoutEffect 内部状态修改后才会更新页面,所以不会出现闪烁

javascript 复制代码
export const RandomNumber: React.FC = () => {
  const [num, setNum] = useState(Math.random() * 200)

  useLayoutEffect(() => {
    if (num === 0) {
      setNum(10 + Math.random() * 200)
    }
  }, [num])

  return (
    <>
      <h1>num 的值是:{num}</h1>
      <button onClick={() => setNum(0)}>重置 num</button>
    </>
  )
}
相关推荐
大风起兮云飞扬丶1 小时前
react大列表更新时优化
前端·react.js·前端框架
黛色正浓1 小时前
【React18+TypeScript】React 18 for Beginners
javascript·react.js·typescript
Zhi.C.Yue1 小时前
React 状态更新中的双缓冲机制、优先级调度
前端·javascript·react.js
前端郭德纲3 小时前
React 19.2 已发布,现已上线 npm!
前端·react.js·npm
随风一样自由3 小时前
React编码时,什么时候用js文件,什么时候用jsx文件?
开发语言·javascript·react.js
AI分享猿3 小时前
雷池 WAF vs React 高危漏洞:1 毫秒检测延迟,护住全栈业务安全
前端·安全·react.js
开发者小天3 小时前
react中todolist小案例
前端·react.js·前端框架
七月丶3 小时前
Cloudflare 🌏 中国大陆网络访问优化 - 0元成本
人工智能·react.js·设计模式
北辰alk3 小时前
React页面刷新数据不丢失?5种方案全解析!
react.js
Mintopia3 小时前
🎯 Rect 中鼠标移动拾取元素可行性架构分析
前端·react.js·架构