Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的全部组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。采用了全局单例模式,将组件的共享状态抽离出来管理,使得组件树中每个位置均可以获取共享的状态或者触发行为。
那么什么是状态呢?我把状态理解为在没有使用vuex时,在当前组件中data内须要共用的数据为状态。
vuex使得状态或行为成为了共享的状态,所共享的状态或行为能够在各个组件中均可以访问到,省去了子父或子子之间传递变量,提升了开发效率。css
当咱们不使用vuex时,对于组件之间传递信息会较为麻烦。vue
App.vue文件中:java
<template> <div id="app"> <Fruits :fruitList="fruitList"/> </div> </template> <script> import Goods from './components/Goods'; export default { name: 'App', components:{ Fruits, Goods }, data(){ return{ goodList:[ { name:'doll', price:12 }, { name:'glass', price:10 } ], } } } </script> <style> </style>
Good.vue文件中:git
<template> <div class="hello"> <ul> <li v-for="(good,index) in goodList" :key="index"> name:{{good.name}} number: {{good.number}} {{index}} </li> </ul> </div> </template> <script> export default { props:['goodList'], } </script> <style> </style>
首先先建立一个js文件做为两兄弟之间传输的纽扣,这里起名为msg.jsgithub
//建立并暴露vue import Vue from 'vue'; export default new Vue
兄弟组件Goods:ajax
<template> <div> <button @click="deliver">点击</button> </div> </template> <script> import MSG from '../msg'; export default { data(){ return{ msg:'hahah' } }, methods:{ deliver() { MSG.$emit('showMsg',this.msg) } } } </script> <style> </style>
兄弟组件Fruits:vuex
<template> <div> <div class="fruit"> {{text}} </div> </div> </template> <script> import MSG from '../msg'; export default { data(){ return{ text:'' } }, created(){ this.getMsg() }, methods:{ getMsg(){ MSG.$on('showMsg',(message)=>{ this.text = message }) } } } </script> <style> </style>
在App组件中的代码:
点击按钮:
上述为兄弟组件之间的传值,是否是感受到有点麻烦呢?初学vue组件传值时,我也以为这种方法很麻烦,vuex很好的解决了这个问题,愉快的编写代码。npm
import Vue from 'vue'; //引入vue import Vuex from 'vuex'; //引入vuex Vue.use(Vuex) //声明使用Vuex const state = { count:1, totalName:'total' } const store = new Vuex.Store({ state }) export default store
<template> <div id="app"> <Fruits> <div>--------------------------</div> <Goods> </div> </template> <script> import Fruits from './components/Fruits'; import Goods from './components/Goods'; export default { name: 'App', components:{ Fruits, Goods } } </script> <style> </style>
<template> <div> <div>我是Goods中的组件</div> <div>咱们共同的数字:{{this.count}}</div> <div>咱们共同的名字是 {{this.totalName}} </div> </div> </template> <script> import {mapState} from 'vuex'; //引入辅助函数 export default { computed:{ ...mapState(['count','totalName']) //对象展开运算符 } } </script> <style> </style>
<template> <div> <div>我是Fruits中的组件</div> <div>咱们共同的数字:{{this.count}}</div> <div>咱们共同的名字是 {{this.totalName}} </div> </div> </template> <script> import {mapState} from 'vuex'; //引入辅助函数 export default { computed:{ ...mapState(['count','totalName']) //对象展开运算符 } } </script> <style> </style>
上述为使用vuex进行简单的引用状态数据值的例子,将数据放到state中进行管理,引入辅助函数和将state中的数据引入组件,在组件中进行调用,这种方法是否是比不使用vuex更容易了点呢?可是这才只是个很是浅很是浅的开始。下面进入正文!!!api
打开终端,输入命令行npm install vuex --save
进行下载vuexapp
下面咱们的介绍将会在Module规范中进行介绍。
对于子模块管理咱们须要建立核心化管理对象store起名为index.js将其余state,getter,mutations,actions。引入到该store模块中,并将其暴露Store对象,下面为代码部分。
下面为store的代码,这里的js咱们取名为index.js,经过将state,mutations,actions,getters引入到store中,并暴露出store对象。
/* vuex最核心的管理对象store */ import Vue from 'vue'; import Vuex from 'vuex'; import state from './state'; import mutations from './mutations'; import actions from './actions'; import getters from './getters'; //声明使用插件 Vue.use(Vuex) //new 一个Vuex的对象,将state,mutation,action,getters配置到vuex的store中,方便管理数据 export default new Vuex.Store({ state, mutations, actions, getters, })
咱们一般将须要进行管理的共享数据,放入state中,使其形似为全局变量,对于须要的组件进行引入该state状态数据。下面为state中的代码举例:
/* 状态对象 */ export default{ userInfo: {}, //用户信息 count:1 }
使用常量来代替mutations事件类型是一件很常见的模式,将这些常量放进一个单独的文件,可使你的代码合做者对于你的代码一目了然,加强了代码的可阅读性。下面上代码,因为只是例子,因此此时只引入了一个方法。
/* 包含n个mutation的type名称常量 */ export const RECEIVE_USER_INFO = 'receive_user_info' //接收用户信息
actions与其mutations相似,但其能够进行异步操做,且将异步操做获取的数据提交给mutations,使得mutations更改state中的状态数据,这里经常用于获取ajax请求中的数据(由于是异步),并将其获取的数据提交给mutations获得state数据状态的更新。这里的发送ajax发送请求的代码,这里就不进行演示了,你们可以了解,此时action中的数据是经过发送ajax请求来获取的就行。此时也能体现出actions中能够进行异步操做。下面上代码:
/* 经过mutation间接更新state的多个方法的对象 */ import { RECEIVE_USER_INFO, //引入在mutation-types定义的常量 } from './mutation-types'; import { reqUserInfo, } from '../api'; //这里引入发送ajax请求的方法 export default{ // 异步获取用户信息 async getUserInfo({commit}){ //引入发送请求数据的方法,异步等待获取数据,并将其数据赋值给result const result = await reqUserInfo() //当获取数据成功时,result.code会为0,失败则为1,这里用于判断是否获取状态数据成功 if (result.code === 0) { const userInfo = result.data //获取请求中的数据 //经过commit将其方法,和请求后获取的用户信息传递给mutation commit(RECEIVE_USER_INFO,{userInfo}) } } }
须要注意的是:在组件中应用下列方式来去调用vuex组件中的方法:
this.$store.dispatch('getUserInfo')
mutations用于更改state中的状态逻辑的,且为同步更改state中的状态数据。须要知道的是在vuex中只能经过mutation来去修改state对象,能够经过获取actions获取到的数据去修改state,也能够在mutations模块中直接定义方法来去更改状态数据。经过mutations和上面的actions模块你们也能够看出commit是用于mutation模块中的。在组件中调用其mutation模块的代码为:
this.$store.commit('increment')
下面上mutation模块中的代码:
/* 直接更新state的多个方法的对象 */ import { RECEIVE_USER_INFO, } from './mutation-types'; export default{ //方法中的第一个默认形参为state,也能够传入额外的参数, 既mutation的载荷(playload) [RECEIVE_USER_INFO](state,{userInfo}){ state.userInfo = userInfo }, //不经过actions直接在mutation模块中更改state状态数据 increment(state){ state.count = 3 } }
Getters至关于computed计算属性,用于加工处理state状态数据,有其两个默认参数,第一个默认参数为state,第二个默认参数为getters。
在组件中调用该方法的代码片断为:
this.$store.getters.totalCount()
下面为Getters中的代码片断:
/* 包含多个基于state的getter计算属性的对象 */ export default{ plusCount(state){ return state.count + 1 }, //获取state中状态数据对象,和获取getters模块中plusCount数据 totalCount(state,getters){ return getters.plusCount + state.count } }
那么对于以上的store咱们就简单介绍完了,相信你们看完后对于vuex会有必定的理解。那么这个时候咱们要想,是否是使用this.$store.state或this.$store.getters.xxx
感到麻烦呢?下面咱们介绍另外一种引入state和getters的方式
对于上述的引用state和getters的方法是否是感到麻烦呢?使用mapState你将会感觉到便利。
//首先咱们须要先将辅助函数引入 import { mapGetters,mapState } from 'vuex' export default { computed: { // 使用对象展开运算符将 getter 混入 computed 对象中 ...mapGetters(['plusCount','totalCount',]) // 使用对象展开运算符将 state 混入 computed 对象中 ...mapState(['userInfo','count']) } }
以上就是对于vuex的详解啦,但愿可以帮助到你们对于vuex的理解,感兴趣的化就点个赞呗!