(转)Vuex简单入门

今天试了一下Vuex,感受跟Redux的实现思想相似。再此,简单地总结一下。javascript

什么是Vuex

在Vue中,多组件的开发给咱们带来了不少的方便,但同时当项目规模变大的时候,多个组件间的数据通讯和状态管理就显得难以维护。而Vuex就此应运而生。将状态管理单独拎出来,应用统一的方式进行处理,在后期维护的过程当中数据的修改和维护就变得简单而清晰了。Vuex采用和Redux相似的单向数据流的方式来管理数据。用户界面负责触发动做(Action)进而改变对应状态(State),从而反映到视图(View)上。以下图所示:html


vuex-flow.png

使用Vuex

安装:vue

npm install --save vuex

引入:java

  1.  
    import Vuex from 'vuex'
  2.  
    import Vue from 'vue'
  3.  
     
  4.  
    Vue.use(Vuex)

Vuex的组成部分

完整的应用Vuex开发的应用结构应该是这样的:web


vuex-complete.png

下面针对比较核心的部分进行说明。vuex

State

State负责存储整个应用的状态数据,通常须要在使用的时候在跟节点注入store对象,后期就可使用this.$store.state直接获取状态npm

  1.  
    //store为实例化生成的
  2.  
    import store from './store'
  3.  
     
  4.  
    new Vue({
  5.  
    el: '#app',
  6.  
    store,
  7.  
    render: h => h(App)
  8.  
    })

这个store能够理解为一个容器,包含着应用中的state等。实例化生成store的过程是:bash

  1.  
    const mutations = {...};
  2.  
    const actions = {...};
  3.  
    const state = {...};
  4.  
     
  5.  
    Vuex.Store({
  6.  
    state,
  7.  
    actions,
  8.  
    mutation
  9.  
    });

后续在组件中使用的过程当中,若是想要获取对应的状态你就能够直接使用this.$store.state获取,固然,也能够利用vuex提供的mapState辅助函数将state映射到计算属性中去,如app

  1.  
    //我是组件
  2.  
    import {mapState} from 'vuex'
  3.  
     
  4.  
    export default {
  5.  
    computed: mapState({
  6.  
    count: state => state.count
  7.  
    })
  8.  
    }

这样直接就能够在组件中直接使用了。异步

Mutations

Mutations的中文意思是“变化”,利用它能够更改状态,本质就是用来处理数据的函数,其接收惟一参数值statestore.commit(mutationName)是用来触发一个mutation的方法。须要记住的是,定义的mutation必须是同步函数,不然devtool中的数据将可能出现问题,使状态改变变得难以跟踪。

  1.  
    const mutations = {
  2.  
    mutationName( state) {
  3.  
    //在这里改变state中的数据
  4.  
    }
  5.  
    }

在组件中触发:

  1.  
    //我是一个组件
  2.  
    export default {
  3.  
    methods: {
  4.  
    handleClick() {
  5.  
    this.$store.commit('mutationName')
  6.  
    }
  7.  
    }
  8.  
    }

或者使用辅助函数mapMutations直接将触发函数映射到methods上,这样就能在元素事件绑定上直接使用了。如:

  1.  
    import {mapMutations} from 'vuex'
  2.  
     
  3.  
    //我是一个组件
  4.  
    export default {
  5.  
    methods: mapMutations([
  6.  
    'mutationName'
  7.  
    ])
  8.  
    }

Actions

Actions也能够用于改变状态,不过是经过触发mutation实现的,重要的是能够包含异步操做。其辅助函数是mapActionsmapMutations相似,也是绑定在组件的methods上的。若是选择直接触发的话,使用this.$store.dispatch(actionName)方法。

  1.  
    //定义Actions
  2.  
    const actions = {
  3.  
    actionName({ commit }) {
  4.  
    //dosomething
  5.  
    commit( 'mutationName')
  6.  
    }
  7.  
    }

在组件中使用

  1.  
    import {mapActions} from 'vuex'
  2.  
     
  3.  
    //我是一个组件
  4.  
    export default {
  5.  
    methods: mapActions([
  6.  
    'actionName',
  7.  
    ])
  8.  
    }

Getters

有些状态须要作二次处理,就可使用getters。经过this.$store.getters.valueName对派生出来的状态进行访问。或者直接使用辅助函数mapGetters将其映射到本地计算属性中去。

  1.  
    const getters = {
  2.  
    strLength: state => state.aString.length
  3.  
    }
  4.  
    //上面的代码根据aString状态派生出了一个strLength状态

在组件中使用

  1.  
    import {mapGetters} from 'vuex'
  2.  
     
  3.  
    //我是一个组件
  4.  
    export default {
  5.  
    computed: mapGetters([
  6.  
    'strLength'
  7.  
    ])
  8.  
    }

Plugins

插件就是一个钩子函数,在初始化store的时候引入便可。比较经常使用的是内置的logger插件,用于做为调试使用。

  1.  
    import createLogger from 'vuex/dist/logger'
  2.  
    const store = Vuex.Store({
  3.  
    ...
  4.  
    plugins: [createLogger()]
  5.  
    })

最后,还有一些高级用法,如严格模式,测试等可能使用频率不会特别高。有须要的时候查官方文档就能够了。总的来讲,Vuex仍是相对比较简单的,特别是若是以前有学过Flux,Redux之类的话,上手起来更加容易。

参考文档

http://vuex.vuejs.org/zh-cn/index.html

相关文章
相关标签/搜索