vuex的五大辅助函数使用技巧
vuex时vue的一个全局状态管理文件,又称全局数据共享,在这里定义的数据,我们在任何文件中都可以访问的到,为我们的项目带来极大的好处,以下是我定义在全局状态文件数据,所有示例均已这个为基础访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import Vue from 'vue' import Vuex from 'vuex' import axios from 'axios'
Vue.use(Vuex)
export default new Vuex.Store({ state: { data:{ numbervalue:5, action_data:'' } }, getters:{ dbclick(state){ console.log(state,"state") return state.data.numbervalue*2 }, }, mutations: { montify(state,payload){ state.data.numbervalue=payload.val console.log("载荷",payload) }, action(state,payload){ console.log("打印",state) state.data.action_data=payload } },
actions: { prodect({commit},payload){ console.log("payload",payload) let url ='http://httpbin.org/get' return new Promise((resolve,reject)=>{ axios.get(url).then((res)=>{ resolve(res.data) console.log(res) commit('action',res.data) }).catch((err)=>{ console.log("报错") reject(err) }) }) } }, modules: { } })
|
1
| import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
|
1.mapState
mapState
函数返回的是一个对象。通常,我们需要使用一个工具函数将多个对象合并为一个,以使我们可以将最终对象传给 computed
属性。自从有了对象展开运算符,我们可以极大地简化写法:
1 2 3 4
| computed: { ...mapState(['data']), },
|
这样一来,我们便可以轻松的访问state中的数据 :例如我们可以这样
1 2 3
| <div> <h2>{{data.numbervalue}}</h2> </div>
|
但在以前我们通常是这样访问的
1 2 3
| <div> <h2>{{$store.state.data.numbervalue}}</h2> </div>
|
一个两个还好,看不出什么问题,但如果属性或者数据过多时,我们还要一边一边的写重复的代码,降低工作效率,但辅助函数的出现,大大的节约了我们的开发效率
2.mapGetters
mapGetters
辅助函数仅仅是将 store 中的 getter 映射到局部计算属性,因此你可以这样来使用他
1 2 3
| computed: { ...mapGetters(['dbclick']) },
|
是不是很简单,我们再来看看以往的写法,它需要我们自己手动添加计算属性
1 2 3 4 5
| computed: { donedbclick () { return this.$store.getters.dbclick } }
|
1 2 3
| <h2> {{dbclick}} 或者 {{donedbclick}} </h2>
|
3.mapMutations
使用 mapMutations
辅助函数将组件中的 methods 映射为 store.commit
,其原理就是将this.montify 映射为this.$store.commit(‘montify’)
1 2 3
| methods: { ...mapMutations(['montify']), },
|
也可以这样写
1 2 3 4 5
| methods:{ example(){ this.$store.commit('montify',payload) } }
|
1 2 3 4 5 6 7
| <h2 @click="montify(payload)"> 点击触发 </h2> 或者 <h2 @click="example"> 点击触发 </h2>
|
4.mapActions
在组件中使用 this.$store.dispatch('prodect')
分发 action,或者使用 mapActions
辅助函数将组件的 methods 映射为 store.dispatch
调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| methods: { ...mapActions(['prodect']), request(){ this.prodect({name:'张三'}).then((result) => { console.log("result",result) }).catch((err) => { }) } request2(){ this.$store.dispatch('prodect',{name:'张三'}).then((res)=>{ console.log("res",res) }) } },
|
1 2 3 4 5 6 7 8 9 10 11
| <h2 @click="prodect(payload)"> 发送请求 </h2> 或者 <h2 @click="request"> 发送请求 </h2> 又或者 <h2 @click="request2"> 发送请求 </h2>
|