【问题标题】:How to utilize ResizeObserver for multiple behaviors如何将 ResizeObserver 用于多种行为
【发布时间】:2021-05-12 12:32:41
【问题描述】:

似乎ResizeObserver 最适合在您有一个实例管理许多元素的行为时使用(正如"ResizeObserver one vs multiple performance" 中的one of the sources 中指出的那样):

在 2 秒的宽度/高度动画期间观察 126 个 div 的大小。

  1. 所有元素都由单个 ResizeObserver 观察。

    总观察时间:69ms

  2. 每个元素都由单独的 ResizeObserver 观察。

    总观察时间:585ms

但是,据我所知,您只能为ResizeObserver 的实例真正指定一个行为,然后针对它所观察的任何元素运行该行为。 我应该如何观察具有不同行为的多个元素?据我所知,我可以:

  • 使用ResizeObserver 的单个实例并在运行时确定应该对给定元素使用什么行为(这似乎不必要的复杂,而且我不知道比较元素引用在生产中的可靠性如何),或者
  • 使用ResizeObserver 的多个实例,这会使行为更简单,但理论上会降低性能。

另外,使用多个ResizeObserver 实例的性能损失是否甚至是我应该担心的中小型规模?

【问题讨论】:

    标签: javascript performance observers


    【解决方案1】:

    ...在运行时找出应该对给定元素使用什么行为(这似乎不必要地复杂,而且我不知道比较元素引用在生产中的可靠性如何)...

    我认为这不需要特别复杂。

    您可以拥有一组行为,每个行为都有一个predicate 函数和一个handler 函数。谓词确定它是否适用于给定元素,并且处理程序执行该行为。 (如果你有成千上万的行为,这可能不是超级性能,但我假设你没有。)

    类似的东西?

    const behaviors = [
      {
        predicate: element => element.classList.contains('first'),
        handler: element => {
          // do stuff
        }
      },
      {
        predicate: element => element.classList.contains('second'),
        handler: element => {
          // do other stuff
        }
      },
    ];
    
    const observer = new ResizeObserver((entries) => {
        for (let entry of entries) {
          // for single behavior
          behaviors.find(b => b.predicate(entry))?.handler(entry);
          
          // or every applicable behavior
          behaviors
            .filter(b => b.predicate(entry))
            .forEach(b => b.handler(entry);
        }
    })
    

    【讨论】:

    • 我比我想象的更喜欢这个解决方案(它涉及匹配元素引用和从那里运行处理程序),但是我仍然不确定这是我想要的那种粒度或工作流.
    • 很公平。考虑到行为列表不一定要像这样集中在一个地方。您可以从应用程序中任何有意义的地方导入行为,并从那里创建完整的数组。 [ ...dogBehaviors, ...catBehaviors, ...beaverBehaviors ] 或其他。
    • 有道理,我会尝试一下,看看它在我的正常工作流程中的可行性
    猜你喜欢
    • 2010-12-01
    • 2023-01-25
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2019-02-07
    • 2021-03-05
    相关资源
    最近更新 更多