Javascript redux如何使用react路由器在组件Willmount上重定向

Javascript redux如何使用react路由器在组件Willmount上重定向,javascript,reactjs,redux,react-router,Javascript,Reactjs,Redux,React Router,如何使用react路由器在组件Willmount上重定向 export class NewStock extends React.Component { constructor(props, context) { super(props, context); } componentWillMount() { const { session, dispatch, router } = this.props if (session.userSessionData

如何使用react路由器在组件Willmount上重定向

export class NewStock extends React.Component {
  constructor(props, context) {
    super(props, context);
  }

  componentWillMount() {
    const { session, dispatch, router } = this.props
    if (session.userSessionData.get('logged_in') == false) {
      router.transitionTo('/login')
    }
  };
此代码:

router.transitionTo('/login')
仅限退货:

Uncaught TypeError: router.transitionTo is not a function

尝试
此.props.history

const { history } = this.props
history.pushState(null, '/login') or
history.replaceState(null, '/login')

如果您的模块不是路由器的直接后代,您仍然可以通过将组件包装在
withRouter(YourComponent)
HOC(在v4中)中来访问此道具。

我所做的是使用路由的
oneter
道具。这使我能够更好地集中身份验证。我的灵感来自

我来这里是因为我和你一样在摸索,但很快就陷入了一大堆无法管理的代码中

希望所有来到这里的人都能从我的错误中吸取教训

function requireAuth(nextState, replace) {
    if (!UserStore.userIsSignedIn()) {
        replace({
            pathname: '/login',
            state: {nextPathname: nextState.location.pathname}
        })
    }
}

render((
    <Router history={hashHistory}>
        <Route path="/" component={PageHeader}>
            <IndexRoute component={AssignmentOverview} onEnter={requireAuth}/>
            <Route path="login" component={UserLoginForm}/>
            <Route path="logout" component={UserLogout}/>
            <Route path="profile" component={UserProfile} onEnter={requireAuth}/>
            <Route path="assignmentform" component={AssignmentForm} onEnter={requireAuth}/>
        </Route>
    </Router>
), document.getElementById('content'));
功能要求授权(下一状态,替换){
如果(!UserStore.userIsSignedIn()){
替换({
路径名:'/login',
状态:{nextPathname:nextState.location.pathname}
})
}
}
渲染((
),document.getElementById('content');

我只看到从Router.Navigation mixin使用transitiono()的示例。您需要添加该mixin,然后您就可以说
this.transition(…)
还有一件事,可能最好是在WillTransition静态回调上进行编程转换。这将在调用transitiono()之前的一段时间内阻止视图可见。对于我来说,我得
无法读取未定义的属性“pushState”
。似乎我对我的组件没有上下文。(使用相同的定义和构造函数)我必须道歉,我没有意识到这是redux。我在做自动取款机。所以我无论如何也不可能为我工作。抱歉,我弄糊涂了,实际上这不是特定于redux的-历史记录会传递给路由器,应该在上下文中提供,例如-
{routes}
我喜欢使用更高阶的组件来包装所有需要验证的页面。您的方法存在的问题是,在没有经过身份验证的情况下,可能会看到身份验证页面。只需注销而不重定向。我喜欢更好的组件DidMount+组件将获得道具。如果身份验证在页面上更改,我仍将被重定向,并且我不需要在每次注销按钮中都放置重定向登录。v4更新:
onEnter
属性被删除,文档建议使用
componentWillMount