代码之家  ›  专栏  ›  技术社区  ›  XYZ

直接设置DOM属性和通过requestAnimationFrame设置DOM属性有什么区别?

  •  0
  • XYZ  · 技术社区  · 8 年前

    我正在阅读BluePrintJS源代码,注意到它们将DOM元素属性更改逻辑放在 requestAnimationFrame 阻止。直接设置DOM属性和通过requestAnimationFrame设置DOM属性有什么区别?

    private handlePopoverClosing = (node: HTMLElement) => {
        // restore focus to saved element.
        // timeout allows popover to begin closing and remove focus handlers beforehand.
        requestAnimationFrame(() => {
            if (this.previousFocusedElement !== undefined) {
                this.previousFocusedElement.focus();
                this.previousFocusedElement = undefined;
            }
        });
    
        const { popoverProps = {} } = this.props;
        Utils.safeInvoke(popoverProps.onClosing, node);
    };
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Dan    8 年前

    requestAnimationFrame 将在渲染帧开始时运行,这有助于 layout thrashing

    通过这样做,您可以将所有DOM更改分组到一个一次完成的帧中,而不是将呈现逻辑分散到多个帧中,这样做成本更高(DOM工作是很低的)。

    一般的想法是,您希望对DOM写入进行分组,使它们在DOM读取之前发生,而不是在写入之间穿插读取—rAF通过确保写入在特定的时间发生,并与其他写入一起进行。