Vuex本地存储

前言

几种本地存储的方法

1.localstorage : 真正的本地持久化存储,存放数据大小为一般为5MB,只能手动删除,而且它仅在客户端(即浏览器)中保存,不参与和服务器的通信。
2.sessionStoreage: 临时存储 ,会话结束时存储的内容就会清除
3.cookie: 浏览端客户端存储少量数据的一种技术,存储时间为窗口或浏览器关闭,存放数据大小为4K左右 ,存储于你电脑上的文本文件中。
4.vuex 集中式状态管理

一、什么是Vuex?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。

例如:

  • 用户登录状态
  • 获取用户数据状态等

二、Vuex特点

1.集中式存储管理应用的所有组件的状态

2.保证状态以一种可预测的方式发生变化

3.简化Vue组件间通讯

在通常情况下,我们在一格组件去获取另一格组件的数据或数据时,都会用到组件间的传参,可能是兄弟组件,可能是父子组件,也可能是一个组件下嵌套了多个组件的情况,所以在这种情况下,去获取数据,数据交互的时候就会很麻烦,所以,我们会用到Vuex来将当前状态下的数据存储到本地,然后其他所有组件在任何地方都能去获取这个数据。


注意:在某个组件下获取到某个状态下存储的数据后,如果页面刷新的话,存储的数据会被清除;因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,store里面的数据就会被重新赋值初始化

三、核心概念与原理

1.state:页面状态管理容器对象。集中存储Vue components状态数据

2. mutations:状态改变操作方法,改变state中存储的数据状态。由actions中的commit(‘mutation 名称’)来触发。是Vuex修改state的唯一推荐方法。该方法只能进行同步操作,且方法名只能全局唯一。

3. commit:状态改变提交操作方法。对mutation进行提交,是唯一能执行mutation的方法。

4. actions:操作行为处理模块,由组件中的$store.dispatch('action 名称', data1)来触发。然后由commit()来触发mutation的调用 , 间接更新 state

5. dispatch:操作行为触发方法,在组件调用处执行actions中提交上去的方法;是唯一能执行action的方法。

6. getters:state对象读取方法。在组件的计算属性computed中去获取存储的数据

四、下载安装Vuex使用步骤

1.在node.js平台上去安装

vue install vuex --save

2.创建store.js文件并引入相关对象

  • 在src文件夹下创建store文件夹,在store文件夹下创建store.js文件(文件名可换)
  • store.js文件基本结构
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

const store = new Vuex.Store({
    state: {},
    mutations: {},
    actions: {},
    getters: { }
})
export default store;

3.在main.js中将vuex引入集成到Vue对象中

import Vue from 'vue'
import App from './App.vue'
import router from './router'
// 引入store对象
import store from './store'

Vue.config.productionTip = false

new Vue({
  router,
  store,  // 集成到vue中
  render: h => h(App)
}).$mount('#app')

备注:用命令 vue cerete project在创建项目的时候,就可以去Vuex功能包,以上的操作均已被模块化完成,也不需要自己手动去创建操作了

五、Vuex具体运用案例

1.在index.js(即store.js)中操作存储状态和数据

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

const store = new Vuex.Store({
    /**
     *  state中定义状态数据,是页面状态管理容器对象,用来集中存储Vue components状态数据
     */
    state: {
        count: 0
    },
    /**
     * 状态改变操作方法
     *  1. 设置一个函数,并把state作为参数传进去,去操作改变状态数据
     *  2. 由actions中的commit(‘mutation 名称’),是Vuex修改state的唯一推荐方法
     */
    mutations: {
        ADD_COUNT(state, num) {
            state.count = num;
        },
        MOve_COUNT(state) {
            state.count--;
        }
    },
    // 操作行为处理模块,由组件中的$store.dispatch('action 名称', data1)来触发。
    /**
     * 操作行为处理模块
     *  1. 在组件中通过 $store.dispatch('action 名称', data1) 来触发状态改变的方法,data1为需要传进来的参数
     *  2. 将然后由commit()来触发mutation的调用 , 间接更新 state
     *  3. 一般在actions里面异步操作
     */
    actions: {
        addeCount({ commit }, num) {
            commit('ADD_COUNT', num);
        },
        moveCount({ commit }) {
            commit('MOve_COUNT');
        }
    },
    /**
     * state对象读取方法。
     *  在外部组件中去获取数据和方法
     */
    getters: {
        total: state => state.count
    }
})

