React-不能使用 context.router 来重定向页面

Posted

技术标签:

【中文标题】React-不能使用 context.router 来重定向页面【英文标题】:React-Cannot use context.router to redirect page 【发布时间】:2016-09-08 05:22:57 【问题描述】:

我想构建一个我的 react/react-router/flux 应用程序。 当用户输入秘密链接(如管理页面)时,我想将用户重定向到登录页面

这里是管理组件:

class App extends React.Component 
render() 
if (!adminLogin)
this.context.router.transitionTo('/login');

return (    
  <div className="wrapper">
        <Navbar />
        <SidebarLeft />
            <div className="content-wrapper">
            this.props.children
             </div>
        <Footer />
  </div>
 );
 App.contextTypes = 
    router: React.PropTypes.func
 ;
 export default App;

但是,我对反应上下文有疑问

TypeError: Cannot read property 'transitionTo' of undefined
at App.render (App.js:8:5)
at [objectObject].ReactCompositeComponentMixin._renderValidatedComponentWithoutOwnerOrContext (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactCompositeComponent.js:587:34)
at [object Object].ReactCompositeComponentMixin._renderValidatedComponent (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactCompositeComponent.js:607:32)
at [object Object].wrapper [as _renderValidatedComponent] (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactPerf.js:66:21)
at [object Object].ReactCompositeComponentMixin.mountComponent (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactCompositeComponent.js:220:30)
at [object Object].wrapper [as mountComponent] (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactPerf.js:66:21)
at Object.ReactReconciler.mountComponent (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactReconciler.js:37:35)
at [object Object].ReactCompositeComponentMixin.mountComponent (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactCompositeComponent.js:225:34)
at [object Object].wrapper [as mountComponent] (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactPerf.js:66:21)
at D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactServerRendering.js:42:38
at ReactServerRenderingTransaction.Mixin.perform (D:\web\MVCmodel\library\lib\node_modules\react\lib\Transaction.js:136:20)
at Object.renderToString (D:\web\MVCmodel\library\lib\node_modules\react\lib\ReactServerRendering.js:40:24)
at D:\web\MVCmodel\library\lib\server.js:326:27
at D:\web\MVCmodel\library\lib\node_modules\react-router\lib\match.js:58:5
at D:\web\MVCmodel\library\lib\node_modules\react-router\lib\useRoutes.js:120:15
at done (D:\web\MVCmodel\library\lib\node_modules\react-router\lib\AsyncUtils.js:49:19)

我对这个问题没有任何想法,也不知道如何解决。请帮帮我?

【问题讨论】:

【参考方案1】:

您似乎在 react-router 中使用了 browserHistory(pushState API)。我会使用它的推送功能,让路由器过渡到你的组件:

var Router = require('react-router');
Router.browserHistory.push('/login');

或在 ES6 语法中:

import browserHistory from ('react-router');
browserHistory.push('/login');

因此,考虑到这一点,您的完整代码应该更像这样:

import React, PropTypes, Component from 'react';
import browserHistory from 'react-router';

class App extends Component 

  render() 
    if (!adminLogin) 
      browserHistory.push('/login');
    
    return (
      <div className="wrapper">
        <Navbar />
        <SidebarLeft />
        <div className="content-wrapper">
          this.props.children
        </div>
        <Footer />
      </div>
    );
  


export default App;

【讨论】:

【参考方案2】:

路由器不是一个函数,它是一个对象。

这个

 App.contextTypes = 
    router: React.PropTypes.func
 ;

应该是

 App.contextTypes = 
    router: React.PropTypes.object
 ;

正如您在React-Router documentation 中看到的那样

-- 已编辑--

您也可以使用历史记录而不是路由器来实现。

App.contextTypes = 
        history: React.PropTypes.object
     ;

并像这样使用它

this.context.history.pushState(null, '/login');

【讨论】:

我改变了它。但它没有工作,并用同样的信息发出警报! :( 尝试添加一个构造函数并检查第二个参数,即上下文是否有路由器属性 我尝试添加constructor(props) super(props);,但结果相似。我不知道为什么 我也尝试在 render() 中添加console.log(this.context.router);。但结果是undefine 你的 react 路由器版本是什么?

以上是关于React-不能使用 context.router 来重定向页面的主要内容,如果未能解决你的问题,请参考以下文章

使用 React Router v4 正确重定向

react-router 不维护查询参数,调用 onEnter 两次

如何在 react-router v1.0.0 中填充 this.props.params?

React 路由器推送仅更改 url

路由问题:尝试重新路由时未定义 this.context.router

browserHistory.push() 和 context.router.push() 有啥区别