Routes.push() 在 NextJS 中没有按预期工作

Posted

技术标签:

【中文标题】Routes.push() 在 NextJS 中没有按预期工作【英文标题】:Routes.push() not working as expected at NextJS 【发布时间】:2019-12-18 14:39:41 【问题描述】:

当用户尝试在未经身份验证的情况下访问应用程序的仪表板时,我试图将用户重定向到主页,但 Route.push() 不起作用。

我试图将Router.push('/') 更改为Router.push('/hey') -> 一个不存在的页面,这有效,路由改变了。此外,当我尝试访问类似 Router.push('/auth/signin') 的路径时,它在 Router.push('/auth') 工作时不起作用

import  isAuthenticated  from "../helpers/auth";
import  Component  from "react";
import  Router  from "../routes";

class Ads extends Component 
  // static async getInitialProps(ctx) 
  //   if (ctx && ctx.req) 
  //     console.log(ctx);
  //     //ctx.res.writeHead(302,  Location: `/` );
  //     ctx.res.end();
  //    else 
  //     console.log("client side");
  //     console.log(localStorage.getItem("auth-token"));
  //   
  // 

  handleAuthentication = () => 
    if (localStorage.getItem("auth-token")) 
      return true;
    
  ;

  componentDidMount() 
    if (this.handleAuthentication()) 
      console.log("hey");
     else 
      Router.pushRoute("/auth/signup");
    
  

  render() 
    return (
      <div>
        <p> Dashboard </p>
      </div>
    );
  


export default Ads;

【问题讨论】:

【参考方案1】:

您似乎在使用next-routerdependecy?

尝试使用next/router(来自 nextjs 的默认依赖项),它在我的代码中运行良好:

import Router from "next/router";

 other code... 

Router.push("/auth/signup");

【讨论】:

现在我更改为 Router.push("/ads", "/"),并且 url 正在更改但没有重定向。这是我的仓库:github.com/LauraBeatris/befree-front 你有没有试过加第三个参数shallow true?似乎您想使用别名,请阅读此处的文档github.com/zeit/next.js#shallow-routingRouter.push(href, as, shallow: true ) 现在我这样做了:`componentDidMount() const as = "/"; if (!localStorage.getItem("auth-token")) Router.push("/ads", as, shallow: true ); //window.location.reload(); ` 仍然只是将 url 更改为 localhost:3000/ads 到 localhost:3000,这就是我想要的,但页面仍然在同一个地方 我正在尝试同样的问题,知道如何解决吗? @user615274 你有什么问题?使用相同的 next-router 依赖项?【参考方案2】:

我遇到了同样的问题并找到了解决方法,但不是解决方案。我用window.location

//keep your base urls in a global variables file
import  devUri, productionUri  from "../globalVariables";


push = (route = "") => 
  const uri = process.env.NODE_ENV === "production" ? productionUri : devUri;
  window.location = uri + '/' + route



push("/auth/signup")
push("/path/to/whatever/route/you/like")
push() //navigates to your base uri

您可以将该函数保存到您的 globalVariables.js 版本中,并根据需要导入(与从 3rd 方模块导入其他函数的方式非常相似)

import devUri, productionUri, push from "../globalVariables";

顺便说一句,我遇到了与您完全相同的问题:Router.push("/") 或任何其他存在的地址似乎根本没有触发,Router.push("/unexistentlocation")正常工作

【讨论】:

【参考方案3】:

这很好用,而且是一种干净而现代的方式(使用 Hooks)。

步骤是:-

    先导入
   import  useRouter  from 'next/router';
    声明
   const router = useRouter();
    使用它
   router.push('/search');

例子

import  useRouter  from 'next/router';

const Banner = () => 

    const router = useRouter();

    const sendToSeachPage = () => 
        router.push('/search');
    ;


   return ( .... )


【讨论】:

以上是关于Routes.push() 在 NextJS 中没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Nuxt 使用双冒号编码/解码 URI

无法从 nextjs 中的 api 获取图像-TypeError:无法读取未定义的属性(读取“地图”)NEXTJS

在 NextJS 中导入 SVG

为啥在 nextjs 链接中使用标签?

如何在 nextjs 中使用 keycloak?

NextJS:TailwindCSS 无法在生产环境中工作