2

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

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

1 回答 1

0

它无限变化,因为onChange调用replace

尝试

 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的方法

于 2016-07-20T07:44:04.593 回答