You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载屏显示时如何隐藏/展示所有React组件?Next.js路由切换场景实现咨询

实现路由切换时加载屏隐藏其他组件的方案

你当前的代码已经完成了路由切换状态的监听逻辑,仅需调整渲染逻辑+优化事件绑定即可实现需求,有两种常见实现方式:

方案1:条件渲染隐藏页面组件(完全不渲染其他组件)

当loading状态为true时,仅输出加载屏组件,不渲染页面内容,修改后的代码如下:

import "tailwindcss/tailwind.css";
import "../styles/main.css";
import Router from "next/router";
import { useState, useEffect } from "react";
import Loader from "../components/Loader/Loader";

function MyApp({ Component, pageProps }) {
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    // 绑定路由事件
    const handleStart = () => {
      console.log("Router change...");
      setLoading(true);
    };
    const handleComplete = () => {
      console.log("Router change completed");
      setLoading(false);
    };

    Router.events.on("routeChangeStart", handleStart);
    Router.events.on("routeChangeComplete", handleComplete);
    Router.events.on("routeChangeError", handleComplete); // 新增错误回调,避免加载失败一直显示加载屏

    // 组件卸载时解绑事件,防止内存泄漏
    return () => {
      Router.events.off("routeChangeStart", handleStart);
      Router.events.off("routeChangeComplete", handleComplete);
      Router.events.off("routeChangeError", handleComplete);
    };
  }, []);

  return (
    <>
      {loading ? (
        <Loader loadingbool={loading}/>
      ) : (
        <Component {...pageProps}/>
      )}
    </>
  );
}

export default MyApp;

注意:用useEffect包裹事件绑定逻辑,可避免页面多次渲染导致重复绑定事件的异常。

方案2:加载屏全屏覆盖(保留页面组件渲染,视觉上隐藏)

如果不需要销毁页面组件,仅要视觉上完全遮挡其他内容,可以给Loader组件添加全屏固定定位样式,不需要调整渲染逻辑,Loader示例样式参考:

.loader {
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background: #fff; /* 和站点背景色保持一致即可 */
  z-index: 99999; /* 确保层级高于所有页面组件 */
  display: flex;
  align-items: center;
  justify-content: center;
}

内容的提问来源于stack exchange,提问作者AlexMoshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:18:02