vue 状态管理之vuex

可用于登录的状态管理

一、vuex包含五个基本的对象:

state:存储状态,也就是变量;

getters:派生状态,就是set/get,中的get,有两个可选的参数;state、getters分别可以获取state中的变量和其他getters。外部的调用方式:store.getters.personInfo();和vue的computed类似。

mutations:提交状态修改,也是就set/get,中的set,这是vuex中唯一修改state的方式,但是不支持异步操作。第一个参数默认是state。外部调用的方式是this.store.commit('SET_AVATAR', this.headerImg);和vue中的methods类似。

actions:和mutations类似。只不过actions支持异步操作。第一个参数默认是和store具有相同参数属性的对象。外部调用方式:

this.$store.dispatch("SetMediaType", JSON.parse(JSON.stringify(this.mediaTypeList)));

modules:store的子模块,内容就相当于是store的一个实例。调用方式和前面介绍的相似,只是要加上当前子模块名,如:this.store.a.getters.XXX();

二、Vuex

2.1  vuex安装

cnpm install vuex --save

显示使用vuex插件,一般写在src/main.js中,或者写在其他js中,然后再在main.js中引入

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

2.2 定义一个全局实例对象(Vuex.Store)

该对象的状态(state)就是全局属性,类似于组件的data,每个组件都可以访问和修改属性。

可变的(mutations)类似于组建中的methods,mutations中的每个方法称作为mutation handler,用来修改state中的值,方法的参数可以用两个(state,payload)state标识全局单例对象,payload(载荷)也就是参数,调用时可以传递参数,该参数是可选的。

使用mutations的规则是:需要在我的store中初始化好所有所需的属性。


getters的定义

将store作为vue的选项,这样vue会将store“注入”到每一个子组件中,也就是说每个组件都可以通过this.$store来访问全局单例对象的store。

代码如下:

editHeaderImg(sendData).then(res => {

     if(res.success) {

         this.$message.success(res.msg);

         this.headerImg = this.$formatURL(this.headerImgForm);

         this.fileList = [];

         this.$store.commit('SET_AVATAR', this.headerImg);

    }

});

调用store中的mutations方法只能通过提交的方式this.$store.commit('方法名',负载参数)这种形式来调用,而不能使用this.$store.方法名,这种方式直接调用。除了这种方式,vuex还提供了一种将mutations映射(map)为methods的方式,然后再使用时直接调用method就会直接调用methos会帮我自动commit。

mapGetters() 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性,mapGetters() 函数接收一个参数,参数类型可以是对象类型也可以是数组类型


2.3 actions

Action类似于mutation, Action用于分发(dispatch)mutation,而不直接修改状态。Action可以包含任意异步操作(如发送http请求),action方法接收两个参数(context, payload),context为Context对象,context对象store实例具有相同方法和属性,所以context可以解构成var {state, dispatch, commit, getters} = context

例如:

@store/modules/dic.js

const dic = {

    state: {

        industryTree: [],

        mediaTypeTree: []

    },

    mutations: {

SET_INDUSTRY: (state, lsit) => {

state.industryTree = lsit;

    },

SET_MEDIATYPE: (state, lsit) => {

state.mediaTypeTree = lsit;

        }

    },

    actions: {

 SetIndustry: ({ commit }, list) => {

 commit('SET_INDUSTRY', list);

 },

 SetMediaType: ({ commit }, list) => {

 commit('SET_MEDIATYPE', list);

 }

    }

};

export default dic;

@components/otherDialog/selBusiness.vue

// 行业数据

getBusiness() {

const industryTree = this.$store.getters.industryTree;

if(industryTree.length == 0) {

 getBusinessTree().then(res => {

  this.businessTypeList = res.data;

  this.$store.dispatch("SetIndustry", res.data);

 });

}else {

 this.businessTypeList = industryTree;

    }

},

你可能感兴趣的:(vue 状态管理之vuex)