当前位置: 首页 > news >正文

React 中的 useLayoutEffect 钩子函数

useLayoutEffect钩子函数的作用跟useEffect钩子函数的作用一样,它们的不同主要是在于:

1、useEffect钩子函数是异步的,因为此函数在执行的时候是先计算出所有的 Dom 节点的改变后再将对应的 Dom 节点渲染到屏幕上,然而在 useEffect 函数中可能还存在某些还在后台运行的代码,这些后台代码的运行和 Dom 的渲染是互不影响的,所以这样就有可能在页面渲染效果上会有元素抖动的情况发生。

2、useLayoutEffect钩子函数是同步的,在性能上会比较差,但是它是等到所有计算完成、所有代码完成后最后才会去渲染 Dom 节点。

具体实例如下:

const UseLayoutEffectDemo: React.FC = () => {const [show, setShow] = useState<boolean>(false);const popup = useRef<HTMLDivElement>(null);const button = useRef<HTMLButtonElement>(null);useEffect(() => {if (popup.current === null || button.current === null) {return;} else {const { bottom } = button.current.getBoundingClientRect();popup.current.style.top = `${bottom + 25}px`;}});return (<div><button ref={button} onClick={() => setShow((prev) => !prev)}>切换状态</button>{show && (<div style={{ position: "absolute" }} ref={popup}>这是显示内容</div>)}</div>);
};

运行上述代码后,当你点击切换状态状态按钮后,这是显示内容的 div 元素会首先在按钮后显示,但是很快就会向下偏移 25px 的距离。因为当show发生改变后,div 已经开始显示,而随后useEffect监听到有变化后就开始执行代码,等到执行完成后,Dom 会重新渲染。这样 div 元素就会有抖动,只是这个抖动发生的很快。

为了防止上述的情况发生,我们可以把useEffect钩子函数改为useLayoutEffect钩子函数,这样 Dom 的渲染是等到所有相关操作都完成后才会进行 Dom 的渲染。

http://www.lryc.cn/news/162381.html

相关文章:

  • upload-labs1-21关文件上传通关手册
  • MATLAB遗传算法求解生鲜货损制冷时间窗碳排放多成本车辆路径规划问题
  • 界面控件DevExpress .NET应用安全 Web API v23.1亮点:支持Swagger模式
  • SpringMVC之CRUD------增删改查
  • 微信小程序开发教学系列(4)- 抖音小程序组件开发
  • RabbitMQ反序列化失败:Failed to convert message
  • CTFSHOW 年CTF
  • 肖sir__设计测试用例方法之状态迁移法05_(黑盒测试)
  • 无涯教程-JavaScript - IMPRODUCT函数
  • yapi以及gitlab的容器化部署
  • TCP、UDP 协议的区别,各自的应用场景
  • C高级 DAY3
  • Linux CentOS7命令及命令行
  • 【C++入门到精通】C++入门 ——搜索二叉树(二叉树进阶)
  • 学成在线-网站搭建
  • stm32同芯片但不同flash工程更换Device出现报错
  • Element UI实现每次只弹出一个Message消息提示
  • 「网页开发|前端开发|Vue」04 快速掌握开发网站需要的Vue基础知识
  • 解决Redis分布式锁主从架构锁失效问题的终极方案 含面试题
  • 建站系列(三)--- 网络协议
  • jetson orin nx无显示器启动
  • 【APUE】标准I/O库
  • es6---模块化
  • 【项目 计网12】4.32UDP通信实现 4.33广播 4.34组播 4.35本地套接字通信
  • 创建简单的 Docker 数据科学映像
  • angualr:CSS一个div内两个子元素的高度自适应
  • Java基础之static关键字
  • iPhone 15 Pro有5项重大设计升级,让iPhone 15看起来很无聊
  • xCode14.3.1运行MonkeyDev出现“Executable Not Found“的解决办法
  • C# Emgu.CV+Tesseract实现识别图像验证码