Vuex State
  • 概述

    State 用于存储全局的变量,类似于组件中的 data 属性,不过 State 是可以全局进行访问的。

  • 使用

    • 基础使用

      // 创建一个 Counter 组件
      const Counter = {
        template: `<div>{{ count }}</div>`,
        computed: {
          count () {
            return this.$store.state.count
          }
        }
      }
      
    • mapState 辅助函数

      当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:

      // 在单独构建的版本中辅助函数为 Vuex.mapState
      import { mapState } from 'vuex'
      
      export default {
        // ...
        computed: mapState({
          // 箭头函数可使代码更简练
          count: state => state.count,
      
          // 传字符串参数 'count' 等同于 `state => state.count`
          countAlias: 'count',
      
          // 为了能够使用 `this` 获取局部状态,必须使用常规函数
          countPlusLocalState (state) {
            return state.count + this.localCount
          }
        })
      }
      

      当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。

      computed: mapState([
        // 映射 this.count 为 store.state.count
        'count'
      ])
      
      对象展开运算符

      mapState 函数返回的是一个对象。我们如何将它与局部计算属性混合使用呢?通常,我们需要使用一个工具函数将多个对象合并为一个,以使我们可以将最终对象传给 computed 属性。但是自从有了对象展开运算符,我们可以极大地简化写法:

      computed: {
        localComputed () { /* ... */ },
        // 使用对象展开运算符将此对象混入到外部对象中
        ...mapState({
          // ...
        })
      }
      
      常用方式
      computed: {
        localComputed () { /* ... */ },
        // 使用对象展开运算符将此对象混入到外部对象中
        ...mapState([
          'count' // 将state中变量映射到本地的同名变量中(传入的参数为数组)
        ])...mapState({
          mycount: 'count' //将state中变量映射到本地并起别名(传入的参数为对象)
        })
      }