【问题标题】:React hooks scroll event performance issueReact hooks 滚动事件性能问题
【发布时间】:2019-11-13 20:30:48
【问题描述】:

任务:

在触摸设备上根据当前水平滚动位置获取.container.scrollLefttransform: translateX 图像。 .container 的宽度大于其 .wrapper

你可以在这里查看live example

问题:

图像移动,但 fps 极低。

预期行为:

快速流畅的移动。

详细说明:

非常感谢您阅读本文!我真的很纠结这个问题。在桌面版本上,我只是将图像位置与onMouseMove 事件绑定,一切都很好。但是对于移动版本,我尝试了 onTouch 事件和本机滚动事件,但没有按预期工作。我一直在寻找解决方案或一些工作示例,但一无所获。所以,我来了。

【问题讨论】:

    标签: reactjs touch react-hooks


    【解决方案1】:

    在这个useEffect 中,您将在每个渲染中添加滚动事件侦听器。因此,当它滚动时,它会重新渲染(应该如此),但它会多次重新添加侦听器。

    useEffect(() => {
        handleScroll();
        wrapperEl.current.addEventListener("scroll", handleScroll, {
          passive: true
        });
      });
    

    在第一次渲染时添加一次侦听器(使用[] 作为依赖数组)要高效得多(并且不太可能导致滚动不流畅)。您还应该通过返回一个在卸载时将其删除的函数来清理它:

    useEffect(() => {
        const el = wrapperEl.current;
        el.addEventListener("scroll", handleScroll, {
          passive: true
        });
        return () => el.removeEventListener("scroll", handleScroll);
      }, []);
    

    这可能足以让事情顺利进行。如果没有,那么您也可以限制您的 handleScroll 调用 - 有许多基于钩子的示例可用。

    【讨论】:

    • 现在好多了,谢谢!但是我在某些手机上的性能仍然存在问题。当您滚动过快的背景和图像通过黑色方块加载时。可能是因为代码警告useEffect 中缺少依赖项吗?当您将依赖项数组留空时,它会警告您缺少handleScroll。但是当您添加它时,它会警告handleScroll 在定义之前已被使用。无论如何,在大多数情况下代码都可以工作,但我想它可以更好:) 我在这里更新了我的演示 codesandbox.io/embed/dry-bird-tmy89
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2023-03-26
    • 2019-10-18
    相关资源
    最近更新 更多