一、Vuex详解
Vuex采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
二、配置
1、新建store文件-->index.js,进行如下配置,在main.js中进行引入
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
//数据,相当于data
state:{},
getters:{},
//里面定义方法,操作state
mutations:{},
//操作异步操作mutation
actions:{},
modules:{}
})
2、main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
三、核心概念
vuex中一共有五种状态,state、Getter、Mutation、Action、Module
1、State
提供唯一的公共数据源,所有共享的数据统一放到store的state进行储存,类似于data
在vuex中state定义数据,可以在任何组件中进行调用
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
//数据,类似于data
state:{
name:'张三',
age:12,
count:0
}
})
调用:
方法一:
在标签中直接使用
<p>{{$store.state.name}}</p>
<p>{{$store.state.age}}</p>
方法二:
this.$store.state.name
方法三:
从vuex中按需导入mapstate函数
import {mapState} from 'vuex'
computed:{
...mapState(["name","age","sex"])
}
//直接使用
<p>$store.state.name</p>
<p>$store.state.age</p>
//辅助函数
<p>{{ name + age + sex }}</p>
2、Mutation
更改vuex的store中的状态的唯一方法是提交mutation。vuex中的mutation非常类似于事件:每个mutation都有一个字符串的事件类型(type)和一个回调函数(handler)。这个回调函数就是我们实际进行状态更改的地方,并且他会接受state作为第一个参数。
在vuex中定义:
其中参数state参数是必须的,也可以自己传递一个参数,如下代码,进行计数器的加减操作,加法操作时可以根据所传递参数大小进行相加,减法操作没有传参每次减一
state:{
name:'张三',
age:12,
count:0
},
getters:{},
//里面定义方法,操作state方法
mutations:{
addcount(state,num) {
state.count = state.count + num
},
reduce(state) {
state.count --
}
}
在组件中使用:
<button @click="btn">点我增加store仓库中的数据</button>
<button @click="btn1">点我减少store仓库中的数据</button>
方法一:
使用commit触发Mutation操作
methods:{
btn() {
this.$store.commit("addcount",10)
},
btn1() {
this.$store.commit("reduce")
}
}
方法二:
使用辅助函数进行操作
methods:{
...mapMutations(["addcount","reduce"]),
btn(){
this.addcount(10)
},
btn1(){
this.reduce()
}
}
3、Action ---- 进行异步操作
ActionyuMutation相似,一般不用Mutation异步操作,使用Action原因:方便管理维护
在vuex中定义:
actions:{
asyncAdd(context){
//异步
setTimeout(()=>{
context.commit('reduce')
},1000)
}
}
在组件中使用
方法一:直接使用dispatch触发Action函数
this.$store.dispatch('asyncAdd')
方法二:使用辅助函数
...mapActions(["asyncAdd"]),
btn2(){
this.asyncAdd()
}
4、Getter
类似于vue的computed进行缓存,对于Store中的数据进行加工处理形成新的数据
5、Modules
当遇见大型项目时,数据量大,store会显得很臃肿
为了解决以上问题,Vuex允许我们将store分割成模块(module)。每个模块拥有自己的state、mutation、action、getter,甚至是嵌套子模块--从上至下进行同样方式的分割:
modules:{
cityModules:{
namespaced:true,
state:{
cityname:'中国',
},
mutations:{
cityfunction(state) {
state.cityname = '日本'
}
}
},
userinfo:{
state:{
username:'一一'
}
}
}
this.$store.state.cityModules.cityname
默认情况下,模块内部的action和mutation仍然是注册在全局命名空间的--这样使得多个模块能够对同一个action和mutation作出响应。