Vuex 是一个专为 Vue.js 应用程序开发的状态管理库,用于保存用用程序的状态,即信息或数据,使得Vuex使应用程序的所有组件可以共享数据。每一个 Vuex 应用的核心就是 store(仓库),包含着你的应用中大部分的状态 ( state ),改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。
1、Vuex主要有以下几个模块
- state:定义了应用程序的数据,可以设置默认的初始状态。
- getters:允许组件从 store 中获取数据 。
- mutations:是唯一更改 store 中状态的方法,且必须是同步函数。但不可以直接调用mutation,必须使用commit函数来告诉Vuex更新存储并提交更改。
- actions:执行异步操作来存取状态,但也不可以直接调用action,必须使用dispatch函数来执行。
代码演示:
<script> const store = new Vuex.Store({ //定义状态,并赋予初始值 state:{ msg:'Vuex的使用', count:0 }, //使用getter来返回状态 getters:{ msg(state){ return state.msg; }, count(state){ return state.count; } }, //可以理解为其他语言中的setter,改变状态的值,此处为把传进来的参数step累加到count中 mutations:{ increment(state,step){ state.count += step; } }, //模拟服务器延迟1秒 //通过commit调用来触发mutations对象中的increment方法,并把参数step传递给increment actions:{ increment(context,step){ setTimeout(function(){ context.commit('increment',step); },1000); } }, }); //创建Vue实例 let vm = new Vue({ el:'#app', computed:{ //可以直接通过计算属性直接获取store.state中的状态 msg(){ return store.state.msg; } //通过计算属性来返回getters中的count counter(){ return store.getters.count; } }, methods:{ increment(){ //调用dispatch方法来派发actions中的increment方法,并把参数2传递给increment store.dispatch('increment',2); } } }); </script>
2、Vuex助手
Vuex为我们提供了一些辅助工具,如mapStates,mapGetters,mapMutations,mapActions,从而来减少繁杂的工作量。
对于使用mapStates,mapGetters,可以把所有的state,getter添加到计算属性中,而不用向上面代码那样逐个添加。
在使用这些助手时,必须引入。拿mapGetters举例,其他类似。
import {mapGetters} from 'vuex';
代码演示:
computed:{ ...mapState{[ 'state1', 'state2', ]}, ...mapGetters{[ 'count1', 'count2', ]} }
对于mapMutations,mapActions,可以在methods属性中使用,把多个mutation和action映射到应用程序。
代码演示:
methods:{ ...mapMutations([ //mut1将this.mut1()映射到this.$store.commit('mut1'),mut2类似 //这样就不同创建每个方法,派发每个action 'mut1', 'mut2' ]) }
代码演示:
methods:{ ...mapActions([ //act1将this.act1()映射到this.$store.dispatch('act1'),act2类似 'act1', 'act2' ]) }
3、Vuex模块
当应用程序很大时,需要划分模块,Vuex.Store实例中将增加mudules对象。
把state,getter,mutation,action对象创建在一个单独的xxx.js文件中,xxx.js在modules目录下。
代码演示:
const state = { state1:{} }; const getters = { get1:state => state.state1 }; const actions = { initState:{} }; const mutations = { setState:{} }; //导出以上四个对象 export default{ state, getters, mutations, actions }
使用模块,在yyy.js文件中引入模块,yyy.js在store目录下。
代码演示:
import Vue from 'vue'; impoet Vuex from 'vuex'; import xxx from './modules/xxx'; Vue.use(Vuex); export const store = new Vuex.Store({ modules:{ //对应上面引入的xxx xxx } });
另外,由于Vuex中所有内容共享相同的全局名称空间,当在两个不同文件中分别命名相同的state或getter或mutation或action,就会发生冲突,报错duplicate getter key。
可以在Vuex.store文件顶部设置namespaced:true,用于分解每个名称空间的模块。
热门文章
- 被打过疫苗的宠物抓伤人需要打针吗(被打过疫苗的宠物抓伤人需要打针吗多少钱)
- 动物疫苗公司10强名单公布时间(动物疫苗公司10强名单公布时间查询)
- VPN加速器 | 2月25日21.7M/S|免费VPN/V2ray/SSR/Clash/Shadowrocket免费节点订阅分享
- VPN加速器 | 3月10日22.8M/S|免费VPN/SSR/V2ray/Shadowrocket/Clash免费节点订阅分享
- 动物防疫站电话咨询电话从哪里查(动物防疫站地址)
- VPN加速器 | 3月1日20M/S|免费VPN/Clash/SSR/Shadowrocket/V2ray免费节点订阅分享
- 2022Vue.js 面试题汇总及答案
- 女人养猫有什么坏处(女人养猫有什么坏处和好处)
- @RequestBody接收json对象报415的解决办法
- JSON.parse 和 JSON.stringify 详解_在线工具