vuex商店令牌不会跨组件进行更新

时间:2017-12-26 23:59:02

标签: vue.js vuejs2 vuex

我有以下store / index.js文件:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

const state = {
  token: null
}
const mutations = {
  setToken (state, token) {
    state.token = token
    localStorage.setItem('token', token)
  },
  removeToken (state) {
    state.token = null
    localStorage.removeItem('token')
  }
}
const getters = {
  isLoggedIn: state => {
    return state.token != null
  }
}
export default new Vuex.Store({
  state,
  getters,
  mutations
})

在我的main.js中我这样添加:

import store from './store'

new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
})

当我登录时,我将令牌设置为:

this.$store.commit('setToken', response.data.token)

哪个应该有效,因为setToken函数成功将其保存到localStorage。

但是,如果我转到我的其他组件并致电:

data () {
  return {
    loggedIn: false
  }
},  
mounted: function () {
  this.loggedIn = this.$store.getters.isLoggedIn
  console.log(this.loggedIn)
}

然后控制台将打印“假”'。我也试图改变“已安装”的状态。到'计算','创建'和'准​​备好'但结果是一样的。

如果我这样做,我似乎只能解决问题:

mounted: function () {
  this.token = localStorage.getItem('token')
  this.$store.commit('setToken', this.token)
},
computed: {
  isLoggedIn () {
    return this.$store.getters.isLoggedIn
  }
}

forLoggedIn最终将成为现实。

但是,如果我喜欢那样,那么vuex是什么意思..

我想我不知道是否要调用计算机/挂载/等,或者我做突变的方式是错误的,或者我没有在正确的文件中初始化Vuex ..但我觉得我现在已经尝试过了

1 个答案:

答案 0 :(得分:1)

您的组件可能在 之前挂载并设置令牌。

看到你正在使用本地存储进行令牌持久化,我会以这种方式初始化值,即

const state = {
  token: localStorage.getItem('token')
}

如果尚未设置(或已被删除),则为null