vue刷新浏览器后,存在全局getters的数据丢失

1、问题描述:vue项目登陆后,将用户相关信息存在getters中,然后在项目中取getters中的username显示在右上角。

登陆进入后,显示没问题

浏览器直接刷新后:

2、问题分析


const login = {
  state: {
    tokens: '',
    username: '',
    roles: []
  },
  mutations: {
    [LOGIN_IN](state, data) {
      if (data) {
        state.tokens = data.toke
        state.username = data.username
      }
    },
    [LOGIN_OUT](state) {
      state.tokens = ''
    },
    [USER_INFO] (state, data) {
      if (data) {
        state.tokens = data.toke
        state.username = data.username
      }
    }
  },
  actions: {
    login({commit, state}, user) {
      tokens.getTokens(user.username, user.password).then((data) => {
        //success
        commit(LOGIN_IN, data.data)
        // setToken(data.data.toke)
      }, (error) => {
        //fail
        commit(LOGIN_IN, '')
        // removeToken()
      })
    },
    // 获取用户信息
    GetInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        getUserLoginInfo(getToken()).then(response => {
          const data = response.data
          commit(USER_INFO, data)
          resolve(response)
        }).catch(error => {
          reject(error)
        })
      })
    },
    logout({commit}) {
      commit(LOGIN_OUT)
      // removeToken()
    }
  }
}

//export
export default login

可以看出来,登陆成功后,执行了

state.tokens = data.toke
state.username = data.username

将token和username放在了state 的 login.tokens  和 login.username 中。

这时在导航页面需要显示用户姓名:

data() {
  return {
    username: this.$store.state.login.username
  }
},

也是就上文所说,通过登陆的方式,导航页面用户名显示正常

但是页面刷新了后,vue 从新加载了,但是登陆页面并没有重新加载(因为之前token放在cookie中,所以并没有重定向到登录页),所以$store.state.login.username并没有赋值,取到的也就是空

3、解决办法

将token和username一样,序列化到cookie中

修改地方:src/store/index.js


/**
 * Created by suntao on 2020/2/7.
 */
import Vue from 'vue'
import Vuex from 'vuex'
import createLogger from 'vuex/dist/logger'
import createPersistedState from 'vuex-persistedstate' //vuex持久化localstorage插件
import * as Cookies from 'js-cookie';
import * as state from './state'
// import * as mutations from './mutations'
// import * as actions from './actions'
import permission from './modules/permission'
import app from './modules/app'
import getters from './getters'
import menu from './modules/menu'
import login from './modules/login'

Vue.use(Vuex)

const debug = process.env.NODE_ENV !== 'production'

let persistedState = {
  paths: ['login.tokens', 'login.username'],
  getState: (key) => Cookies.getJSON(key),
  setState: (key, state) => Cookies.set(key, state, {expires: 1}) //expires->cookie过期时间,单位为天
}

const store =  new Vuex.Store({
  state,
  getters,
  modules: {
    app,
    permission,
    menu,
    login
  },
  strict: debug,
  plugins: debug ? [createLogger(), createPersistedState(persistedState)] : [createPersistedState(persistedState)]
})

export default store

这样,指定路径下

'login.tokens', 'login.username'

就交由cookie管理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值