Vuex学习笔记
什么是Vuex?

专门为Vue开发的状态管理模式。采用集中存储管理应用的所有组件状态。在没有用Vuex的时候,我们在进行组件化开发时,数据(也就是状态一般都分散在各个组件中。加入我们要使用这些状态是,我们就得在不同组件中去取状态值,然后进行状态修改,最后还要相互读取对方状态值。 父子组件中: 我们可以通过事件触发/props进行状态传递。 子组件之间: 由于Vue本身组件之间有作用域,他们之间无法相互通信。这里就必须用单一时间管理(event bus)或者在所有组件和Vue对象下使用一个统一的Object作为数据,来实现。(实质:引用)。
如果项目较小还好,中大型项目,组件通信复杂频繁的时候,这两种方式管理起来就会十分麻烦,而且容易出错。
有了Vuex,它将数据单独放在一个store里,并提供给外部操作内部数据的方法。让我们能更好的管理项目里的状态。这也是Vuex出现的意义吧。就像官网说的: Flux 架构就像眼镜:您自会知道什么时候需要它
正文
基本就是按官网的教程撸了一遍。记录一下自己觉得重要的内容。
Vuex 应用的核心就是 store(仓库)。"store" 基本上就是一个容器,它包含着你的应用中大部分的状态(state)。当然,在使用Vuex的同时,各个组件仍保有局部的状态: 使用Vuex,并不意味着你需要将所有的状态放入Vuex。 下面我们来按搭建一个小例子:
源码:https://github.com/laclys/vuex-demo
在Vue脚手架里面,在main.js中:
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
}
new Vue({
el: '#app',
store,
render: h => h(App)
})
这里我们就创建了一个最简单的store,并且挂载在了Vue实例上。配置其实和vue-router挺像的。 State:就是单一状态树,将我们需要管理的状态在这里定义。 Mutations:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。 要想在组件中使用。由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态。
computed: {
count() {
return this.$store.state.count;
}
通过要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法。 在组件中:
methods: {
increment() {
this.$store.commit('increment');
}
}
Getters:这个在上面的例子没有涉及到。我们可以认为Getters是Vuex在store中的计算属性。(Getters 接受 state 作为其第一个参数)
const store = new Vuex.Store({
state: {
todos: [
{ id: 1, text: '...', done: true },
{ id: 2, text: '...', done: false }
]
},
getters: {
doneTodos: state => {
return state.todos.filter(todo => todo.done)
}
}
})
组件中调用:
computed: {
doneTodos () {
return this.$store.getters.doneTodos
}
}
Actions: 类似于 mutation,不同在于: 1)Action 提交的是 mutation,而不是直接变更状态。 2)Action 可以包含任意异步操作。
Mutations中对状态的操作只能是同步操作,不能是异步操作。
actions: {
incrementAsync ({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
}
在组件中:
methods: {
incrementAsync() {
this.$store.dispatch('incrementAsync');
}
}
说到异步,当然是支持promise以及 async / await 这个 JavaScript 即将到来的新特性: 这里说一下promise: store.dispatch 可以处理被触发的action的回调函数返回的Promise,并且store.dispatch仍旧返回Promise
decrementAsync({commit}) {
return new Promise((resolve, reject) => {
setTimeout(() => {
commit('decrement');
resolve();
},1000)
})
}
组件中 我们就可以用链式then了:
decrementAsync() {
this.$store.dispatch('decrementAsync').then(() => {
// 执行完decrementAsync,之后执行:
console.log('decrementAsync执行完了');
});
}
之后还有一个核心概念叫做Modules,顾名思义模块化。当项目非常的庞大,那么状态可能本身还需要进行分模块分类管理,这个时候就需要用到模块了。这里就不再赘言了。
以上