Vuex从入门到熟练使用

本文github地址
首先我问看下完整的Vuex选项对象

new Vuex.Store({
  state,  //访问状态对象
  mutations,  //访问触发状态
  getters,
  actions
});
//还有一个模块的
export default new Vuex.Store({
  modules:{
    a:moduleA
  }
});

一、 state --- 访问状态对象

说明:也就是使用vuex中的数据
**1. **直接在组件中使用{{ $store.state.num }}
**2. **需要使用数据的组组件(此处是App.vue)中的计算属性

a. 方式一
computed: {
    count(){
      return this.$store.state.num + ':方式一获取的state数据';//this指的是main.js中的vue实例对象
    }
  }
b. 方式二,利用mapState
  import {mapState} from 'vuex'

  computed:mapState({
    // es箭头函数写法,好处箭头函数中的this有穿透效果,直接是上上级
    // count: state => state.num + ':方式二获取的state数据'
    // es5写法
    count:function (state) {
      return state.num + ':方式二获取的state数据'
    }
  })
c. 方式三,不对数据进行计算(加工处理),当数据较多的时候,数组形式
  computed:mapState([
    'counut'//这里必须state中的数据和此模板中的数据一个名字,也就类似组件定义的简写
  ])  
d. 方式四,不对数据进行计算 ,当数据较多的时候,json形式
推荐
  computed:mapState({
     count:'num'
  })

效果如下图:


二、 Mutations--- 触发状态

说明:必须用commit触发mutations中的方法
需求:在组件中传入一个值给store.js

<button type="button" name="buttonAdd" @click="$store.commit('add',{a:10})">加一个</button>

const mutations = {
  //定义方法 --- 类似methods
  add(state,n){//state 是把上面的数据引入进来的
    console.log(n);//传入的第二参数的那个对象
    state.num+= n.a;
  }
}
1. 利用mapMutations引入sotre中的触发状态
<button type="button" name="buttonAdd" @click="add({a:10})">map=>加一个</button><!-- 传值的话只需要在括号里传,但要注意格式 -->
      <button type="button" name="buttonAdd" @click="minus">map=>减一个</button>

import {mapMutations} from 'vuex'

//因为方法所以写在组件中的methods中
 methods:mapMutations([
     'add',
     'minus'
   ])

三、 getters --- 获取者

注意:在vue2.x中的computed中不要使用箭头函数,因为箭头函数中的this指的是上一层不是本层。
//组件中
import {mapGetters} from 'vuex'

computed:{
    /*count(){
      return this.$store.getters.num
    }*/
    //map对象方式获取getters
    ...mapGetters({
      count:'num'//引进是静态的
    })
  },
//store.js文件中
const getters = {
  num:function (state) {
    return state.num;
  }
}
export default new Vuex.Store({
  state,
  mutations,
  getters
});

注意:..mapGetters({})使用了三个点“...”,由于vue-cli生成的依赖包中不能解析此语法,所以需要进行如下配置。

  1. npm install babel-preset-stage-2 --save-dev
  2. 在.babelrc文件中加一个配置
["stage-2"]

四、 actions --- 异步状态

和Mutations的区别是Mutations是同步状态,Actions是异步状态,可以调用Mutations中的状态,异步的批处理的一个集合。

//组件中
<button type="button" name="buttonAdd" @click="addPlus">addPlus =>加二个</button>
      <button type="button" name="buttonAdd" @click="minusPlus">minusPlus</button>

import {mapActions} from 'vuex'

 methods:{
     ...mapMutations([
       'add',
       'minus'
     ]),
     ...mapActions([
       'addPlus',
     ]),
     ...mapActions({
       minusPlus:'minusPlus'
     })
   }

//store.js中
const actions = {
  addPlus(context){//context代表了整个的store
    context.commit('add',{a:2}); //每次加2
    setTimeout(()=>{
        context.commit('minus');
    },3000)
    console.log('Actions中的加');
  },
  minusPlus({commit}){//commit
    commit('minus')
  }
}
export default new Vuex.Store({
  state,
  mutations,
  getters,
  actions
});

五、 module --- 模块化

当 state, mutations, getters,actions太多的时候,我们就需要分成不同组别的模块组。

//组件中
  A模块组中的num => {{  $store.state.a.numA }} 
  B模块组中的num => {{  $store.state.b.numB }}
//store.js中
const moduleA ={
  state: {
    numA: 888
  }
}
const moduleB ={
  state: {
    numB: 666
  }
}

export default new Vuex.Store({
  modules:{
    a:moduleA,
    b:moduleB
  }
});

最终demo如下图:


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

推荐阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,901评论 0 7
  • Vuex是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件...
    萧玄辞阅读 3,070评论 0 6
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 7,971评论 4 111
  • 系列文章:Vue 2.0 升(cai)级(keng)之旅Vuex — The core of Vue applic...
    6ed7563919d4阅读 4,488评论 2 58
  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应...
    白水螺丝阅读 4,616评论 7 61