【发布时间】:2021-09-20 21:47:03
【问题描述】:
这是一个关于 React 组件生命周期中概念的通用问题。 下面是一些示例代码。请把代码当作一个模糊的参考。
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>
);
};
我注意到在函数式组件中,我传递给钩子 useEffect() 的函数是在 return() 执行后执行的。 (useEffect() 中定义的console.log('check useEffect') 仅在return() 内的renderContent 方法内执行了一些其他控制台日志后才会执行。
-
我知道根据定义,
useEffect()在组件完成渲染后被调用。那么完成render意味着什么? -
组件“渲染”和组件“返回”(React 功能组件)之间的关系是什么
-
在
useEffect()内,我们总是返回document.body.style.overflow = 'visible';,那么为什么还要在返回之前运行document.body.style.overflow = 'hidden';?
【问题讨论】:
标签: javascript reactjs react-hooks react-functional-component