码迷,mamicode.com
首页 > 其他好文 > 详细

VueX 的使用

时间:2019-11-25 16:54:37      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:ret   应用程序开发   无法   存储管理   变化   methods   computed   如何   关系   

Vuex 是什么?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。

它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

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

让我们从一个简单的 Vue 计数应用开始:

new Vue({
  // state
  data () {
    return {
      count: 0
    }
  },
  // view
  template: `
    <div>{{ count }}</div>
  `,
  // actions
  methods: {
    increment () {
      this.count++
    }
  }
})

 

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

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

以下是一个表示“单向数据流”理念的简单示意:

 

技术图片

 

 

 

但是,当我们的应用遇到多个组件共享状态时单向数据流的简洁性很容易被破坏

  • 多个视图依赖于同一状态。
  • 来自不同视图的行为需要变更同一状态。

对于问题一,传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。

对于问题二,我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。

以上的这些模式非常脆弱,通常会导致无法维护的代码。

因此,我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢?在这种模式下,

我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!

什么情况下我应该使用 Vuex?

Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行权衡

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,

您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。

但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,

Vuex 将会成为自然而然的选择。引用 Redux 的作者 Dan Abramov 的话说就是:

Flux 架构就像眼镜:您自会知道什么时候需要它。

开始

每一个 Vuex 应用的核心就是 store(仓库)。

“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)

Vuex 和单纯的全局对象有以下两点不同

1. Vuex 的状态存储是响应式的。

当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新

2.你不能直接改变 store 中的状态

改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation

这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用

最简单的 Store

安装 Vuex 之后,让我们来创建一个 store。

创建过程直截了当——仅需要提供一个初始 state 对象和一些 mutation:

// 如果在模块化构建系统中,请确保在开头调用了 Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

own:

1.导入vuex

//1.导入vuex
import Vuex from ‘vuex‘
//调用
Vue.use(Vuex)

2.创建

//2.创建
const store = new Store({
  state:{
    // 这里面的状态跟每个组件的数据属性有关系   
    count:0
  },
  mutations:{
    increment(state){
      state.count++

    }
  }

})

 

技术图片

 

 

现在,你可以通过 store.state 来获取状态对象,以及通过 store.commit 方法触发状态变更:

store.commit(‘increment‘)

console.log(store.state.count) // -> 1

 

再次强调,我们通过提交 mutation 的方式,而非直接改变 store.state.count,是因为我们想要更明确地追踪到状态的变化。

这个简单的约定能够让你的意图更加明显,这样你在阅读代码的时候能更容易地解读应用内部的状态改变。

此外,这样也让我们有机会去实现一些能记录每次状态改变,保存状态快照的调试工具。

有了它,我们甚至可以实现如时间穿梭般的调试体验。

由于 store 中的状态是响应式的,在组件中调用 store 中的状态简单到仅需要在计算属性中返回即可。

触发变化也仅仅是在组件的 methods 中提交 mutation。

这是一个最基本的 Vuex 记数应用示例。

State

单一状态树

Vuex 使用单一状态树——是的,用一个对象就包含了全部的应用层级状态

至此它便作为一个“唯一数据源 (SSOT)”而存在。这也意味着,每个应用将仅仅包含一个 store 实例

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

单状态树和模块化并不冲突——在后面的章节里我们会讨论如何将状态和状态变更事件分布到各个子模块中。

存储在 Vuex 中的数据和 Vue 实例中的 data 遵循相同的规则,例如状态对象必须是纯粹 (plain) 的。

在 Vue 组件中获得 Vuex 状态

那么我们如何在 Vue 组件中展示状态呢?由于 Vuex 的状态存储是响应式的

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

// 创建一个 Counter 组件
const Counter = {
  template: `<div>{{ count }}</div>`,
  computed: {
    count () {
      return store.state.count
    }
  }
}

 

 

每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。

 

然而,这种模式导致组件依赖全局状态单例。在模块化的构建系统中,

在每个需要使用 state 的组件中需要频繁地导入,并且在测试组件时需要模拟状态。

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

(需调用 Vue.use(Vuex)):

const app = new Vue({
  el: ‘#app‘,
  // 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
  store,
  components: { Counter },
  template: `
    <div class="app">
      <counter></counter>
    </div>
  `
})

通过在根实例中注册 store 选项,该 store 实例会注入到根组件下的所有子组件中

子组件能通过 this.$store 访问到。让我们更新下 Counter 的实现:

own:

 

 

mapState 辅助函数

 

 

 

 

 

 

 

 

 

 

VueX 的使用

标签:ret   应用程序开发   无法   存储管理   变化   methods   computed   如何   关系   

原文地址:https://www.cnblogs.com/Rivend/p/11928709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!