Vue-vuex简单使用和解决页面刷新state值清空的问题

本文介绍如何使用Vuex进行状态管理,包括创建全局store、在项目中引入Vuex、保存及获取状态值,并解决了页面刷新导致state值丢失的问题。

简单使用vuex

我对vuex刚刚入门,但是项目中要使用vuex保存全局状态,所以在这里记录一下简单使用

1.建一个全局store文件

文件目录如下
在这里插入图片描述
里面的内容如下:
为什么要用一个sessionStorage.getItem(‘state’) 获取数据而不是直接初始化呢?后面有讲原因

//vuex全局
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
const store = new Vuex.Store({
    state: sessionStorage.getItem('state') ? JSON.parse(sessionStorage.getItem('state')) : {
        token: "",
        user: {}
    },
    mutations: { //更改state值的方法集合
        saveToken(state, data) {
            state.token = data;
        },
        saveUser(state, data) {
            state.user = data;
        }
    }
})

//存储时,使用commit this.$store.commit('mutatioins的方法',数据);
//获取时,使用 this.$store.state.状态
//模块化,略...
export default store;

2.引入main.js中

import Vue from 'vue';
import App from './App.vue';
//store文件和自己封装的storage文件
import store from './store';
import storage from "@/util/storage";

//全局引入本地缓存
Vue.prototype.$storage = storage;

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

封装的storage,网上参考的

//本地缓存封装工具

/**
 * localStorage
 * @调用:_local.set('access_token', '123456', 5000);
 * @调用:_local.get('access_token');
 */
var _local = {
    //存储,可设置过期时间
    set(key, value, expires) {
        let params = { key, value, expires };
        if (expires) {
            // 记录何时将值存入缓存,毫秒级
            var data = Object.assign(params, { startTime: new Date().getTime() });
            localStorage.setItem(key, JSON.stringify(data));
        } else {
            if (Object.prototype.toString.call(value) == '[object Object]') {
                value = JSON.stringify(value);
            }
            if (Object.prototype.toString.call(value) == '[object Array]') {
                value = JSON.stringify(value);
            }
            localStorage.setItem(key, value);
        }
    },
    //取出
    get(key) {
        let item = localStorage.getItem(key);
        // 先将拿到的试着进行json转为对象的形式
        try {
            item = JSON.parse(item);
        } catch (error) {
            // eslint-disable-next-line no-self-assign
            item = item;
        }
        // 如果有startTime的值,说明设置了失效时间
        if (item && item.startTime) {
            let date = new Date().getTime();
            // 如果大于就是过期了,如果小于或等于就还没过期
            if (date - item.startTime > item.expires) {
                localStorage.removeItem(name);
                return false;
            } else {
                return item.value;
            }
        } else {
            return item;
        }
    },
    // 删除
    remove(key) {
        localStorage.removeItem(key);
    },
    // 清除全部
    clear() {
        localStorage.clear();
    }
}

/**
 * sessionStorage
 */
var _session = {
    get: function(key) {
        var data = sessionStorage[key];
        if (!data || data === "null") {
            return null;
        }
        return JSON.parse(data).value;
    },
    set: function(key, value) {
        var data = {
            value: value
        }
        sessionStorage[key] = JSON.stringify(data);
    },
    // 删除
    remove(key) {
        sessionStorage.removeItem(key);
    },
    // 清除全部
    clear() {
        sessionStorage.clear();
    }
}
export default { _local, _session }

3.在页面中使用-保存值

比如我现在是一个登陆接口,登陆成功的时候要保存数据在vuex中

this.$store.commit("saveToken", data.token); //存token
this.$store.commit("saveUser", data.user); //存token

4.在页面总使用-获取值

直接使用this.$store.state.state值 拿对应的数据

this.$store.state.token;

解决页面刷新state值清空的问题

这是我参考了网上的资料应用到项目中去的,发现还是有坑,无论我怎么值,它刷新之后还是在state还是为空,然后我在监听onload的时候,投机取巧地先保存一下状态值到state值中,再存state大对象到缓存,竟然成功了,很迷…不知道原理

1.监听onload方法

在这里插入图片描述
注意sessionStorage不能存对象,所以要转成String类型

  mounted() {
    window.addEventListener("unload", this.saveState());
  },
  methods: {
    saveState() {
      this.$store.commit("saveToken", this.$storage._session.get('token')); //存token
      this.$store.commit("saveUser", this.$storage._session.get('user')); //存token
      sessionStorage.setItem("state", JSON.stringify(this.$store.state));
      console.log('嘤嘤嘤',this.$store.state);
    },
  },
};

