react-router root onChange替换路径无限

时间:2016-07-20 07:26:30

标签: react-router react-router-redux react-router-component

似乎如果我在root onEnter或onChange hook中更改路径,则url将无限变化。但是,如果我改变子路线中的路径,它将起作用。实际上我想在一个地方处理身份验证,否则每个子路由都应该处理相同的逻辑。

{
    path: '/',
    onChange: function(prevState, nextState, replace, callback) { 
        if(!logined) {
            replace('login');
        }
    },
    childRoutes: [
        ....
    ]
}

1 个答案:

答案 0 :(得分:0)

由于onChangereplace

上调用,因此无限更改

 onChange: function(prevState, {location:{pathname:next}}, replace)=> {
      if(!logined && next !== '/login') {
          replace('/login');
      }
 }

还要在一个地方处理身份验证,你可以使用HOC,类似

const CheckAuth = (isLogined, redirectPath) => Component => 
class CheckAuth extends React.Component {
    componentWillUpdate(nextProps, nextState){
        //Check auth on change
        this.checkAuth(nextProps);
    }
    componentWillMount(){
        //Check auth on enter
        this.checkAuth(this.props);
    }
    checkAuth({location}){
        if(!isLogined && location.pathname!==redirectPath) {
            browserHistory.replace(redirectPath);
        }
    }
    render(){
        return (<Component {...this.props}/>);
    }
};

和App组件

class App extends React.Component { ... }
export default CheckAuth(isLogined,'/login')(App);

另外,redux-auth-wrapper

还有一种方法