Vue.js是一个极富竞争力的JavaScript库,因为它提供了一种灵活且易于使用的方式来创建用户界面并与后端API进行交互。然而,它并没有提供一个内建的、结构化的方法来管理应用程序的状态(也就是数据)。
这里就需要一个库 —— Vuex。Vuex是一个专为Vue.js设计的状态管理库,提供了一种集中存储、管理和协调状态变化的方式。它将应用程序的状态从视图中抽离出来,使我们能够更好地组织代码,更快地进行调试和编写测试。
一、Vuex基础
在介绍Vuex API之前,我们先来了解一下Vuex最重要的三个概念:state、mutations和actions。
1.1 state
state是Vuex存储应用程序级别状态的地方。我们可以在组件中使用$store.state来访问它。
const store = new Vuex.Store({
state: {
count: 0
}
})
这里我们定义了一个状态count并初始化为0。我们可以通过store.state.count来获取它。
1.2 mutations
mutations是一个修改器函数,用来改变state的值。每个mutation都有一个字符串的类型(type)和一个处理函数(handler)。我们可以通过store.commit方法来调用mutation。
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++
},
decrement(state) {
state.count--
}
}
})
// 在组件中调用
methods: {
increment() {
this.$store.commit('increment')
},
decrement() {
this.$store.commit('decrement')
},
}
在mutations中,我们定义了两个方法increment和decrement来分别增加和减少count的值。在组件中,我们通过this.$store.commit('increment')和this.$store.commit('decrement')来调用它们。
1.3 actions
actions是异步方法,用来提交mutations。类似于mutations,每个action都有一个类型(type)和一个处理函数(handler)。我们可以通过store.dispatch方法来调用action。
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++
},
decrement(state) {
state.count--
}
},
actions: {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
}
})
// 在组件中调用
methods: {
incrementAsync() {
this.$store.dispatch('incrementAsync')
},
}
在actions中,我们定义了一个incrementAsync方法用来异步增加count的值。在组件中,我们通过this.$store.dispatch('incrementAsync')来调用它。
二、Vuex进阶
2.1 getters
getters允许我们在对state进行操作之前,先对数据进行预处理。
const store = new Vuex.Store({
state: {
todos: [
{ id: 1, text: 'todo1', done: true },
{ id: 2, text: 'todo2', done: false },
{ id: 3, text: 'todo3', done: true },
]
},
getters: {
doneTodos: state => {
return state.todos.filter(todo => todo.done)
},
doneTodosCount: (state, getters) => {
return getters.doneTodos.length
}
}
})
// 在组件中调用
computed: {
doneTodos() {
return this.$store.getters.doneTodos
},
doneTodosCount() {
return this.$store.getters.doneTodosCount
}
}
在getters中,我们定义了一个doneTodos getter来返回已完成的todos,还定义了一个doneTodosCount来返回已完成的todos的数量。
2.2 modules
当我们应用程序的状态变得非常大且复杂时,将所有state、mutations和actions都放在一个文件中就会变得非常不可维护。这时,Vuex modules提供了一种方式来将应用程序的状态分割为更小、更可维护的单元。
// 创建一个counter module
const counter = {
state: {
count: 0
},
mutations: {
increment(state) {
state.count++
},
decrement(state) {
state.count--
}
},
actions: {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
}
}
// 创建一个store,并将counter module 注册到 store中
const store = new Vuex.Store({
modules: {
counter
}
})
// 在组件中调用
methods: {
increment() {
this.$store.commit('counter/increment')
},
decrement() {
this.$store.commit('counter/decrement')
},
incrementAsync() {
this.$store.dispatch('counter/incrementAsync')
},
}
在这个例子中,我们创建了一个counter module,并将它注册到store中。在组件中,我们通过this.$store.commit('counter/increment')和this.$store.dispatch('counter/incrementAsync')来调用它。
三、结束
这就是Vuex的基础和进阶。使用Vuex,我们可以更好地管理我们的应用程序状态,并且更容易进行维护和测试。要了解更多关于Vuex的内容,请查看官方文档。