跳至主要内容

【Vue2】Vuex Actions

接續上一篇【Vue2】Vuex Mutations 深入理解,這一篇來介紹 Actions 的用法。

Actions 跟 mutations 很像,但有幾點不同:

  • 相較於 mutations 呼叫 state,Actions 則是呼叫 mutation。
  • 可以執行非同步(Asynchronous)函式。

在元件裡呼叫 Actions

相較於呼叫 mutations 使用 store.commit() 如果我們要在元件裡呼叫 actions 函式則是使用:

store.dispatch("myFunction");

如果要一次引入很多 actions 函式,則可以使用 mapActions 來簡化程式碼:

<script>
import { mapActions } from "vuex";
export default {
methods: {
...mapActions(["increment", "decrement"]),
},
};
</script>

在 Store 建立 Actions

在建立 mutations 時,我們會把 state 傳入去做處理:

store/index.js
export default new Vuex.Store({
state: {
count: 0,
},
mutations: {
increment(state) {
state.count++;
},
},
});

而 actions 則是會傳入一個 context 的物件,他有四個屬性可以使用:

  • context.state
  • context.commit
  • context.getter
  • context.dispatch

getter 我們之後再來介紹,先來看一下其他三個屬性

1. context.state

也就是 store 裡面的 state,雖然也可以像 mutations 一樣,更改 state 的值,但是為了區分不同的功能性,大部分還是會把 state 的更改權交給 mutations,在 actions 裡都只會讀取 state 的值而不會改變他。

2. context.commit

用來呼叫 mutations 的函式,傳入函式名且只會在 actions 裡面呼叫。

store/index.js
export default new Vuex.Store({
state: {
count: 0,
},
mutations: {
increment(state) {
state.count++;
},
},
actions: {
incrementOne(context) {
context.commit("increment");
},
},
});

3. context.dispatch

跟在元件呼叫 actions 功能一樣,只是變成在 actions 裡面呼叫裡面的函式:

store/index.js
export default new Vuex.Store({
state: {
count: 0,
},
mutations: {
increment(state) {
state.count++;
},
},
actions: {
incrementOne(context) {
context.commit("increment");
},
increment(context) {
...
context.dispatch("incrementOne");
},
},
});
提示

在 ES6 之後,就可以使用解構賦值的方式,讓程式碼更簡化

store/index.js
export default new Vuex.Store({
actions: {
increment({ state, commit, getter, dispatch }) {
commit("increment");
},
},
});

在 Actions 使用非同步函式

下面的範例就是使用 Actions 來處理非同步函式來抓狗狗的圖片路徑: