美文网首页
从零开始学习使用 vuex

从零开始学习使用 vuex

作者: 浮生随笔 | 来源:发表于2018-07-30 16:53 被阅读83次

从零开始学习使用 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'
            })
        }
    }
    

相关文章

  • 从零开始学习使用 vuex

    从零开始学习使用 vuex 本文是建立在,对vuex理论有一定理解的基础上写的。因为官方文档的写法是 针对 有一定...

  • Vue-学习总结(一)-vuex

    在学习vuex之前,我们要思考这些问题:什么是vuex?为什么使用vuex?怎么使用vuex?伴随着这些问题我们来...

  • VueX 学习笔记

    学习目的 了解和熟练使用 VueX,能够在实际项目中运用。 VueX介绍 Vuex 是一个专为 Vue.js ...

  • Vuex之结构

    之前整理了vuex的使用场景,现在开始学习学习怎么使用。我会根据官网api来重新学习一遍。 首先我们要安装vuex...

  • Vuex

    1.Vuex概述 2.Vuex基本使用 3.使用Vuex完成todo案例 1.Vuex概述 Vuex是实现组件全局...

  • Vuex 快速使用

    本文对 Vuex 官方文档重新组织编排,希望正在学习 Vue 的同学们,在阅读后可快速使用 Vuex。 开始使用 ...

  • 04 Vue中组件通信(下)

    使用vuex来实现组件通信一、vuex 的安装与使用 安装npm install vuex -S 使用 二、 vu...

  • 通过一个简单实例了解vuex

    简单说明 什么是vuex,vuex怎么使用,什么场景下适合使用vuex, vuex 文档中都有介绍。看完文档之后,...

  • VueX--VUE核心插件

    使用VueX方法 1.安装vuex模块 npm install vuex --save 2.作为插件使用 Vue....

  • vuex@2.x 文档

    1、https://vuex.vuejs.org/zh-cn/2、vuex 使用文档3、vuex2.0 基本使用(...

网友评论

      本文标题:从零开始学习使用 vuex

      本文链接:https://www.haomeiwen.com/subject/srwfvftx.html