Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它集中式存储组件的共享状态,以一个全局的单例模式进行管理,并以相应的规则保证状态以一种可预测的方式发生变化。
Vuex 的核心是 store
(仓库),它相当于一个容器,包含着应用中的大部分状态(state)。Vuex 的存储状态是响应式的,若 store
中的状态发生改变,那么组件中也会得到相应的更新。我们不能直接改变 store
中存储的状态,需要显示地提交(commit)mutation。
引入 Vuex
在 src
目录下创建 store/index.js
文件,并引入 Vuex。
import Vuex from 'vuex'
Vue.use(Vuex)
创建 Vuex.Store 对象
在 store/index.js
文件中创建 Vuex.Store
对象,如下。
export default new Vuex.Store({
state: {
message: "Hello"
},
getters: {
getMessage: state => {
return state.message;
}
},
mutations: {
setMessage(state, str) {
state.message = str;
},
},
actions: {
setMessageAction({commit}, str) {
setTimeout(function () {
commit('setMessage', str);
}, 5000);
}
},
modules: {}
})
最后在 main.js
文件中引入 store/index.js
及 store
对象。
import store from './store'
new Vue({
store,
render: h => h(App)
}).$mount('#app')
访问及变更
基本操作
在组件中可使用以下语句直接访问 Vuex 存储的状态。
this.$store.state.message
另外组件的方法还可以提交一个变更。
methods: {
setStoreMessage() {
this.$store.commit('setMessage', "This is a new message");
}
}
通过提交 mutation 的方式可以更明确地追踪到状态的变化,因此不建议直接更改。
核心操作
Getter
Vuex 允许我们在 store 中定义“getter”,它就像计算属性一样,getter 的返回值会被缓存起来,且只有当相应的属性值发生了改变才会重新计算。
Getter 会暴露为 store.getters
对象,然后在组件中以属性的形式访问这些值。
computed: {
getStoreMessage() {
return this.$store.getters.getMessage;
}
}
Mutation
更改 Vuex 的 store
中存储的状态的唯一方法是提交 mutation。每个 mutation 都有一个字符串形式的事件类型(type)和一个回调函数(handler)。回调函数接受 state
作为第一个参数。
mutations: {
setMessage(state, str) {
state.message = str;
},
}
需要以相应的 type 调用 store.commit
方法:
this.$store.commit('setMessage', "This is a new message");
Mutation 中定义的函数必须是同步函数。为了处理异步操作,可以定义 action。
Action
Action 类似于 mutation,但是 action 提交的是 mutation,而不是直接变更状态,且 action 可以包含任意异步操作。
Action 通过 store.dispatch
方法触发:
methods: {
setStoreMessage() {
this.$store.dispatch('setMessageAction', "This is a new message");
}
}
Module
Vuex 允许将 store 分割成模块(module),每个模块拥有自己的 state、mutation、action 以及getter,甚至还可以嵌套子模块。