javascript - CSS 样式在 React 生命周期中应用在哪一点?
问题描述
我试图了解哪个生命周期点 CSS 样式开始应用于 DOM 元素。
遇到一个问题,我需要clientWidth
在应用所有样式后获取元素。我的测试表明我不能依赖useEffect
钩子,因为我得到的结果不一致。
我用一个简单的<did/>
元素对其进行测试,该元素应该采用完整的父宽度(网格容器)。
const divRef = useRef()
useEffect(() => {
console.log(divRef.current.clientWidth)
})
<div class="parent">
<div ref={divRef} class="child" />
</div>
我希望宽度 === 280 像素,但大多数时候(比如说)980 像素。如果我把console.log
一切timeout
都开始按预期工作。useEffect
在应用样式之前明确运行。
有人可以为我澄清如何获得可靠的结果吗?
解决方案
class
与 DOM 属性的发射和style
属性相比,React 并没有真正涉及到 CSS 。它从不“应用” CSS,实际上您可能的意思可能是 DOM 中可能发生的一堆事情的集合:
- 从已加载的样式表中生效的新样式
- 由于窗口调整大小而改变布局
- 由于应用了字体而发生重排
请参阅什么强制布局/重排以了解此范围。
可悲的是,当元素的布局发生变化或发生重排时,HTML 没有 DOM 事件,因此如果您需要获取元素尺寸,则必须修改它。一种简单的技术是定期检查 DOM 元素尺寸的轮询循环。如果您不想连续轮询,您可以在一段时间后切断轮询器并添加一个窗口调整大小事件侦听器来调整尺寸
function YourComponent() {
const [width, setWidth] = useState(0);
const divRef = useRef(null);
function checkWidth() {
if (divRef.current && divRef.current.clientWidth !== width) {
setWidth(divRef.current.clientWidth);
}
}
useEffect(() => {
const interval = setInterval(checkWidth, 1000);
return () => clearInterval(interval);
}, []);
useEffect(() => {
window.addEventListener('resize', checkWidth);
return () => window.removeEventListener('resize', checkWidth);
}, []);
return (
<div ref={divRef}>
...
</div>
);
}
推荐阅读
- angular - 角度加载按钮 ExpressionChangedAfterItHasBeenCheckedError
- postgresql - PostgreSQL/PostDock:主节点中的自动恢复失败
- mongodb - 如何在spring mongo聚合中将日期转换为时间戳
- ios - Swift 十六进制转字节 (iOS)
- sql - 查询员工是否有超过 14 天的假期查看谁
- php - 如果 $a = 3 和 $b = 100 那么我可以从 php 中的 $c 变量(例如 $c = 3)中的 $b=100 中减去多少。?
- css - 如何锁定网站以适应视口而不能够在移动设备上水平滚动
- mysql - 如何使用光标的条件进行更新
- c# - SetBoundsCore 有什么用?
- always-encrypted - 始终加密的数据库