vuex模块化 2020-07-20


1、下载 (整体代码在最下面 也可直接查看)

下载vuex,会得到一个store文件夹,内部我们有一个index根文件,自己添加module文件夹

npminstallvuex --save

在main.js中引入import store from "./store/index";

目前我只建了home模块

2、将module里面的模块引入index.js中

import Vue from 'vue'

import Vuex from 'vuex'

//引入用户模块

import home from './module/home'

Vue.use(Vuex)

export default new Vuex.Store ({

  modules: {

    home,

  }

}) 

3、在每个模块当中(home.js)写入独立的state,mutations等等。。。

const state = {

}

const mutations ={

}

const actions ={

}

const getters = {

}

export default {

    namespaced: true,

    state,

    getters,

    mutations,

    actions

}

导出时,会多出一个namespaced: true,一般我们在模块使用时,都会加入这个属性。命名空间:namespaced: true:当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名,也就是说,我们在调用这些方法时,需要加上这个文件的路径(比如我要访问这个文件中的state里边的某个属性:this.$store.state.home。后边这个home就是多了个home.js模块名,因为如果不加模块名,那我们会访问所有模块中的属性,那就乱了),所以我们要加上命名空间,相当于独立的区块去使用,模块和模块之间互不干扰。

home.js中

const state = {

    userName:"Admin",

    typeMenut:"sideMenut",

}

const mutations ={

   setMenut(state, typeMenut) {

        state.typeMenut = state.typeMenut == 'headerMenut'?'sideMenut':'headerMenut';

    }

}

const actions ={

}

const getters = {

}

export default {

    namespaced: true,

    state,

    getters,

    mutations,

    actions

}

我们重点说一下vue中怎么获取模块中的内容。我们可以和平常一样,直接用this.$store.state.home.userName来获取到state中的userName内容。

在结构中:

在methods中:


我们今天说说在项目中最常使用的:辅助函数mapState,mapGetters,mapActions 和mapMutations 。

不一一举例,简单说两个mapState和mapActions ,深入理解可去看官网:

我们在使用时,需要先引入(home.vue中)

import{ mapState,mapActions }from'vuex'

这两个函数,前者写在计算属性computed中,后写是方法,写在 methods中;

在写入时,需要用到展开符...,它可以将内容一 一的展开

举例:var a = [1,2,3] var b = [4,5,6] var c = [...a,...b] // 打印c为:[1,2,3,4,5,6]

那我们获取一下state中的userName:

 computed: {

        ...mapState({

            userName: state => state.home.userName,

        })

    },

在标签中直接使用



methods: {

...mapMutations(['home/setMenut']), 

 setMenut() {

this['home/setMenut']()//注意,这里this后没有点 } 

 }

展开mapMutations,返回是个数组,数组中是个字符串,返回home模块下的addsetMenut,定义一个setMenut,直接触发就可以。有人会问,触发mutations中的方法不是应该用commit吗,答案是我们用了mapMutations,它会将这个路径直接映射成commit方法,所以我们直接用就行,这也是与原来的区别。

这样写出来是好用的但是home是个模块,在这个模块下如果命名空间比较深入,还有其他模块,一层一层比较多就会变成这样


因此我们可以用createNamespacedHelpers(可点击查看具体)命名空间辅助函数。它返回一个对象,对象里有新的绑定在给定命名空间值上的组件绑定辅助函数。

就是我们可以从vuex中引入 createNamespacedHelpers ,然后将刚才的字符串作为参数,传进来,如下:


// 这里引入createNamespacedHelpers

import { createNamespacedHelpers } from 'vuex'

// 定义mapState, mapMutations ,并将home传入 createNamespacedHelpers

const { mapState, mapMutations } = createNamespacedHelpers('home')

methods: {

// 这里可以直接使用mapState...mapMutations(['mapState'])

 }

这就是vuex模块化,写法都很多,看我们自己的习惯,当然了,我们在模块中,还可以使用常量替代 Mutation 事件类型。在多人开发时,我们知道 mutations 中放入了方法,如果有很多方法,多人协作时找起来会比较麻烦,那我们可以创建一个放入常量的文件(我创建的 type.js 文件),在里边我们可以定义常量,但注意的是,我们开发中习惯常量要大写,单词之间用下划线分开。并且,在模块中引入这个文件:

1、type.js 在里边创建一个常量,开发时前后要一致,并加以标注:

// 前后都要大写,一般前后名称一致,但是为了我们能够理解,本次我们写两个不一致的。

// 开发中,我们应该这样写:export const SET_MENUT = 'SET_MENUT' // 修改菜单类型

// 本次我们定义前后不一样的export const SET_MENUT  ='AAA'

2、在home模块中引入 type.js 并使用引入进来的常量:

import { SET_MENUT } from './type'


3、页面中




全部代码

以token为例

index.js

import Vue from 'vue'

import Vuex from 'vuex'

//引入用户模块

import common from './module/common'

Vue.use(Vuex)

export default new Vuex.Store ({

  modules: {

    common,

  }

}) 

main.js



common.js

import { SET_TOKEN } from '../type'

const state = {

    domain: 'g1_kanban_ocr',

    token:null

}

const mutations ={

    [SET_TOKEN](state, token) {

        state.token = token;

    }

}

const actions ={

}

const getters = {

}

export default {

    namespaced: true,

    state,

    getters,

    mutations,

    actions

}

type.js

export const SET_TOKEN = 'SET_TOKEN'

vue页面

// 这里引入createNamespacedHelpers 

import { createNamespacedHelpers } from 'vuex' 

// 定义mapState, mapMutations ,并将common 传入 createNamespacedHelpers

const { mapState, mapMutations } = createNamespacedHelpers('common')

 methods: {

    onSubmit(values) {

        values.domain =this.$store.state.common.domain

        getToken(values) 

        .then(res => {

            this.$store.commit('common/SET_TOKEN', res.token)

        })

        .catch(res => {

            this.hasError = true;

        })

    }

  },

不足地方后续更新中。。。。。

你可能感兴趣的:(vuex模块化 2020-07-20)