VueX-状态管理中心让你的数据有个公共的家

381 阅读3分钟

一.什么是VueX

官方的解释: Vuex是一个专为Vue.js应用程序开发的状态管理模式

当项目比较庞大的时候,每个组件的状态比较多,为了方便管理,需要把组件中的状态抽取出来,放入Vuex中进行统一管理。

接下来夹带私货:

笔者自己本身学习VueX的时候,就是把VueX当成了EventBus的增强版(不知道EventBus的同学可以看看我之前的博文)。VueX帮助我解决了两个问题:

(1)组件之间高频率的传值(高频率的发射事件,接收事件或值)

(2)开辟出可以存储公共数据的地方(正如我的标题,这是数据的家,而不仅仅是一辆bus)

因此我在Eventbus那篇博文中说到VueX是我认为的最稳定的传值方法,因为数据并不在任何一个组件上

二.如何使用VueX

在这里插入图片描述

说到VueX就绕不开这张图了

说实话笔者自己在读官方文档时也是一头雾水,结合着自己的实践,在这里给大家一种更好的理解方式:

State:数据仓库,存储公用数据的地方

Mutations:更改State中数据的方法,记住这里写方法!

Actions:控制异步操作,可以让Mutations里的方法缓慢执行,记住只有需要异步操作的时候你才用这个!(你不会问我什么是异步吧?)

三.store.js

我们直接上手,找到项目文件中的store.js(这就是你操作VueX的地方)写下以下代码:

import Vue from 'vue'

import Vuex from 'vuex'



Vue.use(Vuex)



export default new Vuex.Store({

 state: {

  count:0

 },

 mutations: {

  add(state){

   state.count++

  },

  decrease(state){

   state.count--

  }

 },

 actions: {

  delayadd(context){

   setTimeout(() => {

​    context.commit('add')

   }, 1000);

  }

 }

})

看看我们干了些什么

首先我们存储了一个公用数据:

count

其次我们定义了两个更改数据的方法

add()和decrease() 会自动跟随一个参数state

最后我们定义了一个异步操作

delayadd()会自动跟随一个参数context

延缓add执行的时间

四.调用State

需要在组件上使用count,怎么办呢?

在组件上调用state里的数据需要借助computed,先说个简单的

看代码:

computed:{

​      count(){

​        return this.$store.state.count

​      }

​    }

这里大家可以把$store看成一个对象,这个对象就是你刚才操作的store.js,因此调用属性是不是很熟悉?

当然了还有更简单的方法

看代码:

 import { mapState } from 'vuex'

  export default {

​    name:'parent',  

​    computed:{

​      ...mapState({

​        count:'count'

​      })

​    } 

  }

vue给了我们一个辅助函数mapState,可以将state里的数据直接映射进computed,当然你要先引入。

既然我们映射来的也是一个对象那么我们就可以用展开运算符

这种在我们数据较多的时候十分好用

五.调用Mutations

我们在组件里给个button,点击之后count+1,这如何实现呢?

惯例,先说个简单的

<button @click="add">增加</button>

methods:{

​      add(){

​        this.$store.commit('add')

​      }

​    }

有了第四节的经验,上述代码大家应该很好理解,需要注意的是调用mutations里的方法需要使用commit方法

那可不可以映射呢?

答案是可以的

上代码

 import { mapMutations } from 'vuex'

methods:{

​      ...mapMutations({

​        add: 'add' 

​      })

​    }

同样的这在方法比较多的时候用起来很爽

六.调用Actions

最后,如果想在组件上点击button,之后延缓1s,count再增加,如何实现呢?

这就需要调用actions了,惯例先来个简单的

methods:{

​      add(){

​        this.$store.dispatch("delayadd")

​      }
      
​    }

把add这个方法绑定到button的click事件上就可以看到效果,这里调用actions用dispatch方法

你问我这有没有映射呢?

巧了,还真有

什么?你要看代码!

去找官方文档上找吧,哈哈哈哈0.0

总结

最后我们再来看看我们之前的定义

官方的解释: Vuex是一个专为Vue.js应用程序开发的状态管理模式

当项目比较庞大的时候,每个组件的状态比较多,为了方便管理,需要把组件中的状态抽取出来,放入Vuex中进行统一管理。

其实就是把公共的数据和操纵数据的方法从组件里抽出来,只不过抽的更细,把异步操作放到了actions里。

是不是很简单?所以,今天你学废了嘛?