Vuex 简介
Vuex 是专为 Vue.js 应用设计的状态管理模式,它可以帮助开发者在组件之间更方便地共享数据。Vuex 使用集中化的方式来管理应用的状态,将应用中所有共享的状态存储在一个 store 中。这样可以避免组件之间因为数据共享而产生的复杂交互,提升代码的可维护性和可扩展性。
Vuex 的核心思想是将应用状态集中存储在一个地方,并且只有通过特定的方式(mutations)才能修改这些状态,从而保证数据的可预测性和一致性。
Vuex 的核心概念
Vuex 有几个核心概念:state
、mutations
、actions
和 getters
,每个概念在数据流中起到不同的作用。
1. State
state 是 Vuex 中用来存储共享数据的地方。所有的共享数据都定义在 state
中,state
中的数据是响应式的,任何组件中使用到 state
的地方都会根据数据的变化而更新。
我们可以在 Vuex 的 store
中定义一个 state
对象:
javascript
new Vuex.Store({
state: {
name:"未登录游客"
}
});
上面的例子中,name是一个共享数据。任何使用这个 store
的组件都可以访问name,并且当name 的值变化时,所有引用它的组件会自动更新。
2. Mutations
mutations
是 Vuex 中用于修改 state
的唯一途径。我们只能通过 mutations
来改变 state
中的数据,不能在其他地方直接修改 state
。这样做的目的是保证状态的可预测性,使得每次状态的改变都是明确和可追踪的。
每个 mutation
函数会接收两个参数:当前的 state
和传递的参数 payload
。例如,下面是一个修改 name
值的 mutation
:
javascript
const store = new Vuex.Store({
state: {
name:"未登录游客"
},
mutations: {
setName(state, newName) {
state.name = newName;
}
}
});
在组件中,我们可以通过 store.commit('setName', "xwz")
来调用这个 mutation
,从而实现对 state.count
的增加操作。
javascript
export default {
name: 'App',
components: {
HelloWorld
},
methods: {
handleUpdate() {
// mutations中定义的函数不能直接调用,必须通过这种方式来调用
// setName为mutations中定义的函数名称,lisi为传递的参数
this.$store.commit('setName', 'lisi')
}
}
}
这边我定义了一个 Vue 组件,其中包含一个 handleUpdate
方法。该方法通过 this.$store.commit
调用 Vuex 中的 mutations
,其中 setName
是 mutations
中定义的函数名称,xwz 是传递的参数。
3. Actions
actions
是专门用于处理异步操作的。actions
中的函数不能直接修改 state
,而是需要调用 mutations
来实现对 state
的修改。这样做是为了将异步操作和同步操作分开,使得数据流更加清晰。
javascript
actions: {
setNameByAxios(context) {
axios({
url: '/api/admin/employee/login',
method: 'post',
data: {
username: 'admin',
password: '123456'
}
})
.then(res => {
if (res.data.code == 1) {
// 异步请求后,需要修改共享数据
// 在actions中调用mutation中定义的setName函数
context.commit('setName', res.data.data.name)
}
})
}
}
组件中调用 setNameByAxios
在 Vue 组件中,我们可以使用 this.$store.dispatch('setNameByAxios')
来调用这个 action
。
javascript
computed: {
name() {
return this.$store.state.name
}
},
methods: {
updateName() {
// 通过 dispatch 调用 action 中的 setNameByAxios
this.$store.dispatch('setNameByAxios')
}
}
4.Vuex 的数据流
Vuex 的数据流是单向的,而且非常清晰:
- 组件通过
dispatch
发起action
。 action
可以进行异步操作,然后通过commit
调用mutation
。mutation
会同步地修改state
。state
的变化会更新所有引用到该状态的组件。
5.使用 Vuex 的步骤
- 在
store
对象的state
属性中定义共享数据。state
是 Vuex 的数据存储,存放的是全局的共享状态。 - 在
store
对象的mutations
属性中定义修改共享数据的函数。每个mutation
都是一个同步函数,用来改变state
中的数据。 - 在
store
对象的actions
属性中定义调用mutation
的函数。actions
主要用于异步操作,比如获取数据、处理耗时操作。 mutations
中的函数不能直接调用,只能通过store.commit
方法调用。这是因为 Vuex 希望所有的状态变更都可以被追踪,使用commit
可以更好地控制和记录数据变化。actions
中定义的函数也不能直接调用,只能通过store.dispatch
方法来调用。这样做的好处是可以更好地处理异步逻辑,将dispatch
作为调用入口。