具体什么情况下适合使合Vuex?Vuex使用中有几个步骤?

要想知道什么情况下适合使用Vuex,就要先知道Vuex是什么。

Vuex是一个状态管理机制,采用集中式存储应用所有组件的状态

什么叫集中式式存储?

比如我们在很多地方都需要一个变量,例如用户名或者用户的昵称,我们最简单的方法就是在这两个组件内分别进行用户名的请求,这种操作相对应的比较明显的弊端,那就是资源的浪费,以及代码不好维护等方面。

那么集中式是什么概念呢?

就是把整个应用的状态独立出来当成一个树形结构管理,所有叶子数据的更改都使用唯一的通道进行操作。就相当于租房子一样,房东集中给房子交给中介,任何租房子的流程都要经过中介才能完成。而租客想要租房子也要去通过访问中介才能获取到房子的信息等情况。(最近也在租房子,实在是太坑了。)

什么情况下适合使合Vuex?

站在系统架构的角度上来,Vuex虽然能很好帮助我们管理状态, 但随之也带来更多的概念让我们花时间来消化,一般情况下我们会根据项目的实际大小来决定是否需要引入Vuex,如果相对需要存储的内容不是特别多的时候,那么我们也可以通过本地存储进行完成一些数据的存储以及操作。


Vuex

从图中我们可以看到vuex包含了3个关键词

State
Actions
Mutations

最简单使用Vuex的方式

// store.js
// store中管理store以及mutations, 然后在组件中通过commit来触发store中mutations的方法
const store = new Vuex.Store({
 state: {
   name: 'JS'
 },
 mutations: {
   updateName (state) {
     state.name = 'JS每日一题'
   }
 }
})
// a.vue
store.commit('updateName') // JS每日一题

State

字面意思就是状态,上面也说了Vuex是集中式管理, 那么在这里就理解成为集中管理的状态(全局可使用状态)

组件中获取状态可以通过以下方式

const Demo = {
 template: `<div>{{ name }}</div>`,
 computed: {
   name () {
     return store.state.name
   }
 }
}
// 也可以通过mapState 辅助函数来获取
 computed: mapState({
     name: state => state.name
 })
// 引入多个state可以通过对象展开运算符来获取
 computed: {
     ...mapState({
       name
       // ...
     })
 }

Mutations

更改Vuex中的Store的唯一途径就是Mutation,且必须是同步函数.

代码理解

 // 首先mutations 是一个对象
 // 下面的updateName 展开写就是 updateName : function(){}, 在vuex叫做Type Handler
 // 根据上一条的解释,所以会看到很多mutations的写法类 [GET_USER_INFO] : (state) => {}
 // 你不能直接调用mutations.updateName, 因为mutations 只负责注册事件,需要通过store.commit(type) 来唤醒对应type的handler
 // Mutation 需遵守 Vue 的响应规则,也就是说没有被Object.defineProperty 劫持到的state不会响应式, 比如你有一个state为obj = {}, 然后你通过mutation来为obj新增一个属性,
 这时候你需要替换原有的obj组件才会正常响应,
 常用的方式可以通过Object.assign()
 mutations: {
   updateName (state) {
     state.name = 'JS每日一题'
   }
 }
 // 组件中可以通过mapMutaions 辅助函数来映射关系
 // 下面等同于 this.updateName()  this.$store.commit('updateName')
 methods: {
     ...mapMutaions([
       'updateName',
       ...
     ])
 }

Action

Action 类似于 Mutation,提交的是Mutation,而不是直接变更状态。简单来说就是Mutation只负责同步操作,Action负责异步操作

 mutations: {
   updateName (state) {
     state.name = 'JS每日一题'
   }
 },
 actions: {
   // context是一个具有store 实例相同方法和属性的对象
   getUserInfo (context) {
         setTimeout(() => {
             commit('updateName')
         }, 1000)
   }
 }
 // 组件中可以通过mapActions 辅助函数来映射关系
 // 下面等同于 this.getUserInfo()  this.$store.commit('getUserInfo')
 methods: {
     ...组件中可以通过mapActions([
       'getUserInfo',
       ...
     ])
 }

总结

Vuex是一种状态管理机制,将全局组件的共享状态抽取出来为一个Store,以一个单例模式存在,应用任何一个组件中都可以使用,Vuex更改State的唯一途径是通过Mutation,Mutation需要Commit触发, Action实际触发是Mutation,其中Mutation处理同步任务,Action处理异步任务

//部分内容摘抄自微信公众号-Js每日一题
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,423评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,339评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,241评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,503评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,824评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,262评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,615评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,337评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,989评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,300评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,829评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,193评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,753评论 3 230
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,970评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,708评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,295评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,207评论 2 258

推荐阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,901评论 0 7
  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应...
    白水螺丝阅读 4,616评论 7 61
  • Vuex Vuex是一个专门为Vue.js应用所设计的集中式状态管理架构,它借鉴了Flux和Redux的设计思想,...
    JunChow520阅读 1,532评论 2 0
  • 年初时满怀激情的设置年目标,慷慨激昂,觉得自己无论如何都能完成,谁料4月份考试没有考好,5月份心情极度低落,一度...
    姿羽阅读 216评论 0 0
  • ExecutorService executorService2 = Executors.newCachedThr...
    嘟嘟噜噜可阅读 704评论 0 0