iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 30
1
Modern Web

超緊繃!30天Vue.js學習日記系列 第 30

[Vue.js][日記]擁抱全家桶系列-東西太多?蓋個倉庫通通塞進去吧!(2)

https://ithelp.ithome.com.tw/upload/images/20190912/20110850dsypfXRkNe.jpg

超緊繃!30天Vue.js學習日記 擁抱全家桶系列-東西太多?蓋個倉庫通通塞進去吧!(2)

大家好,接續昨天的主題,我們繼續探討Vuex的基本核心:D

#actions

由於mutation並不支援異步操作,所以產生了action,不過action不能直接改變state,而是可以透過觸發mutation去改變state的值。

const store = new Vuex.Store({
state: {
    todos: [
      { id: 1, text: '123', done: true }
    ],
    count:0
  },
mutations: {
    increment(state) {
      state.count++
    }
  } ,
  actions: {
    increment2 (context) {
      context.commit('increment')
    }
  }
})

mapActions輔助函式

這邊的用法跟mapGetters差不多,不過我們是將action的內容投射到vue實例中的methods:

new Vue({
	el:'#app',
	store,
	methods:{
		...Vuex.mapActions([
			'increment2'
			])
	}
})
<button @click="increment">+1</button>

補充:

由於此範例是我直接使用html檔案進行編輯,若今天我們使用vue-cli開發webpack專案,我們需要在用到輔助函式的組件內使用import喔!

import { mapActions } from 'vuex'
import { mapGetters } from 'vuex'

然後在使用輔助函式時也不需要像前面的範例一樣使用Vuex.mapActions
可以去除掉Vuex,像是這樣:

methods:{
		...mapActions([
			'increment2'
			])
	}

在上述範例中,我們在action內的increment2中使用context.commit('')去呼叫mutations內的increment

在知道action如何呼叫mutations後,我們也要知道action內的函式要如何呼叫:

<button @click="store.dispatch('increment2')">+1</button>

呼叫action內的函式必須使用store.dispatch('')

#module

將store模組化

這邊我是直接附上官方文件的範例:

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的狀態
store.state.b // -> moduleB 的狀態

本日範例下載:
https://drive.google.com/open?id=1fJprKJa9QX7WjQfrLggTVbDn7QFiBNm3

這30天的教學就到這邊結束了,如果對於vue有興趣想要進行更深入的研究,可以去追其他大神的技術部落,或是把官方的文件全部嗑完,畢竟30天時間有限,沒能把每個主題都進行深入探討/images/emoticon/emoticon02.gif


上一篇
[Vue.js][日記]擁抱全家桶系列-東西太多?蓋個倉庫通通塞進去吧!(1)
下一篇
[Vue.js][日記]完賽心得
系列文
超緊繃!30天Vue.js學習日記33

尚未有邦友留言

立即登入留言