export default store;

2.在外部组件demo.vue中去调用存储状态中的方法,间接改变状态数据,也可以获取状态数据

(1)在某个点击事件中去调用index.js中触发状态改变的方法,有参数也可以传参进去
this.$store.dispatch("addeCount", 10);
(2)在created钩子函数中,或计算数据computed中(通常都是计算属性computed)去获取存储数据中的数据
 this.$store.getters.number;
(3)通过辅助函数去调用方法和获取数据

一下的辅助函数通常只用到mapActionsmapGetters,此时需要引入相关对象

  • mapState
  • mapMutations
  • mapActions
  • mapGetters
import { mapGetters, mapActions } from "vuex";
 ...mapGetters({
      num: "total"
 })
 ...mapActions({
   // 此时onAdd传参需要在使用组件的地方去传参
   onAdd: "addeCount",
   onMove: "moveCount"
 })
(4)完整代码
<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png" />
    <div>
      <h1>{{num}}</h1>
      <button @click="onAdd(10)">加1</button>
      <button @click="onMove">减1</button>
    </div>
  </div>
</template>

<script>
// import { mapGetters, mapActions } from "vuex";
export default {
  name: "Home",
  data: function() {
    return {};
  },
  // 用计算属性去监听num的值
  computed: {
    num: function() {
     // 从vuex中 $store.getters 获取count的值
      return this.$store.getters.number;
    }
   // 用mapGetters函数去获取num的值
    // ...mapGetters({
    //   num: "total"
    // })
  },
  methods: {
    onAdd: function() {
      this.$store.dispatch("addeCount", 10);
    },
    onMove: function() {
      this.$store.dispatch("moveCount");
    }
    // ...mapActions({
    //   // 此时onAdd传参需要在使用组件的地方去传参
    //   onAdd: "addeCount",
    //   onMove: "moveCount"
    // })
  }
};
</script>

六、封装Vuex,将Vuex模块化modules

1.封装的文件夹的存放状况

2.封装的状态模块modelus和获取数据的模块getters.js以及主体index.js文件下的代码

(1)modules文件夹下的代码,示例user.js
// 将Count 暴露出去
export const Count = {
    state: {
        count: 0
    },
    mutations: {
        // num为传进来的参数
        ADD_COUNT(state, num) {
             // 将传进来的num数据存储到本地
            state.count = num;
        },
        MOVE_COUNT(state) {
            state.count--;
        }
    },
    actions: {
        addeCount({ commit }, num) {
            commit('ADD_COUNT', num);
        },
        moveCount({ commit }) {
            commit('MOVE_COUNT');
        }
    }
}
(2)获取数据getters.js代码
export const getters = {
    number: state => state.Count.count
}
(3)index.js下的代码
export default store;
import Vue from "vue";
import Vuex from "vuex";
import { Count } from "./modules/count";
import { getters } from "./getters";

Vue.use(Vuex);

const store = new Vuex.Store({
    modules: {
         // 这里是名称值对的缩写  Count: Count
        Count
    },
    getters: getters
})

export default store;

(4)在外部组件调用改变数据状态的方法和获取数据的方法
  • 传值进来,改变存储的数据状态
// 10为参数,传到vuex中的actions处去
this.$store.dispatch("addeCount", 10);
  • 获取存储状态中的数据
// 从vuex中 $store.getters 获取count的值
this.$store.getters.number;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352