从零开始学习使用 vuex

从零开始学习使用 vuex

本文是建立在,对vuex理论有一定理解的基础上写的。
因为官方文档的写法是 针对 有一定的vue开发经验 和 JavaScript 有一定理解的开发者看的,对于小白级别的我来说,理解起来有一定困难。所以,我想向我一样的小白想尽快上手vuex....

详情请参考vuex官方文档

安装

直接下载 CDN 安装

CDN 链接地址:https://unpkg.com/vuex
指定到固定版本:https://unpkg.com/vuex@2.0.0

<script src="/path/to/vue.js"></script>
<script src="/path/to/vuex.js"></script>

npm 方式安装 (推荐!简单快捷,便于管理)

npm install -save vuex

yar

yarn add vuex

自己构建

git clone https://github.com/vuejs/vuex.git node_modules/vuex
cd node_modules/vuex
npm install
npm run build

导入vue工程中使用

  • main.js 入口文件

按照如下方式导入,工程就可以使用vuex的环境了

// 导入vuex头文件
import Vuex from 'vuex'
// 这里表示全局导入vuex
Vue.use(Vuex)
// 这里是我自定义的store文件 导出store对象
import store from '@/study/vuexStudy/store/store.js'

入口组件<App/>中,绑定store

new Vue({
  el: '#app',
  template: '<App/>',
  components: { App },
  store
})

到这里 算是万里长征走了第一步。

创建Store对象

store 的结构:

export const store = new Vuex.Store({

  // ------state:状态值存储,这里可以存储n个状态的值
  state: {count: '1'},
  
  // ------getter:store中定义的getters可以认为是store的计算属性
  // getters接收state作为其第一个参数
  getters: {
    done (state) {
      return state.count + 5
    }
  },
  
  // ------mutations:状态值的改变,操作状态值
  // $store.commit(mutationsName, params)是更改状态值的唯一方法
  mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  },

  // ------actions:可以认为是包装了mutations的function 需要用 dispatch(actionName) 的方式去派发
  actions: {
    add (context) {
      context.commit('increment')
    },
    addAsync (context) {
      // 延时1秒
      setTimeout(() => {
        context.commit('increment')
      }, 1000)
    }
  },
  // store可以合并几个子store,以此来进行项目的模块化
  modules: {
    a: moduleA,
    b: moduleB
  }
})

编辑定义store实体对象:

  • store.js文件中

这里为了便于抽离 我们外部声明城对象实体后嵌入绑定到store

  1. 创建一个store对象

    export default const store = new Vuex.Store({
      state,//绑定之前创建的state对象到store中
      mutations,
      getters,
      actions,
      modules
    })
    
  2. 定义一个状态对象 state(实体)

    const state = {
      count: 0,
      state1: 1,
      state2: 2,
      state3: 3
    }
    
  3. 定义getters对象

    const getters = {
      done (state) {
        return state.count + 5
      },
      getState1: function (state) {
        return state.state3
      },
      // ES6简写
      getState2: state =>  state.state2
    }
    
  4. .vue 文件中直接获取state值

    首先导入辅助函数:

    import { 
        mapState, 
        mapGetters, 
        mapMutations, 
        mapActions 
        } from 'vuex'
    
    • 第一种方式:绑定到组件属性中,直接获取 (一般不用这个,绑定到computed中是最合适的)$store.state.count并使用
    export default {
        data() {
            return {
              testCount: this.$store.state.count
            }
        }
    }
    
* 第二种方式: 绑定到计算属性中(适合对store中的原始状态值进行一定处理的情况)

```JavaScript
export default {
    data() {
        return {
          testCount: this.$store.state.count
        }
    },
    computed:{
        testComputedCount1: function () {
            return this.$store.state.count + 22
        }
    }
}
```

* 第三种方式:mapState辅助函数绑定状态state值到组件计算属性中

```JavaScript
export default {
    data() {
        return {
          testCount: this.$store.state.count
        }
    },
    computed:{
        testComputedCount1: function () {
            return this.$store.state.count + 22
        },
        ...mapState({
            count: state => state.count,
            mapState1: state => state.state1,
            mapState2: state => state.state2
        }),
    }
}
```

* 第四种方式:使用store中绑定的getters进行获取

```JavaScript
export default {
    data() {
        return {
          testCount: this.$store.state.count
        }
    },
    computed:{
        testComputedCount1: function () {
            return this.$store.state.count + 22
        },
        ...mapState({
            count: state => state.count,
            mapState1: state => state.state1,
            mapState2: state => state.state2
        }),
        testComputedGettersCount2: funtion () {
            return this.$store.getters.done
        }
    }
}
```

* 第五种方式: 借助mapGetters辅助函数绑定getters到vue的计算属性中

```JavaScript
export default {
    data() {
        return {
          testCount: this.$store.state.count
        }
    },
    computed:{
        testComputedCount1: function () {
            return this.$store.state.count + 22
        },
        ...mapState({
            count: state => state.count,
            mapState1: state => state.state1,
            mapState2: state => state.state2
        }),
        testComputedGettersCount2: funtion () {
            return this.$store.getters.done
        },
        
        //直接绑定方法数组的方式
        ...mapGetters([
            'getState1',
            'getState2',
            'getState3'
        ]),
        
        //重命名对象绑定方式
        ...mapGetters({
          mapGetterState1: 'getState1',
          mapGetterState3: 'getState3'
        }),
    }
}
```
  1. 触发动作行为改变状态值

    方式一:$store.commit('mutationsName')

    方式二:$store.dispatch('actionsName')

    store.js文件中:

    • 初始化 mutations 和 actions (相当于是methods)
    const mutations = {
        increment (state) {
            // 变更状态
            state.count = state.count * 5
        }
    }
    
    import {action4} from '@/path/actions.js'
    const actions = {
        // 同步方法
        add: function (context) {
            context.commit('increment')
        },
        // 延时操作 用于网络请求啊啥的
        addAsync (context) {
            // 延时1秒
            setTimeout(() => {
                context.commit('increment')
            }, 1000)
        },
        // 简写方式
        action2 (context) {
            context.commit('increment')
        },
        // 抽离到单独文件中,在导进封装好的变量来直接使用即可(导进来的目的是为了接收第一个参数:state),不绑定到store,需要手动传入store对象
        action4: action4,
    }
    
  • 绑定action 和 mutations 到 methods,然后 调用就行了

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

推荐阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,934评论 0 7
  • Vuex 的学习记录 资料参考网址Vuex中文官网Vuex项目结构示例 -- 购物车Vuex 通俗版教程Nuxt....
    流云012阅读 1,455评论 0 7
  • vuex 状态管理器 作为应用中所有组件的中央储存 只能以预定的方式去操作状态 把所有组件共享的状态抽取出来作为全...
    一只大椰子阅读 789评论 0 1
  • import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(V...
    F_imok阅读 2,647评论 0 12
  • Vuex 是什么? ** 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式**。它采用集中...
    Rz______阅读 2,303评论 1 10