移动设备上的无限加载时间

Infinite load time on mobile device

我正在尝试显示加载程序直到页面完成呈现,为此我使用了以下代码:

export default function App() {
  const [isLoading, setIsLoading] = React.useState(true);

  const handleLoading = () => {
    setIsLoading(false);
  };

  useEffect(() => {
    window.addEventListener('load', handleLoading);
    return () => window.removeEventListener('load', handleLoading);
  }, []);

  return (
    <div>
      {isLoading ? (
        <Load />
      ) : (
        <div className="app">
          <Topbar />
          <div className="parts">
            <Intro />
            <About />
            <Projects />
            <Contact />
          </div>
        </div>
      )}
    </div>
  );
}

除隐身模式和移动设备外,这在桌面设备上运行良好。 它永远显示加载程序,当我按两次刷新按钮时,页面才会出现。 我在 gtmetrix 上测试了网站,但我收到了这个错误:Lighthouse Error: The page did not paint any content。 我该如何解决?

useEffect 会在你的状态改变时被调用,对吧?

那你觉得你的useEffect什么时候会被调用?

组件已创建,加载状态已设置为 true,一切正常,为什么您的组件会在状态未发生变化时调用您的 useEffect?

我有两个建议:

  1. 删除您的 'load' 事件侦听器并将其添加到您的主要功能代码中,这样事件侦听器将被启动。然后当页面加载时,它会将您的状态设置为 false,因此您的 useEffect 将被调用,并且它会删除事件侦听器。

  2. 是使用基于 class 的组件和生命周期挂钩,这些组件专为您正在尝试做的事情而设计。

我不确定 eventListener 在您的情况下是否正常工作,但如果我是您,我会简单地在 useEffect 中设置 IsLoading(false) 并且如果您希望它在组件安装之前停止,您可以通过这种方式进行:

export default function App() {
const [isLoading, setIsLoading] = React.useState(true);
const [mounted,setMounted] = React.useState(false);

if(!mounted) setIsLoading(false)

useEffect(() => {
    setMounted(true)
}, []);

return (
    <div>
        {isLoading ? (
            <Load />
        ) : (
            <div className="app">
                <Topbar />
                <div className="parts">
                    <Intro />
                    <About />
                    <Projects />
                    <Contact />
                </div>
            </div>
        )}
    </div>
);

}

希望对您有所帮助 ;)