VueX
一.概念
在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。
即 : 在组件间共享数据时可以使用vuex
- Store
- 每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。
- State
- 驱动应用的数据源,用于保存所有组件的公共数据.。
- Getter
- 可以将 getter 理解为 store 的计算属性, getters 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
- Mutation
- mutations 对象中保存着更改数据的回调函数,该函数名官方规定叫 type, 第一个参数是 state, 第二参数是payload, 也就是自定义的参数。mutation 必须是同步函数。mutations 对象里的方法需要使用store.commit 调用
- Action
- Action 提交的是 mutation 而不是直接变更状态。action 可以包含任意异步操作。actions 对象里的方法需要使用 store.dispatch 调用。
- Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。
- Module
- 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。
二.搭建vuex环境
-
//引入Vue核心库 import Vue from 'vue' //引入Vuex import Vuex from 'vuex' //应用Vuex插件 Vue.use(Vuex) //准备actions对象——响应组件中用户的动作 const actions = {} //准备mutations对象——修改state中的数据 const mutations = {} //准备state对象——保存具体的数据 const state = {} //创建并暴露store export default new Vuex.Store({ actions, mutations, state })
-
main.js
中创建vm时传入store
...... //引入store import store from './store' ...... //创建vm new Vue({ el:'#app', render: h => h(App), store })
三.基本使用
actions
、配置mutations
,操作文件//引入Vue核心库 import Vue from 'vue' //引入Vuex import Vuex from 'vuex' //引用Vuex Vue.use(Vuex) export default new Vuex.Store({ //初始化数据 state: { num:0, person:[] }, //执行加 mutations: { jia(state){ //console.log("mutations的jia被调用了") state.num = parseInt(state.num)+1 }, jian(state){ //console.log("mutations的jian被调用了") state.num -= 1 }, jiShuJia(state){ //console.log("mutations的jiShuJia被调用了") if(state.num % 2 !== 0){ state.num = parseInt(state.num)+1 } }, addPerson(state,value){ state.person.push({name:value}) } }, //响应组件中加的动作 actions: { increment(context,value){ //console.log("actions的increment被调用了") context.commit("jia",value) }, decrement(context,value){ //console.log("actions的increment被调用了") context.commit("jian",value) }, increByJiShu(context,value){ //console.log("actions的increByJiShu被调用了") context.commit("jiShuJia",value) }, add(context,value){ context.commit("addPerson",value) } }, getters:{ enlargeTen(state,b,c){ //console.log(state,b,c) //console.log("getters中的enlargeTen被調用了") return state.num * 10 } }, modules: { } })
-
四.执行流程
- 在组件中使用
五.getters的使用
-
-
在
store.js
中追加getters
...... const getters = { bigSum(state){ return state.sum * 10 } } //创建并暴露store export default new Vuex.Store({ ...... getters })
//在指定的组件汇总导入4个map import {mapActions,mapState,mapGetters,mapMutations} from 'vuex'
computed: { //借助mapState生成计算属性:sum、school、subject(对象写法) ...mapState({sum:'sum',school:'school',subject:'subject'}), //借助mapState生成计算属性:sum、school、subject(数组写法) ...mapState(['sum','school','subject']), },
- 用于帮助我们映射
getters
computed: { //借助mapGetters生成计算属性:bigSum(对象写法) ...mapGetters({bigSum:'bigSum'}), //借助mapGetters生成计算属性:bigSum(数组写法) ...mapGetters(['bigSum']) },
- 用于帮助我们生成与
actions
对话的方法,即:包含$store.dispatch(xxx)
methods:{ //靠mapActions生成:incrementOdd、incrementWait(对象形式) ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'}) //靠mapActions生成:incrementOdd、incrementWait(数组形式) ...mapActions(['jiaOdd','jiaWait']) }
- 用于帮助我们生成与
mutations
对话的方法,即:包含$store.commit(xxx)
methods:{ //靠mapActions生成:increment、decrement(对象形式) ...mapMutations({increment:'JIA',decrement:'JIAN'}), //靠mapMutations生成:JIA、JIAN(对象形式) ...mapMutations(['JIA','JIAN']), }
备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。
七.模块化和命名空间
-
-
修改
//注意:一定要开启命名空间 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'}),