您的位置:

使用Vuex和Vue.mapState进行数据管理

一、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开发者的标志之一。