[Vue] Vuex 是什麼? 怎麼用? — 統整、專案結構(5/5)

itsems
itsems_frontend
Published in
7 min readMay 10, 2020
全系列共五篇:
一、[Vue] Vuex 是什麼? 怎麼用? — State、Mutations (1/5)
二、[Vue] Vuex 是什麼? 怎麼用? — Actions (2/5)
三、[Vue] Vuex 是什麼? 怎麼用? — Getters (3/5)
四、[Vue] Vuex 是什麼? 怎麼用? — Modules (4/5)
五、[Vue] Vuex 是什麼? 怎麼用? — 統整、專案結構(5/5)
Outline:
1. 總結 State、Mutations、Actions、Getters
2. 帶入參數與呼叫方法
3. 專案結構

總結 State、Mutations、Actions、Getters

其實 Vuex 有一點像是一個全域的 component,大家可以拿他的資料,call 他出來用,當然是不一樣的東西,但是用很像 component 的角度來看,可能會比較好記憶一點。

State 就像是 data,Actions + Mutations 就像是 methods,Getters 就像是 computed:

但是 state 在 component 裡面是要放在 computed 裡面 return 回來的ㄛ

複習一下官網的圖:

一句話總結 Vuex 動作流程的話,可以說是:

Component 使用 Dispatch 呼叫 Actions,讓 Actions 發出 commit 觸發 Mutations 去修改 State 的資料。

Dispatch 是呼叫 ActionsCommit 是呼叫 Mutations,很重要不能搞混了。

帶入參數及呼叫方法

另外在前面三篇都有講到 State、Mutations、Actions、Getters 各自可以帶入的參數和呼叫的方式,這邊也整理一下:

State

定義:

/store.js

使用:

/app.vue

mapState

定義:

/store.js

使用:

/app.vue

Getters

可帶參數:state, getters

定義:

/store.js

使用:

帶上參數 getters 表示可以呼叫別的 getters 來用:

定義:

/store.js

使用:

/app.vue

mapGetters

(定義跟上面的 store.js 一樣,就不重複了,主要差在 component 呼叫的時候)

使用:

Mutations

可帶參數: state, payload

使用:

/app.vue

methods: {
reverse() {
this.$store.commit("Loaded");
},
}

With Payload:

通常 payload 可以用物件表示,就能更具描述性,但是要記得在 mutations 運算時裡面的 payload 要加上參數物件的 key,舉例:

/app.vue

store.commit('addCounts', {
amount: 10
}
)

/store.js

mutations: {
addCounts (state, payload) {
state.count += payload.amount
}
}

所以帶上 payload 的呼叫可以這樣使用:

this.$store.commit("addTimes",10);this.$store.commit({
type: "addTimes",
count: 2
}
);

物件的 type 是必要的,其他的則可以隨意

mapMutations:

使用 mapMutations 的話,就要把 payload 直接帶入 template 中:

<button @click="addTimes(2)">addTimes</button>

** mutations 一定只能執行同步,actions 才能執行非同步

Actions

可帶參數:context: { commit, dispatch, state, getters, rootState, roorGetters }, payload

Actions 可以執行非同步,Mutations 不可以,意思是

Axios 要在 Actions 裡面做,不可以在 Mutations 裡面做

定義:

/store.js

ClickedActions({ commit }, payload) {
commit('addTimes', payload)
}

使用:

/app.vue

methods: {
add() {
this.$store.dispatch("ClickedActions",2);
}
}

以上,就是大概整理了全部的參數和使用方法,接下來,該怎麼應用在專案上呢?

專案結構

Vuex 並不會嚴格限制專案的結構,但是有三大原則一定要遵守

  1. APP 層級的狀態要在 state 集中管理
APP 層級的狀態的意思是指不會因為跨組件改變的狀態,如登入者資訊、購物車清單...等,會因為跨組件改變的狀態可能是下拉式選單的開關狀態、商品列表...等

2. 唯一改變 state 的方式只有 mutations,而且是同步執行

3. actions 才可以執行非同步

官網這邊給了一個結構的範例參考:

├── index.html
├── main.js
├── api
│ └── ... // 放後端 api
├── components // 頁面們
│ ├── App.vue
│ └── ...
└── store
├── index.js // 在這邊註冊modules並export store
├── actions.js // 跨組件的actions
├── mutations.js // 跨組件的mutations
└── modules
├── cart.js // 購物車 module
└── products.js // 商品 module

也有一個購物車範例給大家參考

Vuex 的介紹與學習筆記目前就告一段落了,如果有任何地方遺漏或是疏失,希望可以不吝嗇給予指教,感恩感恩 🙇🙇🙇

--

--

itsems
itsems_frontend

Stay Close to Anything that Makes You Glad You are Alive.