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

9 篇文章 0 订阅

简单使用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;
        }
    }
})

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js是一个流行的JavaScript框架,它允许您构建动态Web应用程序。Vuex是一个专为Vue.js应用程序开发的状态管理模式。它允许您在应用程序中管理和维护状态,例如用户信息、购物车、主题等。Vuex将状态存储在一个集中的存储库中,称为storeVuex的核心概念包括state、mutations、actions和getters。 - state存储应用程序级别的状态,可以通过store.state访问。 - mutations:用于更改状态的函数,必须是同步函数。可以通过store.commit方法调用。 - actions:用于处理异步操作的函数,可以包含任意异步操作。可以通过store.dispatch方法调用。 - getters:用于从store中获取状态的函数,可以通过store.getters访问。 下面是一个简单的示例,演示如何在Vue.js应用程序中使用Vuex: 1.安装Vuex ```shell npm install vuex --save ``` 2.创建store ```javascript import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { incrementAsync ({ commit }) { setTimeout(() => { commit('increment') }, 1000) } }, getters: { getCount: state => { return state.count } } }) export default store ``` 3.在Vue组件中使用store ```javascript <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> <button @click="incrementAsync">Increment Async</button> </div> </template> <script> import { mapGetters, mapActions } from 'vuex' export default { computed: { ...mapGetters([ 'getCount' ]) }, methods: { ...mapActions([ 'increment', 'incrementAsync' ]) } } </script> ``` 在上面的示例中,我们创建了一个名为count的状态,并定义了一个名为increment的mutation和一个名为incrementAsync的action。我们还定义了一个名为getCount的getter,用于从store中获取count状态。在Vue组件中,我们使用mapGetters和mapActions帮助程序将getter和action映射到组件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值