首页 文章

刷新页面时避免使用Vuex和VueRouter丢失全局状态

提问于
浏览
2

我正在创建一个SPA,作为客户端会话的基本示例,我使用Vuex存储布尔状态,如果用户登录或不登录,它可以正常工作,而不是手动更新浏览器 . 当状态重新启动到其初始状态时,是否有任何方法可以阻止这种情况,还是应该始终使用localstorage?如果是这样,如何获得初始存储状态?

Component Navbar

<template>
    <div>
        <ul v-if="!isLogued">
            <router-link :to="{ name:'login'}" class="nav-link">Login</router-link>
        </ul>
        <ul  v-if="isLogued">
                <a href="#" class="nav-link">Profile</a>
                <a href="" @click.prevent="logout">Salir</a>
        </ul>
    </div>
</template>
<script>
    import {mapState,mapMutations  } from 'vuex';
    export default{
        computed : mapState(['isLogued']),
        methods:{
            ...mapMutations(['logout']),
        }
    }
</script>

Store.js

export default {
    state: {
        userLogued: {},
        api_token  : '',
        isLogued : false
    },
    mutations: {

        login( state){
            state.userLogued = JSON.parse(localStorage.getItem('usuario'));
            state.api_token = localStorage.getItem('api_token');
            state.isLogued =  true
        },

        logout(state){
            state.userLogued = {}
            state.isLogued = false
            state.api_token  = null
            localStorage.clear()
        }
    }
};

App.JS

Vue.use(VueRouter)
Vue.use(Vuex)

import store from './vuex/store';
import routes from './routes';
const router = new VueRouter({
    mode: 'history',
    routes
})

const app = new Vue({
   router,
   store : new Vuex.Store(store)
}).$mount('#app')

在我的登录组件中,我发布了axios,如果它是正确的,我会执行以下操作

methods : {
        ...mapMutations(['login']),
        sendLogin(){
            axios.post('/api/login' , this.form)
                .then(res =>{
                    localStorage.setItem('api_token', res.data.api_token);
                    localStorage.setItem('user_logued', JSON.stringify(res.data.usuario));
                    this.login();
                    this.$router.push('/');
                })

1 回答

  • 3

    如果要在页面重新加载,浏览器会话等中保留状态,则需要始终使用持久存储机制 . 您可以使用localStorage,sessionStorage,cookies,indexeddb ......最适合您的需求,尽管sessionStorage当然是只对本届 Session 有利 .

    要恢复初始状态,请使用Vuex的插件,例如vuex-peristedstate . 这将保存/恢复vuex的情况下为您存储 .

    例如,创建 vuex-persistedstate 实例以便在商店中使用就像以下一样简单:

    import createPersistedState from 'vuex-persistedstate'
    
    const store = new Vuex.Store({
      // ...
      plugins: [createPersistedState()]
    })
    

相关问题