日常更文~~
vuex概念
实现多组件状态管理,多个组件之间需要数据共享。
Vuex 和单纯的全局对象有以下两点不同:
- Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
- 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。
vuex的五大核心
State:负责状态管理,类似于vue中的data,用于初始化数据;Mutations:用于修改state中的数据,通过commit触发;Action:可用来处理异步,用过dispatch触发,不能直接修改state;需要先在组件中通过dispatch触发action,然后再action函数内部commit触发mutation,通过mutation修改state状态值;Getters:vuex中的计算属性,相当于vue中的computed,依赖于state的状态值,状态值一旦改变,getter就会重新计算,也就是说,当一个数据依赖于另一个数据发生变化的时候,就要使用getter;Modules:模块化管理,把store分割成不同的模块
Mutations
mutations方法都有默认的形参:([state],[payload] )
state:当前Vuex对象中的state;payload:该方法被调用时候传递参数使用的。
修改state中的数据
例子:修改state中的数据
import Vue from 'vue';
import Vuex from 'vuex'
Vue.use(Vuex);
const store = new Vuex.store({
state:{
name:'weirui'
},
mutations:{
edit(state){
state.name = 'wei';
}
}
})
export default = store;
在组件中我们调用this.$store.commit('edit');就可以修改name的值。
在有些时候我们需要携带参数给mutations方法使用:
单个参数:
this.$store.commit('edit','wei');
多个参数:
this.$store.commit('edit',{name:'wei',sex:'女'});
// 方式二
this.$store.commit({
type:'edit',
payload:{
name:'wei',
sex:'女'
}
})
在mutations中接收参数的时候:
edit(state,payload) {
console.log(payload); // 'wei'或者{name:'wei',sex:'女'}
}
增删state中的成员
- Vue.set 为某个对象设置成员的值,若不存在则新增
例如对state对象中添加一个age成员:
Vue.set(state,"age",24);
- Vue.delete 删除成员
删除刚刚添加的age成员
Vue.delete(state,'age');
Actions
由于直接在mutation方法中进行异步操作,将会引起数据失效。所以提供了Actions来专门进行异步操作,最终提交mutation方法。
Actions中的方法有两个默认参数
context: 上下文(相当于箭头函数中的this)对象payload: 挂载参数
例如:我们在两秒中后执行刚刚的edit方法
由于setTimeout属于异步操作,我们需要使用actions来操作:
actions:{
aEdit(context,payload){
setTimeout(()=>{
context.commit('edit',payload)
},2000)
}
}
在组件中使用:this.$store.dispatch('aEdit',{age:24});
因为是异步操作,我们可以封装一个promise对象:
aEdit(context,payload){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
context.commit('edit',payload)
resolve()
},2000)
})
}
Getters
对state中的成员加工后传递给外界,同样也有两个默认参数:
state:当前vuex对象中的状态对象; getters:当前getters对象,用于将getters下的其他getter拿来用;
getters:{
nameInfo(state){
return "姓名:" + state.name;
},
fullInfo(state,getters){
return getters.nameInfo + '年龄:' + state.age;
}
}
外部组件中使用:this.$store.getters.fullInfo;
modules
当项目庞大,状态非常多时,可以采用模块化管理模式。Vuex 允许我们将 store 分割成模块(module) 。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。
modules:{
a:{
state:{},
getters:{},
....
}
}
组件内调用模块a的状态:
this.$store.state.a;