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

Next.js中pages/index.js内Router.push跳转后页面空白问题求助

解决Next.js + Next-Auth认证后跳转页面空白问题

问题原因

你的Home组件在用户认证状态(status === "authenticated")分支下没有返回任何React元素,直接调用router.push。React要求组件必须返回一个合法的JSX节点(或null),这种情况下会触发渲染错误,导致跳转后页面空白。刷新/dashboard/users时直接加载目标页面,绕开了Home组件的错误逻辑,所以显示正常。

修复方案

方案1:在认证分支返回合法JSX

在authenticated分支中添加返回值,比如null或加载提示,确保组件符合React的渲染要求:

import { useRouter } from "next/router";
import Link from "next/link";
import { useSession } from "next-auth/react";
import Head from "next/head";
import { GoogleButton } from "~/components";

export default function Home() {
  const router = useRouter();
  const { data: session, status } = useSession();
  console.log("inside index");

  if (status === "authenticated") {
    console.log("status is:", status);
    router.push("/dashboard/users");
    // 返回null或加载提示,满足React组件渲染要求
    return null;
    // 或者返回加载状态:return <p>Redirecting to dashboard...</p>;
  } else if (status === "unauthenticated") {
    console.log("status is:", status);
    return (
      <>
        <Head>
          <title>Login</title>
        </Head>
        <div className="mt-72 text-center">
          <GoogleButton />
        </div>
      </>
    );
  } else if (status === "loading") {
    console.log("status is:", status);
    return <p>loading</p>;
  }
  // 兜底返回,避免所有条件都不匹配的情况
  return null;
}

方案2:使用useEffect执行跳转(更推荐)

把跳转逻辑放到useEffect中,确保组件先完成渲染,再触发路由跳转,彻底避免渲染错误:

import { useRouter } from "next/router";
import Link from "next/link";
import { useSession } from "next-auth/react";
import Head from "next/head";
import { GoogleButton } from "~/components";
import { useEffect } from "react";

export default function Home() {
  const router = useRouter();
  const { data: session, status } = useSession();
  console.log("inside index");

  useEffect(() => {
    if (status === "authenticated") {
      console.log("status is:", status);
      router.push("/dashboard/users");
    }
  }, [status, router]);

  if (status === "unauthenticated") {
    console.log("status is:", status);
    return (
      <>
        <Head>
          <title>Login</title>
        </Head>
        <div className="mt-72 text-center">
          <GoogleButton />
        </div>
      </>
    );
  } else if (status === "loading") {
    console.log("status is:", status);
    return <p>loading</p>;
  }

  // 认证状态下返回加载提示或null
  return <p>Redirecting to dashboard...</p>;
}

为什么刷新后正常?

刷新/dashboard/users时,Next.js直接渲染该页面,不会经过Home组件的错误逻辑,因此页面能正常加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:40:38