【问题标题】:React component life cycle: what is difference between render and return and happens after the return?React 组件生命周期:render 和 return 之间有什么区别,return 之后会发生什么?
【发布时间】: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 方法内执行了一些其他控制台日志后才会执行。

  1. 我知道根据定义,useEffect() 在组件完成渲染后被调用。那么完成render 意味着什么?

  2. 组件“渲染”和组件“返回”(React 功能组件)之间的关系是什么

  3. useEffect() 内,我们总是返回document.body.style.overflow = 'visible';,那么为什么还要在返回之前运行document.body.style.overflow = 'hidden';

【问题讨论】:

    标签: javascript reactjs react-hooks react-functional-component


    【解决方案1】:

    首先,让我们定义一些关键字。

    什么是油漆?

    Paint:当用户代理执行“绘制”(或“渲染”)时 已将渲染树转换为屏幕上的像素。正式地,我们 认为用户代理已经“渲染”了一个文档 执行更新事件循环的渲染步骤。

    Paint reference

    render 是什么以及它是如何工作的?

    基本上,渲染过程是浏览器绘制,步骤不多。 React 需要定义(重新)渲染什么和不渲染什么。此过程也称为对帐。

    More on reconciliation

    问题 1

    useEffect 等待浏览器完成绘制,以便您的渲染过程不会被您的useEffect 执行阻塞。如果您不想等待绘画完成,可以使用useEffectLayout

    问题 2

    查看 Dan Abramov(React 的核心成员之一)的这篇精彩文章

    Class vs Functional Components

    问题 3 和第一季度的第一部分

    我无法比这个人解释得更好。所以也检查一下这个。 https://stackoverflow.com/a/65225493/7942117

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 1970-01-01
      • 2022-11-22
      • 2011-08-26
      • 2020-05-10
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      相关资源
      最近更新 更多