提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、vuex是什么

1.概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是组件中通信的一种方式,并且适合任意组件的通信~

二、什么时候用Vuex

1.多个组件依赖同一状态

2.来自不同组件的行为需要变更同一状态

三.搭建Vuex使用环境

在main.js中    然后导入配置store配置项
import vue from "vue"
import store from "./store/index.js"

new Vue({
  render:h=>h("#app")
  store
}).$mount("#app")

 
在store文件中 导入 Vuex 插件并且使用  准备actions mutations state 配置对象
import vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex)

const actions = {}
const mutations = {}
const state = {}

export default new Vuex.Store({
  actions,mutations,state
})

四.store中的核心配置项

  • Actions(响应组件中加的动作的配置对象)
  • Mutations(实际改变State中数据的配置对象)
  • State(存放数据的配置对象)
  • getters(非必需使用)

五.基本使用

1.初始化数据state、配置actions、配置mutations,操作文件store.js

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//引用Vuex
Vue.use(Vuex)

const actions = {
  // 响应组件中点击加的动作
  jia(context,value){
    // context 表示是上下文对象  actions接收动作后,提交给Mutations一个JIA的动作和值
    context.commit("JIA",value)
  }
}
const mutations = {
  // Vuex中真正执行加的地方是在mutations中
  JIA(state,value){
    // 这个state就是store文件中定义的state配置对象
    state.sum +=value
  }
}
const state = {
  sum:0
}

// 向外导入actions,mutations,state 三个配置对象
export default new Vuex.store({
  actions,
  mutations,
  state
})

2.组件中读取vuex中的数据:$store.state.sum

3.组件中修改vuex中的数据:$store.dispatch(‘action中的方法名’,数据) 或 $store.commit(‘mutations中的方法名’,数据)

备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,也就是不写dispatch,直接编写commit

七.getters的使用

  • 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工。
  • 特点: 类型组件中的计算属性,但是计算属性只能单组件使用,getters对象定义的数据复用性更强
  • 在store.js中追加getters配置对
const getters = {
	bigSum(state){
		return state.sum * 10
	}
}
//创建并暴露store
export default new Vuex.Store({
	......
	getters
})
  • 组件中读取数据:$store.getters.bigSum

八.四个map方法的使用

1.mapState方法:用于帮助我们映射state中的数据为计算属性

computed:{
  // 借助mapState生成计算属性:sum、school、subject(对象写法)
  ...mapState({sum:"sum"},{school,"school"},{subject,"subject"})
  
    // 借助mapState生成计算属性:sum、school、subject(数组写法)
    // 数组形式的要求是计算属性的名称和Vuex中state中的属性名一致
  ...mapState(["sum","school","subject"])
}

2.mapGetters方法:用于帮助我们映射getters中的数据为计算属性

computed:{
  // 借助mapGetters生成计算属性:bigSum(对象写法)
  ...mapState({bigSum:"bigSum"})
  
    // 借助mapGetters生成计算属性:sum、school、subject(数组写法)
   	// 数组形式的要求是计算属性的名称和Vuex中getters中的属性名一致
  ...mapState(["bigSum"])
}

3.mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数

methods:{
    //靠mapActions生成:incrementOdd、incrementWait(对象形式)
    ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
  
   	//靠mapActions生成:incrementOdd、incrementWait(数组形式)
  	// 数组形式的要求是methods中的函数名和Vuex中actions的函数名一致
    ...mapActions(['jiaOdd','jiaWait'])
}

4…mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数

methods:{
    //靠mapActions生成:increment、decrement(对象形式)
    ...mapMutations({increment:'JIA',decrement:'JIAN'}),
    
    //靠mapMutations生成:JIA、JIAN(对象形式)
    // 数组形式的要求是methods中的函数名和Vuex中mutations的函数名一致
    ...mapMutations(['JIA','JIAN']),
}

备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。

九.模块化+命名空间

1.目的:让代码更好维护,让多种数据分类更加明确。
2.修改store.js

const countAbout = {
  namespaced:true,//开启命名空间
  state:{x:1},
  mutations: { ... },
  actions: { ... },
  getters: {
    bigSum(state){
       return state.sum * 10
    }
  }
}

const personAbout = {
  namespaced:true,//开启命名空间
  state:{ ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    countAbout,
    personAbout
  }
})

3.开启命名空间后,组件中读取state数据:

//方式一:自己直接读取
this.$store.state.personAbout.list
//方式二:借助mapState读取:
...mapState('countAbout',['sum','school','subject']),

4.开启命名空间后,组件中读取getters数据:

/方式一:自己直接读取
this.$store.getters['personAbout/firstPersonName']
//方式二:借助mapGetters读取:
...mapGetters('countAbout',['bigSum'])

5.开启命名空间后,组件中调用dispatch

//方式一:自己直接dispatch
this.$store.dispatch('personAbout/addPersonWang',person)
//方式二:借助mapActions:
...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

6.开启命名空间后,组件中调用commit

//方式一:自己直接commit
this.$store.commit('personAbout/ADD_PERSON',person)
//方式二:借助mapMutations:
...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),
Logo

前往低代码交流专区

更多推荐