一、Vuex与Vue.mapState介绍
在大型Vue.js应用程序中,使用组件进行状态管理是相当棘手的。在每个组件中都会有一些数据需要共享以及可预测的修改规则。为了解决这个问题,Vue.js提供了Vuex状态管理库。Vuex 将状态和操作分开管理,状态更新是通过提交“mutations”的方式,而不是直接修改。Vue.js 还提供了一个辅助函数 Vue.mapState,它是一个可以用来将 store 中的 state 映射到局部计算属性中的实用程序函数。
下面我们来看一个简单的使用示例,这里假设我们有一个store,保存着当前的用户名:
const store = new Vuex.Store({
state: {
username: 'Alice'
}
})
现在我们想在 Vue 组件中使用该状态,在组件计算属性中使用 Vue.mapState:
import { mapState } from 'vuex'
export default {
computed: {
...mapState({
username: state => state.username
})
}
}
现在组件的计算属性具有了状态的副本:
console.log(this.username) // -> "Alice"
二、使用Vue.mapState获取多个状态
在Vue.mapState中我们可以获取并映射多个状态,示例如下:
computed: {
...mapState({
doubleCount: state => state.count * 2,
username: state => state.username
})
}
这里使用了一个计算属性doubleCount映射state中count的两倍,还将username状态映射为组件中的用户名变量。
三、使用Vue.mapState获取嵌套状态
如果你的状态比较复杂,可能会包含嵌套对象,例如这样:
const store = new Vuex.Store({
state: {
user: {
name: 'Alice',
age: 27
}
}
})
此时我们就需要使用Vue.mapState的更高级用法:传递一个数组,其中第一个元素是需要映射到组件计算属性的值的键
computed: {
...mapState([
'username',
'user' // 映射 this.user 为 store.state.user
])
}
现在,组件的计算属性具有以下副本:
console.log(this.user) // -> { name: 'Alice', age: 27 }
console.log(this.username) // -> 'Alice'
四、使用Vue.mapState与Vuex的辅助函数
除了Vue.mapState以外,Vuex还提供了一些辅助函数来简化代码。例如:全局辅助函数mapState、mapGetters、mapActions和mapMutations。
下面我们来使用全局辅助函数mapState获取state中的count:
import { mapState } from 'vuex'
export default {
computed: {
...mapState([
'count'
])
}
}
这段代码等同于:
computed: {
count () {
return this.$store.state.count
}
}
这样,我们就可以不需要使用Vuex的store实例,而直接在组件中获取state中的count。
五、总结
Vuex 状态管理和 Vue.mapState 都是 Vue.js 相当重要的部分。在Vue.js开发中,我们都会涉及到组件状态管理。这时我们可以使用Vuex进行全局状态管理,在组件中使用Vue.mapState获取这些状态。使用辅助函数也是很方便的,通过这些函数能够帮助我们简化代码,提高开发效率。在Vue.js中同时使用Vuex和Vue.mapState是成为一名优秀的Vue开发者的标志之一。