一、Vuex 是什么?

官网:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

关键词:状态管理器

二、为什么我们要用呢?

官网:

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

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

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

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

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

因此,我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢?在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!

通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态间的独立性,我们的代码将会变得更结构化且易维护。

关键词:多个组件共同用一个变量的时候,靠组件传参太复杂,是的,一个变量,进行父传子、子传孙、子子孙孙无穷尽,想想都不行啊兄弟萌,不要想为啥用了

三、怎么用?

在此了解五个属性:State\Mutation\Action\Getter\Module

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

  1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

  2. 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

看不懂的还是听我给你讲:我们可以直接在main.js中创建一个store,

import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
}
})  

接下来为了在 Vue 组件中访问 this.$store property,需要为 Vue 实例提供创建好的 store。Vuex 提供了一个从根组件向所有子组件,以 store 选项的方式“注入”该 store 的机制

new Vue({
el: '#app',
store
})

现在我们可以从组件的方法提交一个变更:

methods: {
increment() {
this.$store.commit('increment')
console.log(this.$store.state.count)
}
}

以上就是我们通过vuex来创建state变量、通过mutation来修改变量的过程,具体为什么这么做:

网上有很多解释的文档,这里直接复制过来

1. state:vuex的基本数据,用来存储变量

2. geeter:从基本数据(state)派生的数据,相当于state的计算属性

3. mutation:提交更新数据的方法,必须是同步的(如果需要异步使用action)。每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。

   回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数,提交载荷作为第二个参数。

4. action:和mutation的功能大致相同,不同之处在于 ==》1. Action 提交的是 mutation,而不是直接变更状态。 2. Action 可以包含任意异步操作。

5. modules:模块化vuex,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理

简单来说,state用来定义变量、mutation修改变量

备注:其实vuex如果你仅仅是用state的时候,你会发现,此时相当于在全局定义了一个变量,因此我们其实是可以直接赋值进行修改的

 this.$store.state.bianliang = xinbianliang ,但是为什么要用mutation呢,这是因为在严格语法下,如果直接修改state里面的值,会给我们报错的,因此用mutation修改

action上面的用法说了,可以操作异步,,,getter类似于vue的compute属性,进行视图渲染,初学者可能一般不用,module是定义多个模块,方便大项目引入,

因此,初学者其实仅仅掌握、store\mutation的用法后,可以简单的说自己掌握了状态管理器

我觉得如果想彻底了解vuex的用法,我们不单单要光看文档,还需要不断的用键盘进行敲击,记住语法、作用等,这样才能加深理解

 

05-22 20:00