vuex

Posted xjy20170907

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vuex相关的知识,希望对你有一定的参考价值。

核心概念:State、Getter、Mutation、Action、Module

使用

新建store.js,引入vue和vuex,执行 Vue.use(Vuex) 来全局安装 Vuex.。Vuex.Store 即 Vuex 的构造函数,来初始化 Vuex 实例:

技术图片

 在根实例中注册store:

技术图片

state

在state中定义属性name,给一个初始值 “张三”。在store实例中注册state,在组件中使用$store.state.name使用定义的属性name,页面显示 ‘store中的姓名:张三’:

技术图片 技术图片

这里我们使用的是this.$store.state来访问vuex中定义的变量,还有一种辅助函数mapState的方式。

mutation

mutation是更改store中状态的唯一方法,之所以说唯一,是因为vuex中规定只能通过提交mutation的方式去更改store中的状态,包括action中的操作,也是通过提交mutation去修改。vuex中规定原则上mutation中不能包含异步操作。mutation下事件的调用是通过 this.$store.commit 传入对应的type触发的:

技术图片 技术图片

action

action用this.$store.dispatch方法触发,触发的是异步的操作,其他的和mutation一样:

技术图片 技术图片

getter 

getter类似计算属性,它的返回值会根据它的依赖被缓存起来,且依赖对象发生改变的时候它才会被重新计算。

getter的是对store中某个属性相同的处理操作抽出出来,做了一个公共的处理。

getter的使用方法 $.store.getters.属性名。

例如,使用store中name的时候,需要做一个判断:如果是张三,返回“张三最棒”,其它的原样返回。用computed可以这样做:

技术图片

用getter实现:

技术图片 技术图片  

module

module是对store的一个分割,将store分割成一个个小的模块,每个模块中又具有store完整的功能。他的使用主要面向一些状态非常多的大型应用。

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

module可以和其他同时使用

技术图片

vuex的辅助函数:mapState、mapMutations、mapGetters、mapActions

首先在组件里引入它们:

import { mapActions, mapMutations, mapGetters, mapState } from ‘vuex‘;

mapState

在computed中引入,depDate为indexModule里的state:

computed: {
        ...mapState({
            depDate: state => state.indexModule.DepDate,
        })
 },

在页面中可以直接使用depDate:

<list-calendar :depDate="depDate"></list-calendar>

mapMutations

在methods中引入:

methods: {
    ...mapMutations([
        ‘pushFlight‘
    ])
}

在页面中直接使用这个方法:

this.pushFlight({
    flightInfo: json.flights,
    queryCHDINFModule: queryCHDINFModule
});

mutations里配置:

mutations: {
        pushFlight(state, obj) {
            let { flightInfo } = obj;
            let flightArr = flightInfo;
            handleFlightList(state, {stateKey: ‘list‘, flightArr});
},

mapGetter

在computed中引入:

computed: {
        ...mapGetters([
            ‘getFlightList‘,
            ‘getMismatchList‘
        ]),
}

页面中直接使用:

this.getFlightList.length;

<flight-list :list="getMismatchList"></flight-list>

getter里的设置:

getters: {
        getFlightList: state => {
            return state.list;
        },
        getMismatchList: state => {
            return state.mismatchList;
        },
}

mapActions

在methods中引入:

methods: {
        ...mapActions([
            ‘toggleToast‘,
            ‘setCityCode‘,
            ‘getTrainInfo‘
        ]),
}

页面中直接使用:

this.setCityCode({
    name: query.depCity,
    type: ‘depart‘
});

action中的设置:

      setCityCode: ({ commit }, cityObj) => {
            var code = ‘‘;
            gncitys.forEach(function(val) {
                if (val.slice(0, 9).indexOf(cityObj.name) > -1) {
                    code = val[0];
                }
            });
            commit(‘changeCity‘, {
                item: { item: cityObj.name, code: code },
                id: cityObj.type
            });
        }

 

原文:https://www.cnblogs.com/xihao/p/11420884.html

以上是关于vuex的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

项目集成 vue-router 和 vuex

手把手教你学vue-4(vuex)

Vue 教程(四十九)Vuex 核心概念和项目结构

Vue 教程(四十九)Vuex 核心概念和项目结构

Vue 教程(四十九)Vuex 核心概念和项目结构