Dva: 如何做全局的登录状态管理

Created on 19 Sep 2016  ·  25Comments  ·  Source: dvajs/dva

检查是否登录:

  • 在切换页面的时候(只能在每个子的路由里做onEnter={isLogin}吗?),如下:
<Router history={history}>
      <Route path="/" component={MainLayout} onEnter={isLogin}>
        <IndexRoute component={User} />
        <Route path='tag' component={Tag} />
      </Route>
    <Route path="/login" component={Login} />
    <Route path="*" component={NotFound} />
</Router>
不能直接在父路由上加onEnter,所有的子路由都生效么?
或者有别的什么办法
  • 在请求api的时候 (可以在request.js 里面做响应前和响应后的处理,然后throw error,在全局的onerror里处理)

然后在代码里如何控制跳转呢?

discussion

Most helpful comment

我在我的项目里,两种保持登录状态的方式都尝试了:
https://github.com/HeskeyBaozi/dva-blog-crud-demo

All 25 comments

我建议采用第二种(使用请求控制),很简单,封装一下你的 request 函数,然后在里面根据情况处理即可(跳转页面,弹框提示之类的)

在 subscription 里处理:

  1. 通过 history.listen 判断是否进入目标页面
  2. 触发 effect,在 effect 里判断登录状态以及页面跳转

如何跳转详见基于 action 进行页面跳转@dva-knowledge

我要在每个请求service中带上登录后的token,请问这种情况怎么写比较好?

@rrandom 我在 fetch 外又封装了一个 $http,在这个里面加 token

@hbrls 请问你的token是存在store里的吗? 如果是的话,请问你的$http是怎么写的

token 存 cookie 里的吧,$http 的实现我觉得应该类似 https://github.com/dvajs/dva-cli/blob/master/boilerplates/app/src/utils/request.js

@sorrycc 请问在dva中,怎么把token设置到cookie中?

token 设到 cookie 里不是 dva 做的事情,是服务器端响应头做的。

@sorrycc 在dora中有没有办法?我现在的做法是所有api会在网站服务器端加上token。昨天才发现dva和dora,挺不错。

我两种都做了.
第一种是跳转页面判断token是否生效.做这个主要是为了控制web的页面权限.
第二种每个页面的API请求的时候带上token.服务器判断是否有权限访问API.因为服务器可能手机APP访问

可以放在localstorage 用jsonwebtoken即可

用户登录的信息 可以保存在 login_model (相当于全局的model),那么在其他的model 怎么取到这个login_model的信息呢

这个我找到了 方法 yield select(global => global)

history.listen只能在页面跳转后做处理吧?不能像onEnter那样在跳转前做处理?这样就需要把所有加载数据的action都集中到model里,而不能放在componentDidMount中,否则就会在history.listen做出的处理之前发出请求。

@sorrycc 我是在onEnter 中 处理登录问题的,请问在onEnter中(或者在router中)如何获取store或者dispatch呢?

onEnter 是在 router.js 里吗? 是在话可以先通过 app._store.dispatch 处理吧。

app.router(({ history, app }) => {});

这里可以获取到 app 实例的,https://github.com/dvajs/dva/blob/4cca243/index.d.ts#L70

@sorrycc onEnter 是在 router.js 里 已经用上面的方法成功获取dispatch。多谢。

@sorrycc 如何在 request.js 中获取 dispatch

我是封装了一层 request.js 用户登录后服务端将Token传回来保存在 localstorage,fetch前将token放到cookie中,服务端验证token,如果token验证失败,后端返回401 在request.js response方法中统一错误处理 抛出 Error 在 index里捕获相应错误,然后用 window.location='/login' 跳转登陆页

@liSong5713 请教一下,在其他的model获取全局的model中的数据要怎么写,可以给个示例吗?

我在我的项目里,两种保持登录状态的方式都尝试了:
https://github.com/HeskeyBaozi/dva-blog-crud-demo

@zhanbohui 也是一样 effect中 yield select(globalState=>state})

一定要使用dva吗?

@Vcgoyo 页面没有发送请求,就是说还是收不到401,这个时候通过什么判断用户是否登录

Was this page helpful?
0 / 5 - 0 ratings