这是一个关于组件生命周期中概念的广义问题。下面是一些示例代码。请将代码视为模糊的参考。
const Modal = ({
className,
variant,
width,
withCloseIcon,
isOpen: propsIsOpen,
onClose: tellParentToClose,
renderLink,
renderContent,
}) => {
const [stateIsOpen, setStateOpen] = useState(false);
const isControlled = typeof propsIsOpen === 'boolean';
const isOpen = isControlled ? propsIsOpen : stateIsOpen;
const $modalRef = useRef();
const $clickableOverlayRef = useRef();
const closeModal = useCallback(() => {
if (!isControlled) {
setStateOpen(false);
} else {
tellParentToClose();
}
}, [isControlled, tellParentToClose]);
useEffect(() => {
console.log('check useEffect')
document.body.style.overflow = 'hidden'; // why bother? since always return "visible"
return () => {
document.body.style.overflow = 'visible';
};
}, [isOpen]);
return (
<Fragment>
{isOpen &&
ReactDOM.createPortal(
<ScrollOverlay>
<ClickableOverlay variant={variant} ref={$clickableOverlayRef}>
<StyledModal
className={className}
ref={$modalRef}
>
{withCloseIcon && <CloseIcon type="close" variant={variant} onClick={closeModal} />}
{renderContent({ close: closeModal })}
</StyledModal>
</ClickableOverlay>
</ScrollOverlay>,
$root,
)}
</Fragment>
);
};
我注意到在函数组件中,我传递到hook useffect()的函数是在return()执行之后执行的( console.log('check useEffect')
在useffect()中定义的仅在 renderContent
方法内部的 return()
).
我从定义上知道, useEffect()
在组件完成渲染后调用。那么,拥有它意味着什么呢 render
完成了?
组件“呈现”和组件“返回”(功能组件)之间的关系是什么
在 useEffect()
,我们总是回来 document.body.style.overflow = 'visible';
那么,为什么还要费心跑步呢 document.body.style.overflow = 'hidden';
在回来之前?
1条答案
按热度按时间9njqaruj1#
首先,让我们定义一些关键字。
什么是油漆?
绘制:当用户代理将渲染树转换为屏幕上的像素时,它已执行“绘制”(或“渲染”)。形式上,我们认为用户代理在执行更新事件循环的渲染步骤时已经“呈现”文档。
油漆参考
什么事
render
它是如何工作的?基本上,渲染过程是浏览器绘制,只需稍微多一些步骤。react需要定义要(重新)渲染的内容和不渲染的内容。这一过程也被称为和解。
更多关于和解
问题1
useEffect
等待浏览器完成绘制,以便渲染过程不会被浏览器阻止useEffect
执行。如果您不想等待油漆完成,可以使用useEffectLayout
问题2查看dan abramov(react的核心成员之一)的这篇精彩文章
类与功能组件
问题3和问题1的第一部分
我不能比这个人解释得更好。所以,也来看看这个。https://stackoverflow.com/a/65225493/7942117