react组件生命周期:呈现和返回之间以及在返回之后发生的区别是什么?

46qrfjad  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(323)

这是一个关于组件生命周期中概念的广义问题。下面是一些示例代码。请将代码视为模糊的参考。

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'; 在回来之前?

9njqaruj

9njqaruj1#

首先,让我们定义一些关键字。
什么是油漆?
绘制:当用户代理将渲染树转换为屏幕上的像素时,它已执行“绘制”(或“渲染”)。形式上,我们认为用户代理在执行更新事件循环的渲染步骤时已经“呈现”文档。
油漆参考
什么事 render 它是如何工作的?
基本上,渲染过程是浏览器绘制,只需稍微多一些步骤。react需要定义要(重新)渲染的内容和不渲染的内容。这一过程也被称为和解。
更多关于和解
问题1 useEffect 等待浏览器完成绘制,以便渲染过程不会被浏览器阻止 useEffect 执行。如果您不想等待油漆完成,可以使用 useEffectLayout 问题2
查看dan abramov(react的核心成员之一)的这篇精彩文章
类与功能组件
问题3和问题1的第一部分
我不能比这个人解释得更好。所以,也来看看这个。https://stackoverflow.com/a/65225493/7942117

相关问题