Nuxt.js中,vuex已经默认内核实现,可以使用普通模式和传统模式两种形式使用。
详见:https://www.nuxtjs.cn/guide/vuex-store/
在开发登录过程中遇到问题,vuex中存储的内容,在F5或者开新标签之后,数据就会消失。例如token之类的需要在客户端一直存在的数据,则需要重新加载到vuex中。
在路由中间件中无法获得window对象,因为Nuxt.js在ssr模式下,路由中间件是在服务器中进行工作的。所以我们尝试在每次服务启动时,使用cookie中保存的token值进行同步。
由于在Nuxt.js 3中,传统模式将要删除,在使用时也会进行提示,所以我们只是用普通模式进行开发。
在/store下创建文件token.js用来在vuex中存储token。
/store/token.js
export const state = () => ({
data: null
})
export const mutations = {
setToken (state, data) {
state.data = data
}
}
在login.vue中添加方法获取token并保存。
/pages/login.vue
import axios from 'axios';
const Cookie = process.client ? require('js-cookie') : undefined
export default {
layout: 'login',
data() {
return {
user: {
userName: '',
password: ''
}
};
},
methods: {
login: async function() {
let { data } = await axios.post(`http://127.0.0.1:3000/api/admin/login`, {
'user': this.user
})
if( data.err ){
alert(data.err)
} else {
this.$store.commit('token/setToken', data.token)
Cookie.set('token', data.token)
this.$router.push('/')
}
}
}
}
此时,遇到一个问题,就是 nuxtServerInit 要如何使用。
根据官方文档介绍,写法如下:
actions: {
nuxtServerInit ({ commit }, { req }) {
if (req.session.user) {
commit('user', req.session.user)
}
}
}
但这明显是一种传统形式的写法,这种写法在后续Nuxt.js版本中将会淘汰。
最终尝试发现,需要创建/store/index.js,在其中添加方法:
const cookieparser = process.server ? require('cookieparser') : undefined
export const actions = {
nuxtServerInit ({ commit }, { req }) {
let token = null
if (req.headers.cookie) {
const parsed = cookieparser.parse(req.headers.cookie)
try {
token = parsed.token
} catch (err) {
// 找不到有效的Cookie
}
}
commit('token/setToken', token)
}
}
才可以实现。
留言