美文网首页
axios + router4 + mobx:对于全局登录的思考

axios + router4 + mobx:对于全局登录的思考

作者: swensun | 来源:发表于2018-01-21 11:40 被阅读806次

    前两天在做登录注册的一个思考。无论采取jwt或者cookie验证的方法,前端一旦判断请求的验证无效,那么页面要重定向要登录页面去重新登录。
    下面我的解决方法:

    生成routerStore

    在组件内部可以通过withRouter访问路由history。这里通过将history保存在routerStore,以后后续使用。

    import {observable, action} from 'mobx'
    
    class RouterStore {
    
        @observable history = null
    
        @action
        setHistory(history) {
            this.history = history
        }
    }
    
    export default  new RouterStore();
    

    在之前App.js里面将Store引入。

    import countStore from './mobx/CountStore'
    import changeNameStore from './mobx/ChangeNameStore'
    import routerStore from './mobx/RouterStore'
    
    
    const stores = {
        countStore,
        changeNameStore,
        routerStore,
    }
    

    在axios里面进行全局登录判断

    首先在Main组件中将history复制给store的history。

    @withRouter
    @inject("routerStore")
    @observer
    class Home extends React.Component {
        constructor(props) {
            super(props)
            // 没有super(props), 后面使用回报错
            // 定义state
            // bind方法
            // 其他初始化工作
            this.props.routerStore.history = this.props.history
    
        }
    

    在axios的拦截器中做全局判断:

    // Add a response interceptor
    instance.interceptors.response.use( (response) => {
        // 返回错误判断
        console.log("filter error code")
        // 判断如果需要登录,routerStore.history.replace("/login")
        routerStore.history.replace("/login")
        return response;
    },  (error) => {
        // 可以在后面的请求中catch
        console.log("interceptors response error")
        return Promise.reject(error);
    });
    

    这里做个测试,每一个请求都重定向到login。
    测试成功,完整代码请查看:
    github: https://github.com/yunshuipiao/react-mobx-axios

    不借助mobx

    鉴权,登录重定向的判断都在axios的拦截器中,可以考虑将这部分代码在component中实现,这样可以用history去重定向到登录页面。

    @withRouter
    @inject("routerStore")
    @observer
    class Home extends React.Component {
    
        constructor(props) {
            super(props)
            //init and bind
           // axios  interceptors
        }
    
        render() {
            return (
                <div>
                    <Switch>
                        <Route path="/login" component={Login}/>
                        <Route path="/" component={Main}/>
                    </Switch>
                </div>
            );
        }
    }
    

    相关文章

      网友评论

          本文标题:axios + router4 + mobx:对于全局登录的思考

          本文链接:https://www.haomeiwen.com/subject/clefaxtx.html