vue外卖十四:商家详情:用mockjs模拟api数据接口

45 篇文章 2 订阅

1)安装mockjs

官网:mockjs.com
文档:https://github.com/nuysoft/Mock/wiki/Getting-Started
http://mockjs.com/examples.html

cnpm install mockjs --save

2)创建目录/文件

2.1使用mockjs形成数据src/mock/mockServer.js

/*
使用mockjs提供mock数据接口
 */
import Mock from 'mockjs'
import data from './data.json' //引入数据

// 返回goods的接口
Mock.mock('/goods', {code:0, data: data.goods})
// 返回ratings的接口
Mock.mock('/ratings', {code:0, data: data.ratings})
// 返回info的接口
Mock.mock('/info', {code:0, data: data.info})

// export default ???  不需要向外暴露任何数据, 只需要保存能执行即可

2.2引入,用于打包编译src/main.js

// 入口文件
import Vue from 'vue'
import App from './App'
import router from './router/index.js'
import store from './store' //引入vuex管理状态
import {Button} from 'mint-ui'
import './mock/mockServer' // 【1】加载mockServer即可
// 注册全局组件
Vue.component(Button.name, Button)

// 2.0新版本es6写法
new Vue({
	el: '#app',
	render: h => h(App),
	router,
	store
})

/*
 //1.0版写法
 new Vue({
  el: '#app',
  components: { App },
  template: '<App/>'
})*/

2.3mock/data.json

