---
# System prepended metadata

title: 1-1.Vue外送平台App-(使用Vuex狀態管理模式)

---

# 1-1.Vue外送平台App-(使用Vuex狀態管理模式)
* Vuex:是全局變數，任何組件都可以用
 
### 簡要介紹vuex原理
![](https://i.imgur.com/cG8dJDu.png)
>  簡要介紹各模組在流程中的主要功能：
* Vue Components：Vue元件。HTML頁面上，負責接收使用者操作等互動行為，執行dispatch方法觸發對應action進行迴應。
* dispatch：操作行為觸發方法，是唯一能執行action的方法。
* actions：操作行為處理模組,由元件中的$store.dispatch('action 名稱', data1)來觸發。然後由commit()來觸發mutation的呼叫 , 間接更新 state。負責處理Vue Components接收到的所有互動行為。包含同步/非同步操作，支援多個同名方法，按照註冊的順序依次觸發。向後臺API請求的操作就在這個模組中進行，包括觸發其他action以及提交mutation的操作。該模組提供了Promise的封裝，以支援action的鏈式觸發。
* commit：狀態改變提交操作方法。對mutation進行提交，是唯一能執行mutation的方法。
* mutations：狀態改變操作方法，由actions中的commit('mutation 名稱')來觸發。是Vuex修改state的唯一推薦方法。該方法只能進行同步操作，且方法名只能全域性唯一。操作之中會有一些hook暴露出來，以進行state的監控等。
* state：頁面狀態管理容器物件。集中儲存Vue components中data物件的零散資料，全域性唯一，以進行統一的狀態管理。頁面顯示所需的資料從該物件中進行讀取，利用Vue的細粒度資料響應機制來進行高效的狀態更新。
* getters：state物件讀取方法。圖中沒有單獨列出該模組，應該被包含在了render中，Vue Components通過該方法讀取全域性state物件。
### 創建所需js
![](https://i.imgur.com/3KS38kI.png)
index:
Vuex最核心的管理對象store

state:
狀態對象

getters:
包含多個，基於state的getters計算屬性的對象

actions:
1.通過mutations間接更新state.js的多個方法對象
2.從後臺交互的異步(ajax)api資料回到給actions

mutation-types:
包含n個mutations的type常量名稱

mutations:
直接更新state多個方法的對象

---
### index.js /*vuex最核心的管理*/
* vuex最核心的管理對象store
* 先把整體收容近來
```htmlmixed=
/*Vuex最核心的管理對象store*/
import Vue from 'vue';
import Vuex from 'vuex';
//引入我們自定義的模塊
import state from './state';
import mutations from './mutations';
import actions from './actions';
import getters from './getters';

//聲明使用的三方插件
Vue.use(Vuex);

export default new Vuex.Store({
    //配置對象
    state,
    mutations,
    actions,
    getters
})
```
###  state.js /*狀態對象*/
*  先把需要管理的狀態數據一一列出來
* 此圖有三個地方的狀態(state)數據需要管理
Miste(首頁圖)
 ![](https://i.imgur.com/uS2I51A.png)
```htmlmixed= 
//名稱必須與街口api/index.js名稱一樣

//要先把需要的結構初始化
export default {
    latitude:'40.10038',//緯度
    longitude:'116.36867',//經度
    address:{},//地址
    categorys:[],//分類數組
    shops:[] //商家數組
}

```
### 3. mutation-types.js 
>在state.js資料夾中這三個值會從後台獲取返回數據
，所以必須重新附於新值
* address:{},//地址
* categorys:[],//分類數組
* shops:[] //商家數組

```htmlmixed=
/*包含n個mutations的type常量名稱*/

export const RECEIVE_ADDRESS = 'receive_address' //接收地址對象
export const RECEIVE_CATEGORYS = 'receive_categorys'//接收分類數組
export const RECEIVE_SHOPS = 'receive_shops'//接收商家數組
```
### 4.mutation.js
```htmlmixed=
/*直接更新state多個方法的對象*/

import {
    RECEIVE_ADDRESS,
    RECEIVE_CATEGORYS,
    RECEIVE_SHOPS
} from './mutation-types';

export default {
    //actions跟mutations交互的是一個包含數據的對象"{address}"
    [RECEIVE_ADDRESS](state, {address}){
        state.address = address
    },
    [RECEIVE_CATEGORYS](state, {categorys}){
        state.categorys = categorys
    },
    [RECEIVE_SHOPS](state ,{shops}){
        state.shops = shops
    },

}
```
### 6.actions.js
```htmlmixed=
/*
1.通過mutations間接更新state.js的多個方法對象
2.從後臺交互的異步(ajax)api資料回到給actions
*/

import {
    RECEIVE_ADDRESS,
    RECEIVE_CATEGORYS,
    RECEIVE_SHOPS
} from './mutation-types';
import {
    reqAddress,
    reqFoodCategorys,
    reqShops
} from '../api'


export default {
    //.異步獲取地址
    async getAddress({ commit, state }) {
        //發送異步ajax請求
        const geohash = state.latitude + ',' + state.longitude
        const result = await reqAddress(geohash)
        //提交一個mutation
        if (result.code === 0) {
            const address = result.data
            commit(RECEIVE_ADDRESS, { address })
        }
    },
    //.異步獲取分類
    async getCategorys({ commit }) {
        //發送異步ajax請求
        const result = await reqFoodCategorys()
        //提交一個mutation
        if (result.code === 0) {
            const categorys = result.data
            commit(RECEIVE_CATEGORYS, { categorys })
        }
    },
    //.異步獲取商家列
    async getShops({ commit, state }) {
        //發送異步ajax請求
        const { longitude,latitude } = state
        const result = await reqShops({ longitude, latitude })
        //提交一個mutation
        if (result.code === 0) {
            const shops = result.data
            commit(RECEIVE_SHOPS, { shops })
        }
    }

}
```
### getters.js



### 註冊store
>main.js
```htmlmixed=
import store from './store';

new Vue({
  el: '#app',
  render: h => h(App),
  store, //使用上vuex
})

```






