15.Vuex使用

vuex官网API https://vuex.vuejs.org/zh-cn/
vuex其实就是数据仓库,用来管理数据,适用于大中型项目,当组件之间数据需要共享时,数据被改变时,组件全部被更新。

vuex 核心概念:

1. state:变量定义和初始化(组件中使用:this.$store.state.XX 获取)
2. getters:以get方法 供外部调用来获取state值(组件中使用:this.$store.getters.XXX 获取)
3. mutations:mutations作用主要是改变state中的值,通过commit('XXX')触发mutations中的方法,mutations中的方法必须是同步的,如果是异步的要放入actions中(组件中使用:this.$store.commit('XXX') 操作)
4. actions:actions中的所有操作都是异步的(具体业务操作),也可以提交mutations改变state值(组件中使用:this.$store.dispatch('XXX') 操作)
5. modules:将 store 分割成模块,每个模块都有自己的state、getters、mutations、actions

PS:1 - 4 操作可以通过导入模块映射方式以this.XXX来操作,详情见案例

案例

1.在src/main.js中使用vuex

....
省略路由和其他组件导入方式....
....
// 导入vuex
import store from './store'

//使用sotre
new Vue({
  el: '#app',
  router,
  store,  // vuex
  components: { App },
  template: '<App/>'
});

2. src/store/index.js (vuex配置)

// 导入vue
import Vue from 'vue'
// 导入vuex
import Vuex from 'vuex'
// 使用vuex
Vue.use(vuex);

//配置:
const store = new Vuex.Store({
   // 变量定义和初始化
  state:{
    num: 1
  },
  // 提供get方法 供外部调用,参数只有state
  getters: {
    getNum(state){
        return state.num;
    },
    // 通过参数getters方式调用其他get方法
    getNum2(state, getters){
      return getters.getNum;
    }
  },
  // mutations作用主要是改变state中的值,通过commit('XXX')触发mutations中的方法,mutations中的方法必须是同步的,如果是异步的要放入actions中
  mutations: {
    //
    changeNum(state){
      //setTimeout(function(){ // 模拟异步操作
        state.num++;
      //}, 10)
    },
    //方法第二个参数为外部传入,只能有一个,如果多个参数,第二个参数定义成对象
    changeNum2(state, num){
      state.num+=num;
    }
  },
  // 异步操作,提交mutations改变state值,actions中的所有操作都是异步的
  actions:{
    // 第一个参数直接以store接收
    changeNumFun(store){
        setTimeout( function(){ // 模拟异步操作,实际值是时时改变的
          store.commit('changeNum');
        }, 100);
    },
    //第一个参数以commit接收,第二个参数只能有一个,如果多个值定义成对象
    changeNumFun2({commit}, num){
      commit('changeNum2', num)
    },
    // 异步操作 await等待返回
    async changeNumFun3(store){
      console.log('开始fun3');
      var data = await store.dispatch('changeNumFun4');
      console.log(data);
      console.log('结束开始fun3');

      // 打印结果: 开始fun3、{'id': '111', name: 'zsstore'}、结束开始fun3
      // 如果不使用await data输出放在最后
    },
    changeNumFun4(store){
         return new Promise(resolve => {
            setTimeout(() => {
              var data = {'id': '111', name: 'zsstore'};
              resolve(data);
            }, 1000);
        });
    }
  }
});
// 导出
export default store;

3.src/page/vuex/index.vue(vuex案例)

<template>
  <div>
      vuex使用({{num}}): <br>
      使用getters获取:{{$store.getters.getNum2}}
      <br><br>
      {{$store.state.num}}
      <br><br>
      <button @click="cNum1">改变值 ++ (mutations)</button>
      <br><br>
      <button @click="cNum2">改变值 +2 (mutations)</button>
      <br><br>
      <button @click="cNum3">改变值 ++ (actions)</button>
      <br><br>
      <button @click="cNum4">改变值 +2 (actions)</button>
      <br><br>
      <button @click="cNum5">异步操作</button>
      <br><br>
      <button @click="cNum7">store中异步操作</button>
      <br><br>
      <button @click="cNum8">getters案例</button>
  </div>
</template>
<script>
  // 导入state
  import { mapState } from 'vuex'
  //导入mapMutations
  import { mapMutations } from 'vuex'
  // 导入mapActions
  import { mapActions } from 'vuex'
  // 导入mapGetters
  import { mapGetters } from 'vuex'
  //以上导入vuex各个模块,在本组件中通过映射方式定义,就可以以this.XXX来操作,否则就要this.$store.XXX来操作

  export default {
    data(){
      retrun {
          
      }
    },
    computed:{
        // 映射 store的state
        ...mapState({
          num: state => state.num
        }),
        // 映射 store的getters
        ...mapGetters([
          'getNum',
          'getNum2',
        ])
    },
    methods:{
        //映射store的mutations
        ...mapMutations([
          'changeNum2',
          'changeNum'
        ]),
        // 映射store中的actions
        ...mapActions([
            'changeNumFun',
            'changeNumFun2'
        ]),
        //
        cNum1(){
          // 通过commit提交mutations改变state值
          //this.$store.commit('changeNum')

          // 通过mapMutations注入,直接this调用即可
          this.changeNum();
        },
        cNum2(){
          //this.$store.commit('changeNum2', 2);
          //
          this.changeNum2(3);
        },
        cNum3(){
          //this.$store.dispatch('changeNumFun')
          this.changeNumFun();
        },
        cNum4(){
          //this.$store.dispatch('changeNumFun2', 2)
          this.changeNumFun2(21,10);
        },
        async cNum5(){
          // 1.
          // var x = await this.cNum6().then((r)=>{
          //   console.log('r------------');
          //   console.log(r);
          //   return r;
          // });

          // 2.
          var x = await this.cNum6();
          console.log(x);
          console.log('调用完毕后事件...');
        },
        cNum6(){
          return new Promise(resolve => {
            setTimeout(() => {
              var data = {'id': '111', name: 'zs'};
              resolve(data);
            }, 1000);
          });
        },
        cNum7(){
          this.$store.dispatch('changeNumFun3')
        },
        cNum8(){
          //console.log(this.$store.getters.getNum);
          // 通过
          console.log(this.getNum2);
        }
    },
    created(){
      console.log(this.$store.state.num);
    }
  }
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容