如何优雅的使用Vuex

134 阅读1分钟

如何优雅的使用Vuex

本文优势主要体现在:引入Vuex时,默认开启命名空间,利用ES6改进mutations的写法,写起来更简洁

1.文件目录

D:\vue-test\src\store

+---store
|   |   index.js
|   |   
|   \---modules
|           dataForm.js
|           setting.js

2. 引入Vuex

Vuex中的store文件夹下的index.js会引入Vuex,然后使用require.context('./modules', true, /\.js$/)将modules文件夹下的文件引入,打开命名空间,文件名就是命名空间的模块名

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const modulesFiles = require.context('./modules', true, /\.js$/)
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default
  modules[moduleName].namespaced = true;   //打开命名空间
  return modules
}, {})

const store = new Vuex.Store({modules})

export default store

3. 使用Vuex

3.1 改进mutations的写法

state名称可以在使用this.$store.commit时,动态传入

/*store文件下的dataForm.js*/
state: () => ({
    channelOptions: {},
    cableItemOptions: {}
})

mutations: {
//mutation的常用写法
updateOptions(state,  data ) {
    state.channelOptions = data
  }
    
//mutation的改进写法,state名称可以在使用this.$store.commit时,动态传入
updateOptions(state, { data, type }) {
  //{data,type}是把传进来的对象解构赋值
  state[type] = data
  }
}
--------------------------------------------------
/*vue组件.js*/
//dataForm是文件名即module名,updateOPtions即mutations里的方法名
this.$store.commit("dataForm/updateOptions", {
  data: data, //你想要传入的值
  type: "channelOptions" //想修改的state属性名称
});

如果不想覆盖原来的对象,只改变一部分属性值,可用扩展运算符

/*store文件下的dataForm.js*/
state: () => ({
    channelOptions: {
        id:'5',
        name:'名称',
        type:'类型'
    }
})

mutations: {
//如果不想覆盖原来的对象,可用扩展运算符
updateOptions(state, { data, type }) {
      //相当于state.channelOptions = {...state.channelOptions,...data}
      state[type] = { ...state[type], ...data }
    },
}
--------------------------------------------------------------------
/*vue组件.js*/
this.$store.commit("dataForm/updateOptions", {
        data: { type: '新类型' },//这样只更改type的值,不会更改id和name属性
        type: "channelOptions"
 });

3.2 vuex中state的引用

使用辅助函数mapState,简化写法

/*vue组件.js*/
import { mapState } from "vuex";
export default {
  computed: {
  //第一个参数是命名空间的模块名,第二个参数对象中属性名自己决定,属性值对应state中的属性
    ...mapState("dataForm", {
      $store_channelOptions: "channelOptions",
      $store_cableItemOptions: "cableItemOptions",
    })
  },
  
  mounted() {
      //this.$store_cableItemOptions相当于this.$store.state.dataForm.cableItemOptions
      console.log(this.$store_cableItemOptions)
  }
}

为什么我要添加$store_这个前缀,因为需要让其他人阅读代码时,能够直观看出我使用了vuex,避免与vue组件中的普通属性搞混。

注重代码质量更需要让其他人能读懂你的代码

3.3 补充getters的引用方法

/*vue组件.js*/

//dataForm是命名空间的模块名,Isshow是getters中的方法名
this.$store.getters['dataForm/IsShow']"