如何在应用程序的客户端内使用 router.replace?

Posted

技术标签:

【中文标题】如何在应用程序的客户端内使用 router.replace?【英文标题】:How to use router.replace inside the client side of your app? 【发布时间】:2020-09-18 06:42:37 【问题描述】:

我正在尝试使用 Next.js 路由器重定向未经授权的用户访问包装在 AdminLayout 组件中的某些页面,但我收到了这个错误。

错误:未找到路由器实例。你应该只使用“下一个/路由器” 在应用的客户端内。

// Other imports
import Router from "next/router";

class AdminLayout extends React.Component 
  render() 
    const  currentUser  = this.props;

    if (currentUser === undefined) 
      console.log(currentUser);
      return null;
    

    if (currentUser == null) 
      console.log(currentUser);
      //this is how I tried to redirect
      Router.replace("/admin/login");
    
    return (
      // Other irrelevant code
    );
  


const mapStateToProps = (state) => (
  currentUser: state.user.currentUser,
);

export default connect(mapStateToProps)(AdminLayout);

有什么办法解决这个问题?

【问题讨论】:

【参考方案1】:

render 方法也在服务器中执行,因此你得到了异常。

通常将副作用(例如重定向)放在render 方法中是一种不好的做法

你应该把它放在只在客户端运行的componentDidMount 中。

// Other imports
import Router from "next/router";

class AdminLayout extends React.Component 
  componentDidMount() 
    const currentUser = this.props;

    if (currentUser === undefined) 
      console.log(currentUser);
      return null;
    

    if (currentUser == null) 
      console.log(currentUser);
      //this is how I tried to redirect
      Router.replace('/admin/login');
    
  
  render() 
    const currentUser = this.props;

    if (currentUser === undefined) 
      console.log(currentUser);
      return null;
    
    return (
      // Other irrelevant code
    );
  


const mapStateToProps = (state) => (
  currentUser: state.user.currentUser,
);

export default connect(mapStateToProps)(AdminLayout);

如果你想在服务器端重定向,你需要使用在服务器上运行的getInitialProps / getServerProps,服务器端的这些方法会获取服务器@987654327 @ & response 使您能够从服务器重定向。

class AdminLayout extends React.Component 
   static getInitialProps ( res ) 
      if(someCondition) 
        res.redirect('/your-path');
      
   
   ...

【讨论】:

有什么方法可以在页面呈现之前进行重定向? 更新了答案 但是 getInitialProps() 不是只适用于页面而不适用于组件吗? (AdminLayout是一个组件,这里不运行getInitialProps) 正确,您不能从组件内重定向到其他页面。通过 componentDidMount 的客户端重定向或页面级别的服务器端。 有什么建议吗?

以上是关于如何在应用程序的客户端内使用 router.replace?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Apple 服务器获取应用内购买列表

外网如何访问内网SQL数据库

如何在流星内访问客户端上的服务器聚合

使用 socket.io 时如何获取房间内的客户端数量?

如何在线程内启动异步目标

A电脑使用深信服的VPN客户端连接公司内网,其他电脑如何通过A电脑来访问公司内网?