javascript - 使用模块和 vuex-persistedstate 持久化 Vuex 状态
问题描述
所以我正在努力在 vue 中实现身份验证,我目前在刷新时失去了我的状态,这反过来又清除了我的 jwt 令牌。vuex-persistedstate
我在这里遇到过,在将其与模块一起使用时似乎无法正确使用语法。如何在我的模块中保留我的token
和status
状态?auth.js
如果我去我的本地存储,它似乎正在添加状态,但是当我刷新页面时它不会持续存在。
index.js
import Vue from 'vue';
import Vuex from 'vuex';
import * as auth from '@/store/modules/auth'
import createPersistedState from 'vuex-persistedstate'
Vue.use(Vuex);
const authState = createPersistedState({
paths: ['auth']
})
export default new Vuex.Store({
modules: {
auth
},
plugins: [authState],
});
auth.js
import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios';
Vue.use(Vuex);
// https://scotch.io/tutorials/handling-authentication-in-vue-using-vuex
export const state = {
status: '',
token: localStorage.getItem('token') || '',
user : {}
}
//update state synchronously
//**mutations should always be abstracted out and put into actions**
export const mutations = {
AUTH_REQUEST(state){
state.status = 'loading'
},
AUTH_SUCCESS_TOKEN(state, token){
state.token = token
},
AUTH_SUCCESS_USER(state, user){
state.user = user
},
AUTH_SUCCESS_STATUS(state, status){
state.status = status
},
AUTH_ERROR(state){
state.status = 'error'
},
LOGOUT(state){
state.status = ''
state.token = ''
},
}
// acts like global computed methods
export const getters = {
isLoggedIn: state => !!state.token,
authStatus: state => state.status,
}
//asynchronously wrap business logic around mutations.
export const actions = {
login({commit, dispatch}, user){
return new Promise((resolve, reject) => {
commit('AUTH_REQUEST');
axios({url: 'http://localhost:5000/api/auth/authenticate', data: user, method: 'POST' })
.then(resp => {
const token = resp.data.token;
const user = resp.data.user;
localStorage.setItem('token', token);
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
dispatch("authSuccess", { token, user });
resolve(resp);
})
.catch(err => {
commit('AUTH_ERROR');
localStorage.removeItem('token');
reject(err);
})
})
},
authSuccess({ commit }, {token ,user}){
commit('AUTH_SUCCESS_STATUS', 'success');
commit('AUTH_SUCCESS_TOKEN', token);
commit('AUTH_SUCCESS_USER', user);
},
register({ commit, dispatch }, user){
return new Promise((resolve, reject) => {
commit('AUTH_REQUEST');
axios({url: 'http://localhost:5000/register', data: user, method: 'POST' })
.then(resp => {
const token = resp.data.token;
const user = resp.data.user;
localStorage.setItem('token', token);
axios.defaults.headers.common['Authorization'] = token;
dispatch("authSuccess", { token, user });
resolve(resp);
})
.catch(err => {
commit('AUTH_ERROR', err)
localStorage.removeItem('token')
reject(err)
})
})
},
logout({ commit }){
return new Promise((resolve, reject) => {
commit('LOGOUT')
localStorage.removeItem('token')
delete axios.defaults.headers.common['Authorization']
resolve()
window.sessionStorage.clear();
})
}
}
export const modules = {
}
解决方案
推荐阅读
- ansible - 使用 Ansible 擦除除一行之外的所有行
- ruby - 如何在 CHEF 中为资源块的操作添加条件?
- javascript - 我希望我的提交按钮控制台.记录用户在数组中输入的所有值
- python - 是否可以检查 SQLITE 缓存是热的还是冷的?
- c - PIC18F45K80 QT1481 带软件 EUART 和 SPI
- java - 在 JavaFX 中自动选择 ListView 的第一项
- elixir - Plug 路由器是否需要匹配/调度管道?
- c++ - 错误 C2676 二进制“<<”:“std::ostream”未定义此运算符或转换为预定义运算符可接受的类型
- scala - 如何根据条件为日期列的列中值的出现来过滤火花数据框?
- javascript - Console.log 未显示在节点承诺的第二层