index.js
/*
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
/*
狀態對象
*/
export default {
latitude: 40.10038, // 緯度
longitude: 116.36867, // 經度
address: {}, //地址相關信息對象
categorys: [], // 食品分類數組
shops: [], // 商家數組
userInfo: {}, // 用戶信息
goods: [], // 商品列表
ratings: [], // 商家評價列表
info: {}, // 商家信息
cartFoods: [], // 購物車中食物的列表
searchShops: [], // 搜索得到的商家列表
}
getters.js
/*
包含多個基於state的getter計算屬性的對象
*/
export default {
totalCount (state) {
return state.cartFoods.reduce((preTotal, food) => preTotal + food.count , 0)
},
totalPrice (state) {
return state.cartFoods.reduce((preTotal, food) => preTotal + food.count*food.price , 0)
},
positiveSize (state) {
return state.ratings.reduce((preTotal, rating) => preTotal + (rating.rateType===0?1:0) , 0)
}
}
mutation-types.js
/*
包含n個mutation的type名稱常量
*/
export const RECEIVE_ADDRESS = 'receive_address' // 接收地址
export const RECEIVE_CATEGORYS = 'receive_categorys' // 接收食品分類數組
export const RECEIVE_SHOPS = 'receive_shops' // 接收商家數組
export const RECEIVE_USER_INFO = 'receive_user_info' // 接收用戶信息
export const RESET_USER_INFO = 'reset_user_info' // 重置用戶信息
export const RECEIVE_GOODS = 'receive_goods' // 接收商品數組
export const RECEIVE_RATINGS = 'receive_ratings' // 接收商家評價數組
export const RECEIVE_INFO = 'receive_info' // 接收商家信息
export const INCREMENT_FOOD_COUNT = 'increment_food_count' // 增加food中的count
export const DECREMENT_FOOD_COUNT = 'decrement_food_count' // 減少food中的count
export const CLEAR_CART = 'clear_cart' // 清空購物車
export const RECEIVE_SEARCH_SHOPS = 'receive_search_shops' // 接收搜索的商家數組
mutations.js
/*
直接更新state的多個方法的對象
*/
import Vue from 'vue'
import {
RECEIVE_ADDRESS,
RECEIVE_CATEGORYS,
RECEIVE_SHOPS,
RECEIVE_USER_INFO,
RESET_USER_INFO,
RECEIVE_INFO,
RECEIVE_RATINGS,
RECEIVE_GOODS,
INCREMENT_FOOD_COUNT,
DECREMENT_FOOD_COUNT,
CLEAR_CART,
RECEIVE_SEARCH_SHOPS
} from './mutation-types'
export default {
[RECEIVE_ADDRESS] (state, {address}) {
state.address = address
},
[RECEIVE_CATEGORYS] (state, {categorys}) {
state.categorys = categorys
},
[RECEIVE_SHOPS] (state, {shops}) {
state.shops = shops
},
[RECEIVE_USER_INFO] (state, {userInfo}) {
state.userInfo = userInfo
},
[RESET_USER_INFO] (state) {
state.userInfo = {}
},
[RECEIVE_INFO](state, {info}) {
state.info = info
},
[RECEIVE_RATINGS](state, {ratings}) {
state.ratings = ratings
},
[RECEIVE_GOODS](state, {goods}) {
state.goods = goods
},
[INCREMENT_FOOD_COUNT](state, {food}) {
if(!food.count) { // 第一次增加
// food.count = 1 // 新增屬性(沒有數據綁定)
/*
對象
屬性名
屬性值
*/
Vue.set(food, 'count', 1) // 讓新增的屬性也有數據綁定
// 將food添加到cartFoods中
state.cartFoods.push(food)
} else {
food.count++
}
},
[DECREMENT_FOOD_COUNT](state, {food}) {
if(food.count) {// 只有有值纔去減
food.count--
if(food.count===0) {
// 將food從cartFoods中移除
state.cartFoods.splice(state.cartFoods.indexOf(food), 1)
}
}
},
[CLEAR_CART](state) {
// 清除food中的count
state.cartFoods.forEach(food => food.count = 0)
// 移除購物車中所有購物項
state.cartFoods = []
},
[RECEIVE_SEARCH_SHOPS](state, {searchShops}) {
state.searchShops = searchShops
},
}
actions.js
/*
通過mutation間接更新state的多個方法的對象
*/
import {
RECEIVE_ADDRESS,
RECEIVE_CATEGORYS,
RECEIVE_SHOPS,
RECEIVE_USER_INFO,
RESET_USER_INFO,
RECEIVE_GOODS,
RECEIVE_RATINGS,
RECEIVE_INFO,
INCREMENT_FOOD_COUNT,
DECREMENT_FOOD_COUNT,
CLEAR_CART,
RECEIVE_SEARCH_SHOPS
} from './mutation-types'
import {
reqAddress,
reqFoodCategorys,
reqShops,
reqUserInfo,
reqLogout,
reqShopRatings,
reqShopGoods,
reqShopInfo,
reqSearchShop
} 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})
}
},
// 同步記錄用戶信息
recordUser({commit}, userInfo) {
commit(RECEIVE_USER_INFO, {userInfo})
},
// 異步獲取用戶信息
async getUserInfo({commit}) {
const result = await reqUserInfo()
if (result.code === 0) {
const userInfo = result.data
commit(RECEIVE_USER_INFO, {userInfo})
}
},
// 異步登出
async logout({commit}) {
const result = await reqLogout()
if (result.code === 0) {
commit(RESET_USER_INFO)
}
},
// 異步獲取商家信息
async getShopInfo({commit}) {
const result = await reqShopInfo()
if (result.code === 0) {
const info = result.data
commit(RECEIVE_INFO, {info})
}
},
// 異步獲取商家評價列表
async getShopRatings({commit}, callback) {
const result = await reqShopRatings()
if (result.code === 0) {
const ratings = result.data
commit(RECEIVE_RATINGS, {ratings})
// 數據更新了, 通知一下組件
callback && callback()
}
},
// 異步獲取商家商品列表
async getShopGoods({commit}, callback) {
const result = await reqShopGoods()
if (result.code === 0) {
const goods = result.data
commit(RECEIVE_GOODS, {goods})
// 數據更新了, 通知一下組件
callback && callback()
}
},
// 同步更新food中的count值
updateFoodCount({commit}, {isAdd, food}) {
if (isAdd) {
commit(INCREMENT_FOOD_COUNT, {food})
} else {
commit(DECREMENT_FOOD_COUNT, {food})
}
},
// 同步清空購物車
clearCart({commit}) {
commit(CLEAR_CART)
},
// 異步獲取商家商品列表
async searchShops({commit, state}, keyword) {
const geohash = state.latitude + ',' + state.longitude
const result = await reqSearchShop(geohash, keyword)
if (result.code === 0) {
const searchShops = result.data
commit(RECEIVE_SEARCH_SHOPS, {searchShops})
}
},
}