Vuex 101

说起vuex,vue开发人员必定使用过。我也用过,不过一直是copy-paste based developmement。后来开始接触graphql了,就很少再用vuex了,现在也基本淡忘了。今天回看了自己以前写的代码,vuex使用一团糟,胡学瞎用最后成了技术债。

组件化开发

现代主流的web应用基本上都是组件化开发的思路,下图是其中一个很常见的web组件架构:后端只提供单纯的数据读写服务,前端负责主要的业务流;后来,随着前端日益沉重,又从中分出了一个中间层管理缓存和数据状态(Cache & State)。Vuex就是这个中间层里管理状态的一个工具。

Component-based App

Vuex 的功能类似于总线,使用的是全局单例模式。下图是vuex模式下的单向数据流:

  • State:驱动应用的数据源;

  • View:以声明方式将 state 映射到视图;

  • Actions:响应在 view 上的用户输入导致的状态变化。

data flow

OK,我以前写代码的时候就看到上图,后来照着网上的demo胡搬滥造(捂脸),结果vue组件里到处都是如下代码片:

let logo = this.$store.state.company.info.logo;

this.$store.commit('company/info', info);

store之后的一堆field又臭又长,全文检索密密麻麻。后来起新项目的时候,我就几乎不再用vuex了。前段时间和组里的一个小朋友聊vuex的时候,他告诉我vuex是这样的(当时惊了……):

vuex-flow

组件产生actions后,在store里commit mutations方法,mutations随之更新state,最后由Getter方法反映到组件里。一套很优雅的实现:状态的变化实现了高度统一管理。比起我当年的写法,代码变得更加简洁高效。(一百分)

Demo

简单写了个demo,用代码来反映一下上图所示的数据流。下图由两个组件构成:

  1. Selected 所在行:用于显示vuex里的state

  2. 三个radio组成的选择面板:用于触发vuex action,从而更新state。

Demo

State

首先自建一个store.js,用来管理所有vuex state相关的数据以及操作。state就是我们要管理的全局状态,它是一个任意指定的对象。

const state = {
  radio: '',
};

const actions = { ... };

const mutations = { ... };

const getters = { ... };

export default new Vuex.Store({state, getters, mutations, actions});

Actions

Actions是一组对vue组件开放的api集合。现在的前端开发很少再在vue methonds里直接调用后端api了,更多的是通过这类action统一代理;当然,在vuex里它的主要工作还是commit mutations里的方法,比如这里的updateRadio

const actions = {
  selectRadio ({commit}, val) {
    commit('updateRadio', val);
  },
};

Mutations

接着就是刚提到的mutations了。Mutations里也是一系列方法集,它的功用类似于vuex里的私有方法,由上一层actions触发,并直接修改state。

const mutations = {
  updateRadio (state, val) {
    state.radio = val;
  }
};

Getter

最后一部分就是Getter集合,顾名思义,它的功用是对vue组件暴露state的特定状态。

const getters = {
  getRadio () {
    return state.radio;
  }
}

Mapper

vuex的map方法是新版本里的一大亮点(学Redux的),也是我重学vuex后最大的收获:Store里的Actions和Getters通过解构(Destructuring assignment)赋值为methodscomputed的方法。(对,就是那三个点)

<template>
    <h1>Selected: {{ getRadio }}</h1>

    <label v-for="o in ['Onion', 'Ginger', 'Garlic']">
        <input @click="selectRadio($event.target.value)"
            name='seasoning' type='radio' :value=o>
        {{ o }}
    </label>
</template>

<script>
import { mapActions, mapGetters } from 'vuex';

export default {
  methods: {
    ...mapActions(['selectRadio']),
  },
  computed: {
    ...mapGetters(['getRadio']),
  }
};
</script>

如上所示,我们可以在input的点击事件里直接绑定action方法selectRadio,并在该事件触发后通过getter方法的getRadio展示state里radio的状态。

小结

可能是近来有点脱产了,vuex也没上心学习一下;要不是组里小朋友提醒,我可能都不愿意去碰它了。人不学,不知道,要时刻牢记技术是我等底层小职员安身立命的唯一选项。

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

推荐阅读更多精彩内容

  • VUE Vue :数据驱动的M V Vm框架 m :model(后台提供数据),v :view(页面),vM(模板...
    wudongyu阅读 5,368评论 0 11
  • ### store 1. Vue 组件中获得 Vuex 状态 ```js //方式一 全局引入单例类 // 创建一...
    芸豆_6a86阅读 724评论 0 3
  • ### store 1. Vue 组件中获得 Vuex 状态 ```js //方式一 全局引入单例类 // 创建一...
    芸豆_6a86阅读 339评论 0 0
  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,924评论 0 7
  • 系列文章:Vue 2.0 升(cai)级(keng)之旅Vuex — The core of Vue applic...
    6ed7563919d4阅读 4,539评论 2 58