一、简单介绍
1.定义:在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。多个组件需要共享数据时使用。
一般情况下,我们会在 Vuex 中存放一些需要在多个界面中进行共享的信息。比如用户的登录状态、用户名称、头像、地理位置信息、商品的收藏、购物车中的物品等,这些状态信息,我们可以放在统一的地方,对它进行保存和管理。
2.搭建vuex环境
(1)安装Vuex 插件
npm install --save vuex@3
(2)创建文件:src/store/index.js
(3)在index.js中引入并且使用仓库
import Vuex from 'vuex';
Vue.use(Vuex);
(4)引入组件小仓库
import home from './home';
(5)对外暴露仓库,注册小仓库
export default new Vuex.Store({
modules: {
home}
})
总仓库写法:
//大仓库
import Vuex from 'vuex';
import Vue from 'vue';
//安装插件
Vue.use(Vuex);
//引入小仓库
import home from './home';
import search from './search';
//对外暴露仓库
//第一个注意:需要关键字new,你没有new会报错的
//第二个注意:Store构造函数,书写的时候别小写
export default new Vuex.Store({
//大仓库需要注册全部小仓库
//vuex新增的一个配置项:模块式开发.右侧V也是对象
modules: {
home,
search,
}
})
小仓库写法:
//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)
//准备state对象——保存具体的数据
const state = {}
//准备mutations对象——修改state中的数据
const mutations = {}
//准备actions对象——响应组件中用户的动作,异步操作
const actions = {}
//准备getters对象——获取数据并渲染,数据简化
const getters = {};
//创建并暴露store
export default new Vuex.Store({
actions,
mutations,
state
})
(6)在 main.js 文件中挂载使用
//注册仓库功能
import store from './store';
//创建vm
new Vue({
el:'#app',
render: h => h(App),
store
})
二、基本使用
1.初始化数据
配置actions
、配置mutations
,操作文件store/index.js
代码实现:
//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//引用Vuex
Vue.use(Vuex)
const actions = {
//响应组件中加的动作
jia(context,value){
// console.log('actions中的jia被调用了',miniStore,value)
context.commit('JIA',value)
},
}
const mutations = {
//执行加
JIA(state,value){
// console.log('mutations中的JIA被调用了',state,value)
state.sum += value
}
}
//初始化数据
const state = {
sum:0
}
//创建并暴露store
export default new Vuex.Store({
actions,
mutations,
state,
})
2.组件中读取vuex中的数据(较少用)
//对应的vue文件下
$store.state.sum
3. 组件中修改vuex中的数据
$store.dispatch('action中的方法名',数据)
或 $store.commit('mutations中的方法名',数据)(了解)
三、vuex辅助函数的使用
1.mapState方法:用于帮助我们映射state
中的数据为计算属性
vue组件中
//利用辅助函数获取仓库state数据
import { mapState } from "vuex";
computed: {
//借助mapState生成计算属性:sum、school、subject(对象写法)
...mapState({sum:'sum',school:'school',subject:'subject'}),
//借助mapState生成计算属性:sum、school、subject(数组写法)
...mapState(['sum','school','subject']),
}
2.mapGetters方法:用于帮助我们映射getters
中的数据为计算属性
import { mapGetters } from "vuex";
computed: {
//借助mapGetters生成计算属性:bigSum(对象写法)
...mapGetters({bigSum:'bigSum'}),
//借助mapGetters生成计算属性:bigSum(数组写法)
...mapGetters(['bigSum'])
}
3.mapActions方法:用于帮助我们生成与actions
对话的方法,即:包含$store.dispatch(xxx)
的函数 (了解)
import { mapActions } from "vuex";
methods:{
//靠mapActions生成:incrementOdd、incrementWait(对象形式)
...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
//靠mapActions生成:incrementOdd、incrementWait(数组形式)
...mapActions(['jiaOdd','jiaWait'])
}
4.mapMutations方法:用于帮助我们生成与mutations
对话的方法,即:包含$store.commit(xxx)
的函数 (了解)
import { mapMutations } from "vuex";
methods:{
//靠mapActions生成:increment、decrement(对象形式)
...mapMutations({increment:'JIA',decrement:'JIAN'}),
//靠mapMutations生成:JIA、JIAN(对象形式)
...mapMutations(['JIA','JIAN']),
}
备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。
四、模块化+命名空间 (了解)
- 目的:优化,提高复用性,让代码更好维护,让多种数据分类更加明确。
- 修改
store.js
javascript
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
}
})
-
开启命名空间后,组件中读取state数据:
//方式一:自己直接读取 this.$store.state.personAbout.list //方式二:借助mapState读取: ...mapState('countAbout',['sum','school','subject']),
-
开启命名空间后,组件中读取getters数据:
//方式一:自己直接读取 this.$store.getters['personAbout/firstPersonName'] //方式二:借助mapGetters读取: ...mapGetters('countAbout',['bigSum'])
-
开启命名空间后,组件中调用dispatch
//方式一:自己直接dispatch this.$store.dispatch('personAbout/addPersonWang',person) //方式二:借助mapActions: ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
-
开启命名空间后,组件中调用commit
//方式一:自己直接commit this.$store.commit('personAbout/ADD_PERSON',person) //方式二:借助mapMutations: ...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),