Vuex 的学习过程记录

Vuex 的学习记录

  • 资料参考网址
  • Vuex的简介
    • Vuex 是一个类似 Redux 的状态管理器,专为 Vue.js 应用程序开发,采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,并集成到了Vue的官方调试工具 devtools extension
    • Vuex的使用情况: 当开发大型单页面应用(SPA)时,会出现多个视图组件依赖同一个状态,来自不同视图的行为需要变更同一个状态。
  • 基础使用及API说明
    • 常用api及基础写法

      // func 指代 Function,函数
      const store = new Vuex.Store(
          {
              state: {} | func,   // 根state对象,初始数据或状态赋值
              mutations: {},      // 纯函数修改数据的方法,处理函数总是接受 state 作为第一个,payload 作为第二个参数(可选)
              actions: {},        // 事件,动作, 处理函数总是接受 context 作为第一个参数,payload 作为第二个参数(可选)。
              getters: {},        // store 的计算属性,返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生改变才会被重新计算
              modules: {},        // 包含子模块的对象,会被合并到 store
              plugins: [],        // 包含应用在store上的插件方法,这些插件接受store作为唯一参数,可以监听 mutation(用于外部地数据持久化、记录或调试)或者提交 mutation(用于内部数据,例如 websocket 或 某些观察者)
              strict: Boolean,    // 默认值:false, 使Vuex store进入严格模式,任何 mutation 处理函数以外修改 Vuex state 都会抛出错误。
          }
      );
      
    • 最简单的 Vuex 示例

      ```
      import Vue from 'vue';
      import Vuex from 'vuex';
      Vue.use(Vuex);
      
      const store = new Vuex.Store({
          state: {
              count: 0
          },
          mutations: {
              increment (state) {
                  state.count++
              }
          }
      });
      
      store.commit('increment');
      console.log(store.state.count)  // 1
      ```
      
      注明:每一个Vuex应用就是一个store,在store中包含组件的共享状态 `state` 和改变状态的方法 `mutations`,且只能通过 `mutations` 改变store的 `state` 的状态,不能通过类似 `store.state.count = 5` 的方式直接更改(直接修改,状态不会被同步,组件也不会重新渲染)
      
      • 在Vue组件使用Vuex

        • 在<b>根组件</b>,将store 注入到每一个子组件中,在子组件就可以通过 this.$store 访问:
        // 根组件
        import store from './store';
        new Vue({
          el: '#app',
          router,
          store,
          render: h => h(App)
        })
        
        // Counter 组件
        export default {
              name: 'counter',
              computed: {
                 count () {
                   return this.$store.state.count
                }
              }
            }
        
        • <b>Getters</b>: Vuex 中getters 对象,接受state作为第一个参数,可以方便我们在 store 对 state 进行处理计算。Getter也可以接受其他 <b>getters</b> 作为第二参数
        const store = 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)
                }
              }
            })
        // 在Vue中通过 store.getters对象调用
        computed: {
          doneTodos () {
            return this.$store.getters.doneTodos
          }
        }
        // Getter也可以接受其他getters作为第二个参数
        getters: {
          doneTodos: state => {
              return state.todos.filter(todo => todo.done)
          },
          doneTodosCount: (state, getters) => {
            return getters.doneTodos.length
          }
        }
        
        • <b>Mutations</b>: 每一个mutation都有一个事件类型type和一个回调函数handler,Mutations必须是同步函数,若需要异步操作,就需要 Actions了。
        const store = new Vuex.Store({
          state: {
            count: 1
          },
          mutations: {
            increment (state) {
              state.count++;   // 变更state状态
            }
          }
        })
        // 调用mutation,需要通过store.commit方法调用mutation type
        store.commit('increment');
        // 可以向store.commit传入第二参数,也就是mutation的payload(多数情况传对象)
        mutaion: {
            increment (state, n) {
                state.count += n;
            },
            outcrement (state, payload) {
                state.totalPrice += payload.price + payload.count;
            }
        }
        
        store.commit('increment', 10);
        store.commit('outcrement', {
            price: 10,
            count: 8
        });
        
  • Vuex.Store 组件绑定的辅助函数
    • mapState(namespace?: string, map: Array<string> | Object), 第一个参数可选。当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。使用 mapState 辅助函数可以帮助我们批量生成计算属性。

      // 在单独构建的版本中辅助函数为 Vuex.mapState
      import { mapState } from 'vuex'
      
      export default {
        computed: mapState({
          // 箭头函数可使代码更简练
          count: state => state.count,  // 不使用mapState辅助函数的写法
      
          // 传字符串参数 'count' 等同于 `state => state.count`
          countAlias: 'count',          // 写法一,使用别名方式
      
          // 为了能够使用 `this` 获取局部状态,必须使用常规函数
          countPlusLocalState (state) {
            return state.count + this.localCount  // 写法二,常规函数方式
          }
          
          // 
        })
      }
      
      // 当映射的计算属性的名称与state的子节点名称相同时,可用字符串数组的写法
      export default { 
          computed: mapState(['count'])  // 映射 this.count 为 store.state.count
      }
      
      // 使用 ES6 的 对象展开运算符 的写法去简化
      export default { 
          computed: { ...mapState(['count','total']) }    } 
      
      • mapGetters(namespace?: string, map: Array<string> | Object) : 将 store 中的 getter 映射到局部计算属性。
      import { mapGetters } from 'vuex'
      export default {
          computed: {
          // 使用对象展开运算符将 getter 混入 computed 对象中
          ...mapGetters([
            'doneTodosCount',
            'anotherGetter'
          ])
        }
      }
      // 想将getter属性另取一个名字,需使用对象形式
      export default {
          computed: {
          mapGetters({
              doneCount: 'doneTodosCount' // 映射 `this.doneCount` 为`store.getters.doneTodosCount`
          })
        }
      }
      
      • mapActions(namespace?: string, map: Array<string> | Object): 将组件的 methods 映射为 store.dispatch 调用
      import { mapActions } from 'vuex'
      
      export default {
        methods: {
          ...mapActions([
            'increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`
      
            // `mapActions` 也支持载荷:
            'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`
          ]),
          
          ...mapActions({
            add: 'increment' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')`
          })
        }
      }
      
      • mapMutations(namespace?: string, map: Array<string> | Object): 将组件中的 methods 映射为 store.commit 调用
      import { mapMutations } from 'vuex'
      export default {
          methods: {
              ...mapMutions([
                  'increment',  // 将`this.increment()` 映射为 'this.$store.commit('increment')'
                  
                  // `mapMutations` 也支持载荷:
                  'incrementBy'  // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
              ]),
              ...mapMutations({
                  add: 'increment',  // 将 `this.add()`映射为`this.$store.commit('increment')`
              })
          }
      }
      
    • createNamespacedHelpers(namespace: string): 建基于某个命名空间辅助函数

          import { createNamespacedHelpers } from 'vuex'
          const { mapState, mapActions } = createNamespacedHelpers('some/nested/module')
          
          export default {
            computed: {
              // 在 `some/nested/module` 中查找
              ...mapState({
                a: state => state.a,
                b: state => state.b
              })
            },
            methods: {
              // 在 `some/nested/module` 中查找
              ...mapActions([
                'foo',
                'bar'
              ])
            }
          }
      
  • Vuex.Store 的实例属性
    • store.commit( '', { } ) : 提交 mutation

    • store.dispatch( '', { } ) : 分发 actions

    • store.replaceState(newstate): 替换 store 的根状态,仅用状态合并或时光调试。

    • store.watch( getter, cb ) : 响应式地监测一个 getter 方法的返回值,当值改变时调用回调函数。

    • store.subscribe(Function): 注册监听 store 的 mutations , Function 会在每个 mutations 完成后调用,接受 mutation 和 经过 mutation 后的状态作为参数:

      store.subscribe((mutation, state) => {
          console.log(mutation.type)
          console.log(mutation.payload)
      })
      
    • store.subscribeAction(handler: Function): 订阅 store 的action, handler 会在分发的时候调用并接收 action 描述和当前的 store 的 state两个参数。

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

推荐阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,920评论 0 7
  • Vuex是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件...
    萧玄辞阅读 3,089评论 0 6
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 7,999评论 4 111
  • Vuex 是什么? ** 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式**。它采用集中...
    Rz______阅读 2,292评论 1 10
  • vuex 状态管理器 作为应用中所有组件的中央储存 只能以预定的方式去操作状态 把所有组件共享的状态抽取出来作为全...
    一只大椰子阅读 784评论 0 1