2.在store中拿缓存做赋值操作

const store = new Vuex.Store({
    state: sessionStorage.getItem('state') ? JSON.parse(sessionStorage.getItem('state')) : {
        token: "",
        user: {}
    },
    mutations: { //更改state值的方法集合
        saveToken(state, data) {
            state.token = data;
        },
        saveUser(state, data) {
            state.user = data;
        }
    }
})

踩了这些坑,跨过这些坎,你就是大牛啦~

### 解决 Vue2 中 Vuex 路由数据页面刷新后被清空问题Vue2 项目中,使用 Vuex 进行状态管理时,如果遇到页面刷新导致路由数据丢失的问题,可以通过以下方法解决。以下是详细的解决方案代码示例。 #### 使用 `vuex-persistedstate` 插件实现持久化 `vuex-persistedstate` 是一个专门用于持久化 Vuex 状态的插件,它能够将 Vuex 的状态存储到浏览器的本地存储机制(如 `localStorage` 或 `sessionStorage`)中,并在页面刷新后自动恢复状态[^1]。 安装插件: ```bash npm install vuex-persistedstate --save-dev ``` 配置 Vuex 并集成插件: ```javascript import Vue from 'vue'; import Vuex from 'vuex'; import createPersistedState from 'vuex-persistedstate'; Vue.use(Vuex); const store = new Vuex.Store({ state: { routeData: {} // 示例:存储路由相关的数据 }, mutations: { SET_ROUTE_DATA(state, payload) { state.routeData = payload; } }, plugins: [ createPersistedState({ storage: window.sessionStorage, // 使用 sessionStorage 或 localStorage paths: ['routeData'] // 指定需要持久化的状态路径 }) ] }); export default store; ``` 通过上述配置,`routeData` 状态将被持久化到 `sessionStorage` 中,并在页面刷新后自动恢复[^3]。 #### 手动实现 Vuex 状态持久化 如果不希望引入第三方插件,也可以手动实现状态的持久化。以下是具体实现方式: 1. **保存状态到 `localStorage` 或 `sessionStorage`** 在 Vuex 的 `mutations` 中,每当状态发生变化时,手动将其保存到浏览器的存储中。 ```javascript const store = new Vuex.Store({ state: { routeData: {} }, mutations: { SET_ROUTE_DATA(state, payload) { state.routeData = payload; sessionStorage.setItem('routeData', JSON.stringify(payload)); // 保存到 sessionStorage } }, actions: { restoreRouteData({ commit }) { const savedRouteData = JSON.parse(sessionStorage.getItem('routeData')); if (savedRouteData) { commit('SET_ROUTE_DATA', savedRouteData); } } } }); export default store; ``` 2. **在应用初始化时恢复状态** 在 Vue 应用启动时,调用 `restoreRouteData` 动作以从 `sessionStorage` 恢复状态。 ```javascript new Vue({ store, created() { this.$store.dispatch('restoreRouteData'); }, render: h => h(App) }).$mount('#app'); ``` #### 页面刷新前保存状态 另一种思路是在页面刷新之前,手动将状态保存到 `sessionStorage` 或 `localStorage`,然后在页面加载时恢复状态[^4]。 监听页面刷新事件: ```javascript window.addEventListener('beforeunload', () => { const stateToSave = JSON.stringify(store.state.routeData); sessionStorage.setItem('routeData', stateToSave); }); ``` 页面加载时恢复状态: ```javascript document.addEventListener('DOMContentLoaded', () => { const savedRouteData = sessionStorage.getItem('routeData'); if (savedRouteData) { store.commit('SET_ROUTE_DATA', JSON.parse(savedRouteData)); } }); ``` ### 注意事项 - 如果使用的是 `localStorage`,数据会在浏览器关闭后仍然保留;如果使用的是 `sessionStorage`,数据仅在当前会话期间有效[^3]。 - 对于敏感数据(如用户信息),建议加密后再存储到浏览器缓存中,以提高安全性。 - 在实际项目中,可以根据需求选择性地持久化部分状态,而不是整个 Vuex 状态树,以避免不必要的性能开销。 ### 总结 通过使用 `vuex-persistedstate` 插件或手动实现状态持久化,可以有效解决 Vuex 状态在页面刷新时被清空问题。选择合适的存储机制(`localStorage` 或 `sessionStorage`)取决于具体需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值