页面刷新时的 Vuex 状态

IT技术 javascript vue.js vuejs2 state vuex
2021-01-19 11:22:16

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

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

但是当页面刷新时,vue app的状态丢失并重置为默认

这会导致一个问题,因为即使用户登录并刷新页面,登录状态也会设置回false并且即使用户保持登录状态,也会显示登录按钮而不是注销按钮......

我该怎么做才能防止这种行为

我应该使用cookie 还是有其他更好的解决方案...

    ——
6个回答

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

例如,可以使用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. setState我们将我们的状态保存到Cookies

文档和安装说明:https : //www.npmjs.com/package/vuex-persistedstate

@hounded 我也面临同样的问题,找到解决方案了吗?
2021-03-15 11:22:16
谢谢...刚刚在看插件的github页面...再次感谢您
2021-03-16 11:22:16
你需要做任何特定的事情来设置/获取数据吗?重新加载时,我的数据被重置为默认值。只是通过 this.$store.state.user 设置,尝试过对象和简单的字符串 - 没有运气。
2021-03-31 11:22:16
因为 cookie 在客户端和服务器之间传输,所以我可能会查看本地存储......
2021-03-31 11:22:16
如何保存 aws-amplify 的状态?因为它太大了,无法放入 cookie 并且 localstorage 在 safari 私人模式下不起作用
2021-04-05 11:22:16

创建 VueX 状态时,使用vuex-persistedstate插件将其保存到会话存储中这样,当浏览器关闭时,信息就会丢失。避免使用 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();时,用户手动注销。

您的标题(包括 cookie)也被限制为总共 8k。
2021-03-15 11:22:16
@MarkHagers,它从 IE8 开始就得到了本地支持!无需加载额外的代码。
2021-03-26 11:22:16
我收到一个错误 vuex-persistedstate.es.js?0e44:1 Uncaught (in promise) TypeError: Converting circular structure to JSON
2021-03-28 11:22:16
@Akin - 该错误表明您的状态中有一个循环引用,一个对象引用另一个对象,该对象最终引用回第一个对象。
2021-04-09 11:22:16
我很惊讶 cookie 解决方案获得了如此多的星星。我认为这个解决方案要好得多,因为它会在浏览器窗口关闭时自动清除所有状态。我不喜欢将我的状态数据作为 cookie 发送到服务器,而且我也不想在浏览器窗口关闭时保留敏感数据。
2021-04-10 11:22:16

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()]

使用 vuex 创建商店: const store = createStore({ /*...*/ plugins: [createPersistedState()], });
2021-03-27 11:22:16
这是最简单的方法,无需添加其他包。有用!
2021-04-10 11:22:16

我认为使用 cookies/localStorage 来保存登录状态在某些情况下可能会导致一些错误。
Firebase 已经在 localStorage 为我们记录了登录信息,包括 expireTime 和 refreshToken。
因此我将使用 Vue 创建的钩子和 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.');
            }
        });
    },
});
针对这种情况的最佳、官方和推荐的方法
2021-04-05 11:22:16

穿上状态:

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

进行突变:

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

对我来说很好用!