前言
今天这篇文章的主题是Vuex,相信进来的前端小伙伴都有了解或使用过Vue,这里为什么提vue呢?因为往往在大型项目中都会选择使用VueX来管理响应式数据,那如何正确姿势使用VueX呢?
一、什么是Vuex?
1.1 官方的解释
Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
1.2 个人总结
多个组件共享 同一个数据的状态管理工具,通过state来存储他们的数据,而让mutations提交和修改数据,modules将他们进行模块化管理。
当多个视图组件依赖同一个状态,来自不同视图的行为需要变更同一个状态。如登录、加入购物车。如果说数据通过父子组件通讯 则到数据量大的时候,导致代码变的很繁琐,当兄弟组件需要传递却也无能为力,vuex的出现解决了这一系列问题,但也非必用,往往会根据自己项目的业务的需求来选择。
二、由哪几部分组成
Statevue的状态管理,驱动应用的数据源Mutations同步操作 它是唯一可以直接更改state状态,通过提交commit触发mutation更改stateActions异步操作 它不能直接改变state而是需要触发mutation来更改state,它可以任意包含异步操作Getters计算属性 类似于vue组件中的computed,可以过滤,处理state,结果也会缓存,只有当依赖值发生改变才会从新计算Modules模块 支持模块化 让每个模块都有自己的state,mutation,action,getter,甚至可以嵌套子模块
三、vue中如何使用?
<template>
<div class="use_store">
1.直接通过'$store.state.message'获取仓库中的数据
<span>{{$store.state.message}}</span>
2.巧用'getters'获取仓库中的数据
<span>{{$store.getters.getReturnData}}</span>
</div>
</template>
<script>
export default{
mounted(){
// 发射'setDate'事件到vuex 既是调用xuex中的方法
this.$store.dispatch('setDate','传参')
}
}
</script>
import Vuex from 'vuex'
import Vue from 'vue'
Vue.use(Vuex)
const store = new Vuex.Store({
// 数据状态管理(当前模块仓库中的数据)
state:{
message:'数据管理'
},
// 过滤和简化数据 第二个参数getters可以拿到其他getters的方法返回的数据进行二次过滤
getters:{
getReturnData(state,getters){
return state.message
},
getReturnDatas(state,getters){
return getters.getreturnData + '二次过滤数据'
}
},
// 同步操作 用来管理和修改state中的数据
mutations:{
SET_DATE(state,params){
state.message = params
}
},
/**
* 支持异步操作
* commit 提交方法当前模块至'mutations'
* dispatch 调用当前模块'actions'中的方法处理
* getters 获取当前模块的'getters'
* state 获取当前仓库中的数据
* rootState 获取其他模块的仓库数据 例如:rootState.user.message
* rootGetter 获取其他模块的计算属性 例如:rootGetters['users/getData']
*/
actions:{
setDate({commit,dispatch,getters,state,rootState,rootGetters},params){
commit('SET_DATE',params) // 提交至'mutations'来修改仓库中的数据
}
},
// 模块化管理
modules:{}
})
四、vuex如何模块化
模块化就是将vuex拆分成不同的模块,无论从项目上还是结构上,都容易维护,我们在平时写的vuex中,都是在一个文件中,写 state、getters、mutations、actions 想象一下,如果我们的项目特别大,那么我们vuex中要维护的内容会特别多的时候,例如购物车需要用到vuex,设置需要用到vuex,首页也需要用到vuex,那么如果我们都写到一个文件中,就会出现代码相当的臃肿。这一个 store 文件最后好几万行代码。还怎么维护?
<template>
<div class="use_store">
1.获取 users 模块仓库中的数据
<span>{{$store.state.users.message}}</span>
2.巧用'getters'获取模块化仓库中的数据
<span>{{$store.getters['users/getModuleData']}}</span>
</div>
</template>
<script>
export default{
mounted(){
// 发射'setDate'事件到users模块 既是调用xuex中的方法
this.$store.dispatch('users/setDate','传参')
}
}
</script>
import Vue from 'vue
import Vuex from 'vuex
Vue.use(Vuex)
export default new Vuex.Store({
modules:{
users
}
}
const state = {
message:'我是user模块'
}
const getters = {
getModuleData(state,getters){
return state.message
}
}
const mutations = {
SET_DATE(state,params){
state.message = params
}
}
const actions = {
setDate({commit,dispatch,getters,state,rootState,rootGetters},params){
commit('SET_DATE',params) // 提交至'mutations'来修改仓库中的数据
}
}
export default{
namespaced:true,
state,
mutations,
actions,
getters,
}
五、使用map辅助函数操作Vuex
mapState、mapGetters、mapmutations、mapactions辅助函数必须是数组或者对象
<template>
<div class="use_store">
1.直接通过mapState获取仓库中的数据
<span>{{message()}}}</span>
2.巧用'getters'获取仓库中的数据
<span>{{getReturnData}}</span>
</div>
</template>
<script>
// 导入方法 import {mapState,mapGetters,mapMutations,mapActions} from 'vuex
export default{
mounted(){
// 发射'setDate'事件到vuex 既是调用xuex中的方法
},
methods:{
// 获取的是一个方法
...mapState({
// 主仓库中的数据
message:state => state.message
// 获取模块中的数据
message:state => state.users.message
}),
// 主仓库中的数据
...mapGetters(['getReturnDatas'])
// 获取模块中的数据(注意:其他辅助都可以使用数组和对象两个方式进行映射)
...mapGetters('users',['getReturnData'])
...mapGetters('users',{
getMethod:'getReturnData'
})
// 主仓库中的数据
...mapActions(['setDate'])
// 获取模块中的数据
...mapActions(''users,['setDate'])
// 主仓库中的数据
...mapMutations(['SET_DATE'])
// 获取模块中的数据
...mapMutations(''users,['SET_DATE'])
getUser(){
//使用辅助函数
this.message()
this.getReturnDatas()
this.setDate('我是参数')
this.SET_DATE('我是参数')
}
}
}
</script>
import Vue from 'vue
import Vuex from 'vuex
Vue.use(Vuex)
export default new Vuex.Store({
state:{
message:'主仓库'
},
getters:{
getReturnDatas(state,getters){
return state.message
},
},
mutations:{
SET_DATE(state,params){
state.message = params
}
},
actions:{
setDate({commit},params){
commit('GET_DATE',params)
}
}
modules:{
// uers模块
users:{
state:{
message:'子模块'
},
getters:{
getReturnData(state,getters){
return state.message
},
mutations:{
SET_DATE(state,params){
state.message = params
}
},
actions:{
setDate({commit},params){
commit('GET_DATE',params)
}
}
}
}
})