Vuex 学习笔记

前言

学习vuex之前,我提出了3个疑问。Vuex 官网

  • vuex 是什么?
    官方文档解释:vuex 是一个专为 Vue.js 应用程序开发的状态管理模式
    通俗点讲就是把这个项目中需要多个地方或全局使用的状态集中管理起来。

  • vuex 应用场景是什么?
    举个栗子
    ①多个组件依赖一种状态。就是说这个状态一改变,其他依赖这个状态的组件都要跟着改变。如果是兄弟组件,使用传值的方式的话就比较麻烦。
    ②多个组件共用同一个请求的数据。我比较懒,又不想在多个组件写相同的请求,而且增加重复代码,怎么办?这时候vuex 就派上用场了。
    从以上两个栗子得出:需要集中管理共同状态的都可以使用 vuex(不要滥用)

  • vuex 怎么用?

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);
export default new Vuex.store({
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... },
  modules: { ... } 
})
// index.js
import Vue from 'vue';
import store from '/store';

new Vue({
  // 全局挂载 Vuex
  store
})

在真正使用之前,你要了解 vuex 扩展的几个核心概念。

Vuex 核心概念

第一次看官方文档的时候,对下面几个概念不是很理解,认真看文档,换个理解方式就好多了。

  • state:管理状态的地方;可以类比成 vue 里面的 data
    注意:state(状态) 不能像 data 的属性那样通过赋值改变,只能通过 mutations 改变,这样的目的是为了更好地追踪状态的变化
export default new Vuex.Store({
  state: {
    count: 1,
    ...
  }
})
  • mutations:改变state(状态)的地方;可以类比成 vue 里面的 methods
    mutations 里面所有 回调函数 接受的第一个参数是 state,其余参数是commit传的。
    注意:mutations 是同步触发的,无法监听回调函数中进行的状态的改变;那我要写异步请求改变状态怎么办,actions 才是干这事的。
export default new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 改变状态;也就是修改 state 里面 count 的值
      state.count++
    }
  }
})

那怎么调用mutations方法改变state?通过commit(提交)的方式。

// ...
mutations: {
  increment (state, n) {
    state.count += n
  },
  increment1 (state, params) {
    state.count += params.amount
  }
}
// ***.vue
// 普通方式提交
this.$store.commit('increment', 10)
// 以对象形式提交
this.$store.commit({
  type: 'increment1',
  amount: 10
})
  • actions:类似于 mutation,但不同的是actions提交的是 mutation,而不是直接改变state actions可以包含任意异步操作。
    actions 接受的第一个参数是 Store实例具有相同方法和属性的 context 对象,其余参数是dispatch分发的
export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    incrementAsync(context) {
      context.commit('increment')
    },
    // 参数解构
    incrementAsync1 ({ commit, getters }, params) {
      commit('increment')
    },
    // 回调方式提交
    incrementAsync2 ({ commit, getters }, params) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  }
})

那怎么调用actions的方法? 通过dispatch(分发)的方式。

// 以普通方式分发
this.$store.dispatch('incrementAsync')

// 以载荷形式分发
this.$store.dispatch('incrementAsync1', {
  amount: 10
})

// 以对象形式分发
this.$store.dispatch({
  type: 'incrementAsync2',
  amount: 10
})
  • getters:可以看做是Store实例的计算属性;用法与vue 的计算属性一致。
    getters 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
    getters 只接受两个参数 stategetters。要是实现给 getter 传参,只能通过让 getter 返回一个函数。
export default new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    },
    // 接收两个参数
    doneTodos1: (state, getters) => {
      return getters.doneTodos.length
    },
    // 返回一个函数
    doneTodos2: (state) => (id) => {
      return state.todos.find(todo => todo.id === id)
    }
  }
})

调用 getters
注意:getter 在通过方法访问时,每次都会去进行调用,而不会缓存结果。

// 通过属性调用
this.$store.getters.doneTodos1
// 通过方法调用
this.$store.getters.doneTodos2(1)
  • modules:模块的意思;每个模块拥有自己的 statemutationactionsgetters、甚至是嵌套子模块。
    当项目非常复杂时候,将 Store 分割成多个module(模块)管理的话维护起来就方便多了。
// ...
export default new Vuex.Store({
  modules: {
    moduleA,
    moduleB
  }
})

总结

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

推荐阅读更多精彩内容

  • Vuex 是什么? ** 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式**。它采用集中...
    Rz______阅读 2,301评论 1 10
  • vuex理解。 Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件状态,...
    GXW_Lyon阅读 274评论 0 0
  • vuex 状态管理器 作为应用中所有组件的中央储存 只能以预定的方式去操作状态 把所有组件共享的状态抽取出来作为全...
    一只大椰子阅读 788评论 0 1
  • 学习目的 了解和熟练使用 VueX,能够在实际项目中运用。 VueX介绍 Vuex 是一个专为 Vue.js ...
    _1633_阅读 2,789评论 0 7
  • 概要 官方解释Vuex是一个专为Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态...
    许小花花阅读 447评论 0 0