Day 17:异步行动,同步变动-Vuex Actions、Mutations

Vuex 是个处理全域资料的状态管理库,采集中式管理方式,方便任何元件都能从中获取状态或触发事件,实作上通常用来存储 API 资料後再加以应用,尤其适合应用於开发中大型专案。

一图以蔽之:

vuex
(图片来源:Vuex - What is Vuex?

Vuex 主要以四个核心概念——State、Getters、Mutations、Actions——所组成,另外包含 Modules 可再进行模组化。依循图片的运行流程大致如下:

  • 先在 action 发送 API 从後端取得资料後,传递给 mutation
  • 提交 mutation 以改变 state,并且是唯一可以改变 state 的方法
  • 一般会先在 state 设定预设值,经由 mutation 将资料赋值给 state 存放
  • 先透过 getter 取得 state 资料,再到元件中引入 getter 并将资料渲染至画面上
  • 元件内也可呼叫 action,接着依序执行循环流程,便能随时更新资料状态及存取应用

原则上整个流程为单向循环,不可逆向,尽量避免越级(若遇处理同步或非同步问题时,也会有略过 action 直接呼叫 mutation 的情形发生)。

Actions 异步行动

  • 处理非同步执行程序

  • 需透过提交 mutation 才能改变 state

  • 使用 dispatch 呼叫 action:回传值为 promise
    dispatch(type: string, payload?: any, options?: Object): Promise<any>

    store.dispatch('fetchBookList', amount: 10)
    
  • action 函式第一个参数为 context,第二个可选参数为 payload

    • context 物件包含:state、rootState、commit、dispatch、getters、rootGetters

      actions: {
      	fetchBookList (context) {
      		context.commit('bookList', books) // 相当於 store.commit()
      	}
      }
      
    • 可利用 ES6 参数解构(argument destructuring)简化程序码:

      actions: {
      	fetchBookList ({ commit }) {
      		commit('bookList', books) // 相当於 store.commit()
      	}
      }
      

Mutations 同步变动

  • 处理同步执行程序

  • 唯一可以改变 state 的方法,且单纯只将结果直送并赋值给 state

  • 使用 commit 呼叫 mutation
    commit(type: string, payload?: any, options?: Object)

    store.commit('bookList', books)
    
  • mutation 函式第一个参数为 state,第二个可选参数为 payload

    mutations: {
        bookList(state, books) {
            state.bookList = books;
        },
    },
    

Vuex.Store 实例方法:dispatch 和 commit 的共通点

  • 第三个可选参数(options?: Object)若设定为 { root: true },便能取得命名模组(namespaced modules)中的 root actions 或 root mutations。

  • payload 作为额外参数,通常会使用物件型别以包含多组资料而易於阅读;
    若是以物件形式呼叫 commit/dispatch,则整个物件会作为 payload 传递给 mutation/action

    store.commit({
      type: 'bookList',
      data: books
    })
    
    mutations: {
        bookList(state, payload) {
            state.bookList = payload.data;
        },
    }
    

参考资料


<<:  Day 20 - 浅谈气候变迁与净零碳排

>>:  价值型投资 VS 成长型投资

2021-Day1. 开箱 Google Cloud Jam 活动背包

今年参赛的另一个主题,也请大家多多支持,感恩~ https://ithelp.ithome.com...

DAY5-PHP这是什麽老东西

前言: PHP(Hypertext Preprocessor)作为网页开发的先驱,可是不知道是因为...

[2021铁人赛 Day01] 前言 and CTF 抢旗赛简介

前言 大家好,我是 catkitchen721 ,或是叫猫厨也可以XD 这是我第二次参加铁人赛,第...

回头看结构行为合一这回事

对~这篇起我要跳脱原本规划的题目了,因为剩下5篇可以综合的胡搞啦~其实也是因为写完几个所知的技能面...

电子书阅读器上的浏览器 [Day27] 无痕模式

原先的 browser 实作就已经包含了无痕模式的细部功能,像是禁止使用 Cookie,和不记录浏览...