nuxtjs里使用vuex和cookie保存登录信息

第一境界:刚开始学习使用vuex的时候一脸懵逼,最开始的理解是js的var一个全局变量,后来慢慢把它理解成localStorage并结合计算属性(computed)存值取值,它比localStorage好,一改动就能监听做出响应。
第二境界:vuex还能模块化
第三境界:后来发现vuex还能做异步请求数据

上面算是新手入门,具体请看 vuex官网vue-element-admin

vue-element-admin里面已经有vuex的模块化、vuex异步请求数据、cookie保存登录信息。而这些在nuxtjs里怎么实现呢?

1
模块方式: store 目录下的每个 .js 文件会被转换成为状态树指定命名的子模块 (当然,index 是根模块)

官网这句话不好理解,还不如直接来个例子,在store下新建index.js和user.js(模块)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// index.js
import { parse } from 'cookie-parse'
export const state = () => ({
counter: 0
})

export const mutations = {
increment(state) {
state.counter++
}
}

export const actions = {
// 这里是从服务端拿取cookie
nuxtServerInit({ commit }, { req }) {
const cookie = parse(req.headers.cookie)
// 主要这里提交的是user模块
commit('user/SET_TOKEN', cookie.token)
}
}


//user.js
import md5 from 'js-md5'
import { login, logout } from '~/api/user'
import defaultSettings from '~/utils/settings'
import { getToken, setToken, removeToken } from '~/utils/auth'

export const state = () => ({
// nuxtjs 由于服务端渲染这里的getToken()为undefined
// 需要在index.js里使用nuxtServerInit
token: getToken()
})
export const mutations = {
SET_TOKEN: (state, token) => {
state.token = token
}
}
export const actions = {
// user login
login({ commit }, userInfo) {
const { username, password } = userInfo
const loginData = {
username: username.trim(),
password: md5(password),
grant_type: defaultSettings.grant_type,
ip_address: defaultSettings.ip_address
}
return new Promise((resolve, reject) => {
login(loginData)
.then(response => {
commit('SET_TOKEN', response.access_token)
setToken(response.access_token)
// 把登录结果返回login页面
resolve(response)
})
.catch(error => {
reject(error)
})
})
},
// user logout
logout({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token)
.then(() => {
commit('SET_TOKEN', '')
removeToken()
resolve()
})
.catch(error => {
reject(error)
})
})
},
// remove token
resetToken({ commit }) {
return new Promise(resolve => {
commit('SET_TOKEN', '')
removeToken()
resolve()
})
}
}

在组件里使用

1
2
3
4
5
computed: {
token() {
return this.$store.state.user.token
}
}

需要的依赖

1
npm i cookie-parse js-cookie

主要注释都在代码里写了,以上就基本解决了getToken()为undefined,和nuxt里vuex怎么模块化的问题

Author: kyxiao
Link: https://kyxiao.github.io/2019/08/06/nuxtjs里使用vuex和cookie保存登录信息/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.