前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vuex-state 原

Vuex-state 原

作者头像
tianyawhl
发布2019-04-04 11:14:15
6810
发布2019-04-04 11:14:15
举报
文章被收录于专栏:前端之攻略前端之攻略

什么是“状态管理模式”?

      这个状态自管理应用包含以下几个部分:

  • state,驱动应用的数据源;
  • view,以声明方式将 state 映射到视图;
  • actions,响应在 view 上的用户输入导致的状态变化。

     每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分      的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:

  1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
  2. 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

 在 Vue 组件中获得 Vuex 状态

那么我们如何在 Vue 组件中展示状态呢?由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态:每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。

代码语言:javascript
复制
<body class="">
    <script src="../js/vue.js"></script>
    <script src="../js/vuex.js"></script>
    <script src="../js/vue-router.js"></script>
    <div id="app">
        <my-component></my-component>
    </div>
    <script>
    const store = new Vuex.Store({
        state: {
            count: 10
        },
        mutations: {
            increment: state => state.count++
        }
    })
    const Counter = {
        template: `<div>
        <div>{{count}}</div>
        <button v-on:click="increment">add</button>
        </div>`,
        computed: {
            count() {
                return store.state.count
            }
        },
        methods: {
            increment() {
                store.commit("increment")
            }
        }
    }
    const app = new Vue({
        el: "#app",
        components: {
            'my-component': Counter
        }
    })
    </script>
</body>

然而,这种模式导致组件依赖全局状态单例。在模块化的构建系统中,在每个需要使用 state 的组件中需要频繁地导入,并且在测试组件时需要模拟状态。

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

代码语言:javascript
复制
<body class="">
    <script src="../js/vue.js"></script>
    <script src="../js/vuex.js"></script>
    <script src="../js/vue-router.js"></script>
    <div id="app">
    </div>
    <script>
    const store = new Vuex.Store({
        state: {
            count: 12
        },
    })
    const Counter = {
        template: `<div>{{ count }}</div>`,
        computed: {
            count() {
                return this.$store.state.count
            }
        }
    }
    const app = new Vue({
        el: '#app',
        // 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
        store,
        components: { Counter },
        template: `
            <div class="app">
              <counter></counter>
            </div>
          `
    })
    // template里面的Counter首字母大写小写都可以
    </script>
</body>

mapState 辅助函数

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

代码语言:javascript
复制
// 在单独构建的版本中辅助函数为 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
    }
  })
}

经过mapState函数调用后的结果,如下所示:

代码语言:javascript
复制
import { mapState } from 'vuex'
export default {
  // ...
  computed: {
    count() {
      return this.$store.state.count
    },
    countAlias() {
      return this.$store.state['count']
    },
    countPlusLocalState() {
      return this.$store.state.count + this.localCount
    }
  }
}

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

代码语言:javascript
复制
computed: mapState([
  // 映射 this.count 为 store.state.count
  'count'
])

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017/10/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是“状态管理模式”?
  •  在 Vue 组件中获得 Vuex 状态
  • mapState 辅助函数
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档