页面刷新时的Vuex状态

时间:2017-03-26 10:19:05

标签: vue.js vuejs2 state vuex

我的应用使用Firebase API进行用户身份验证,将登录状态保存为Vuex状态的布尔值。

当用户登录时,我设置登录状态,并相应地有条件地显示登录/退出按钮。

但是当刷新页面时,vue应用程序的状态将丢失并重置为默认值

这会导致问题,即使用户已登录并刷新页面,登录状态也会重新设置为 false ,并显示登录按钮而不是注销按钮,即使用户仍然登录....

如何防止此行为

我应该使用 cookies 或者任何其他更好的解决方案......

      -

6 个答案:

答案 0 :(得分:54)

这是一个已知的用例。有不同的解决方案。

例如,可以使用vuex-persistedstate。这是vuex在页面刷新之间处理和存储状态的插件。

示例代码:

import { Store } from 'vuex'
import createPersistedState from 'vuex-persistedstate'
import * as Cookies from 'js-cookie'

const store = new Store({
  // ...
  plugins: [
    createPersistedState({
      getState: (key) => Cookies.getJSON(key),
      setState: (key, state) => Cookies.set(key, state, { expires: 3, secure: true })
    })
  ]
})

我们在这里做的很简单:

  1. 您需要安装js-cookie
  2. getState上我们尝试从Cookies
  3. 加载已保存的状态
  4. setState上我们将状态保存到Cookies
  5. 文档和安装说明:https://www.npmjs.com/package/vuex-persistedstate

答案 1 :(得分:13)

Vuex状态保留在内存中。页面加载将清除此当前状态。这就是为什么状态在重新加载后不会持续的原因。

但是vuex-persistedstate插件解决了这个问题

npm install --save vuex-persistedstate

现在将其导入商店。

import Vue from 'vue'
import Vuex from 'vuex'
import account from './modules/account'
import createPersistedState from "vuex-persistedstate";

Vue.use(Vuex);

const store = new Vuex.Store({
  modules: {
    account,
  },
  plugins: [createPersistedState()]
});

它与单行代码plugins: [createPersistedState()]

完美结合

答案 2 :(得分:5)

我认为使用cookies / localStorage来保存登录状态可能会在某些情况下导致一些错误 Firebase已经在localStorage为我们记录了登录信息,包括expirationTime和refreshToken 因此我将使用Vue创建的hook和Firebase api来检查登录状态 如果令牌已过期,api将为我们刷新令牌 因此,我们可以确保在我们的应用中显示的登录状态等于Firebase。

new Vue({
    el: '#app',
    created() {
        firebase.auth().onAuthStateChanged((user) => {
            if (user) {
                log('User is logined');
                // update data or vuex state
            } else {
                log('User is not logged in.');
            }
        });
    },
});

答案 3 :(得分:1)

我已经通过重新加载我的标题来解决这个问题,每次重新加载也会获取用户数据,我不知道什么是更好的...

new Vue({
    el: 'vue',
    render: h => h(VueBox),
    router,
    store,

    computed: {
        tokenJWT () {
            return this.$store.getters.tokenCheck
        },
    },


    created() {
        this.setAuth()

    },

    methods:
        Object.assign({}, mapActions(['setUser']), {

            setAuth(){
                if (this.tokenJWT) {
                    if (this.tokenJWT === 'expired') {
                        this.$store.dispatch('destroyAuth')
                        this.$store.dispatch('openModal')
                        this.$store.dispatch('setElModal', 'form-login')

                    } else {
                        window.axios.defaults.headers.common = {
                            'Accept': 'application/json',
                            'Authorization': 'Bearer ' + this.tokenJWT
                        }
                        axios.get( api.domain + api.authApi )
                            .then(res => {
                                if (res.status == 200) {
                                    this.setUser( res.data.user )
                                }
                            })
                            .catch( errors => {
                                console.log(errors)
                                this.destroyAuth()
                            })
                    }
                }
            }
        })

})

答案 4 :(得分:0)

进入状态:

producer: JSON.parse(localStorage.getItem('producer') || "{}")

输入突变:

localStorage.setItem("producer",JSON.stringify(state.producer)) // OR
localStorage.removeItem("producers");

对我来说很好!

答案 5 :(得分:0)

创建VueX状态时,请将其保存为会话状态。这样,当关闭浏览器时,信息将丢失。避免使用cookie,因为这些值将在客户端和服务器之间传递。

import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from "vuex-persistedstate";

Vue.use(Vuex);

export default new Vuex.Store({
    plugins: [createPersistedState({
        storage: window.sessionStorage,
    })],
    state: {
        //....
    }
});

当用户手动注销时使用sessionStorage.clear();