乐趣区

Vuex中的State

state 是 Vuex 中的基本数据,state 上存放的就是所谓的状态。当没有使用 state 的时候,直接在 data 中进行初始化,有了 state 之后,我们就把 data 上的数据转移到 state 上去了。

单一状态树

Vuex 使用到的是单一状态树,即用一个对象就包含了全部的状态数据。也就是说如果我们定义了一个 store 的实例,那么这个 store 实例里面只有一个 state。state 作为构造器选项,定义了所有我们需要的基本状态参数。

单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照。

在 Vue 组件中获得 Vuex 状态

从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态。

示例:

例如我们在 state 中定义一个 count 属性,给它赋一个值为 10,store.js文件内容如下所示:

import Vue from 'vue' // 引入 vue
import Vuex from 'vuex' // 引入 vuex

Vue.use(Vuex)  

const state = {count: 10}

export default new Vuex.Store({state})

然后创建一个 Counter 组件,在组件中返回 count,内容如下所示:

const Counter = {template: `<div> count 的值为:{{ count}}</div>`,
  computed: {count () {return store.state.count  // 返回 store 实例的 count 状态}
  }
}

每当 store.state.count 变化的时候,都会重新求取 count 属性,并刷新界面。

这种模式依赖于全局的管理员 store,如果模块多了,那么每个模块或者页面只要用到了这个 state 里面的数据,都得把 store 引入进来,这样的操作确实有点难受。所以出现了下面这种解决办法。

Vuex 通过 store 选项,提供了一种机制将状态从根组件“注入”到每一个子组件中:

new Vue({
  el: '#app',
  store,  // 根组件通过 store 选项将 store 实例注入所有地子组件
  // 子组件
  components: {Counter},
  template: `
    <div class="app">
      <counter></counter>
    </div>
  `
})

Vue 项目的 index.html 文件内容如下所示:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title> 侠课岛 </title>
  </head>
  <body>
    <h1> 侠课岛欢迎你 </h1>
    <div id="app"></div>
  </body>
</html>

最终我们使用 npm run dev 运行项目,浏览器中的输出结果如下图所示,如果我们在 state 中改变 count 的值,页面会自动刷新:

mapState 辅助函数

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

示例:

在使用 mapState 函数之前,需要先引入它:

import {mapState} from 'vuex'

引入后才可以开始使用,它两种用法,可以接受一个对象或接受一个数组。

对象用法如下:

import {mapState} from 'vuex'

export default {
  // 下面这两种写法都可以
  computed: mapState({
    // 组件内的每一个属性函数都会获得一个默认参数 state, 然后通过 state 直接获取它的属性
    count: state => state.count,
    // 'count' 直接映射到 state 对象中的 count, 相当于 this.$store.state.count
    count: 'count' 
  })
}

数组用法如下所示:

// 当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。export default {
    computed: mapState([ // 数组
      'count'
    ])
}

链接:https://www.9xkd.com/

退出移动版