据页面设计稿写出数据结构,一层示例
{
  "info": {
    "name": "嘉禾一品(温都水城)",
    "description": "硅谷专送",
    "deliveryTime": 28,
    "score": 4.2,
    "serviceScore": 4.1,
    "foodScore": 4.3,
    "rankRate": 69.2,
    "minPrice": 20,
    "deliveryPrice": 4,
    "ratingCount": 24,
    "sellCount": 90,
    "distance": "1000m",
    "bulletin": "是以粥为特色的中式营养快餐,自2004年10月18日创立“嘉和一品”品牌至今,不断优化管理,积极创新,立足于“贴近百姓生活,服务千家万户”",
    "supports": [
    	{
        "type": 0,
        "name": "首单",
        "content": "新用户下单立减17元(不与其它活动同享)"
      },
    ],
    "category": "包子粥店, 简餐",
    "phone": "18501083744",
    "address": "北京市丰台区太平桥44号",
    "workTime": "09:35-24:00"
  },
  "goods": [
    {
      "name": "优惠",
      "icon": "https://fuss10.elemecdn.com/b/91/8cf4f67e0e8223931cd595dc932fepng.png",
      "foods": [
        {
          "name": "南瓜粥",
          "price": 9,
          "oldPrice": "",
          "description": "甜粥",
          "sellCount": 91,
          "rating": 100,
          "info": "主、辅料:水、大米、南瓜、冰糖等",
          "ratings": [
            {
              "username": "3******c",
              "rateTime": 1469281964000,
              "rateType": 0,
              "text": "很喜欢的粥",
              "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png"
            },
           ]
	]
  "ratings": [
    {
      "username": "3******c",
      "rateTime": 1469281964000,
      "deliveryTime": 30,
      "score": 5,
      "rateType": 0,
      "text": "不错,粥很好喝,我经常吃这一家,非常赞,以后也会常来吃,强烈推荐.",
      "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png",
      "recommend": [
        "南瓜粥",
        "皮蛋瘦肉粥",
        "扁豆焖面",
        "娃娃菜炖豆腐",
        "牛肉馅饼"
      ]
    },
  ]
}

3)ajax请求 api/index.js

//获取mockjs模拟的后端商家数据
export const reqShopGoods=()=>ajax('/shop_goods') //食物列表 不加api,此请求不从代理走
export const reqShopRating=()=>ajax('/shop_rating') //评价列表
export const reqShopInfo=()=>ajax('/shop_info') //商家信息

4)vuex状态相关store/

4.0 state.js 状态保存

export default{
  ...略过
  goods: [], // 【1】商品列表
  ratings: [], // 【2】商家评价列表
  info: {}, // 【3】商家信息
}

4.1 mutation-types.js 改变类型-方便维护

export const RECEIVE_GOODS = 'receive_goods' // 【1】接收商品数组
export const RECEIVE_RATINGS = 'receive_ratings' // 【2】接收商家评价数组
export const RECEIVE_INFO = 'receive_info' // 【3】接收商家信息

4.3 mutations.js 改变状态

import {
  RECEIVE_ADDRESS,
  RECEIVE_CATEGORYS,
  RECEIVE_SHOPS,
  RECEIVE_USER_INFO,
  RESET_USER_INFO,
//【1】商家相关以下3个
  RECEIVE_INFO,
  RECEIVE_RATINGS,
  RECEIVE_GOODS,
} from './mutation-types.js'

export default{
	//中括号为计算属性名es6语法:作用是动态的写出当前函数名,方便后期维护
	...
	//【2】商家相关以下三个
  [RECEIVE_INFO](state,{info}){state.info=info},
  [RECEIVE_RATINGS](state,{rating}){state.rating=rating},
  [RECEIVE_GOODS](state,{goods}){state.goods=goods}
}

4.4 actions.js 触发mutation

知识点:action的 callback参数
async getShopRatings({commit}, callback) {

// 【新知识点】数据更新了, 通知一下组件
callback && callback()
},

// 控制mutations
import {
  RECEIVE_ADDRESS,
  RECEIVE_CATEGORYS,
  RECEIVE_SHOPS,
  RECEIVE_USER_INFO,
  RESET_USER_INFO, //退出mutaion-types
  RECEIVE_INFO,//【1】以下3个商家相关
  RECEIVE_RATINGS,
  RECEIVE_GOODS,
} from './mutation-types.js'
import {
  reqAddress,
  reqFoodCategorys,
  reqShops,
  reqUserInfo, //获取session的用户信息
  reqLogout, //退出登录
  reqShopGoods,// 【2】以下3个商家相关请求
  reqShopRating,
  reqShopInfo,
} from '../api/index.js'

export default{
	//获取地址用于改变状态
	async getAddress({commit,state}){
		//构造纬,经度参数用于请求
		const geohash=state.latitude+','+state.longitude
		const result=await reqAddress(geohash)
		// 提交一个状态改变
		if(result.code===0){
			const address=result.data
			//提交mutation,commit(对象名,对象值)
			commit(RECEIVE_ADDRESS,{address})
		}
	},

	...略过

	//【3】商家信息
	async getShopInfo({commit}){
		const result=await reqShopInfo()
		if(result.code==0){	
			const info=result.data
			commit(RECEIVE_INFO,{info})
		}
	},

	// 【4】异步获取商家评价列表
  async getShopRatings({commit}, callback) {
    const result = await reqShopRatings()
    if (result.code === 0) {
      const ratings = result.data
      commit(RECEIVE_RATINGS, {ratings})
      // 【新知识点】数据更新了, 通知一下组件
      callback && callback()
    }
  },

  //【5】 异步获取商家商品列表
  async getShopGoods({commit}, callback) {
    const result = await reqShopGoods()
    if (result.code === 0) {
      const goods = result.data
      commit(RECEIVE_GOODS, {goods})
      // 数据更新了, 通知一下组件
      callback && callback()
    }
  },
	
}

5)src/pages/shop/shop.vue 用vuex的action发起ajax请求并触发mutation,再把数据放入state中

<script>
	import ShopHeader from '../../components/ShopHeader/index.vue'
	export default{
		mounted(){
			//【1】调用action发ajax请求,并放入vuex
			//getShopInfo源自actions.js函数名
			this.$store.dispatch('getShopInfo')
		},
		components:{...略过}
	}
</script>

效果:http://localhost:8080/#/shop/goods

查看vue开发者插件中info信息:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值