餐厅食品页面shop.vue
点击某个餐厅进入餐厅食品页面。简单的说这个页面分三个区域,分别是头部、导航、内容。
头部
头部主要讲当前餐厅的基本信息,如商家名称头像、商家配送方式及费用、商家公告、商家优惠活动。
获取餐厅的详细信息
首先要做的就是获取餐厅的详细信息。使用axios请求数据。
shop.js代码如下:
|
|
上面代码发现获取餐厅详情的url时需要latitude
和longitude
两个参数,我通过vuex管理机制对这两个参数进行赋值操作继而获取到餐厅详情。
shop.vue
|
|
获取到餐厅详情shopDetailData
,接着就可以对dom填充数据。
餐厅头像: <img :src="getImgPath(img)" class="header_cover_img">
。
餐厅名称:<h4 class="description_title ellipsis"></h4>
餐厅配送信息:<p class="description_text">商家配送/分钟送达/配送费¥</p>
餐厅公告:<p class="description_promotion ellipsis">公告:</p>
。这里我使用计算函数promotionInfo
对餐厅公告进行判断操作。
|
|
商家活动:首先判断商家详情中是否有商家活动v-if="shopDetailData.activities.length"
也就是判断它的length,创建个showActivitiesFun
点击事件展示商家活动的具体信息,具体信息包括优惠信息和商家公告。定义数据showActivities
表示是否显示活动详情。
|
|
展示商家活动:遍历优惠信息获取每个item <li v-for="item in shopDetailData.activities" :key="item.id">
,使用transition添加动画效果,之前已经讲过,这里就不再复述。判断是否显示v-if="showActivities"
|
|
代码用到v-if比较频繁,在这说下v-show和v-if的区别
|
|
完整的代码这里就不贴了,见代码shop.vue组件。
页面渲染:
导航
导航分为商品和评价。点击商品时会显示食品列表,点击评价显示评价相关信息。data中定义changeShowType
表示切换显示商品或评价,默认为food,创建点击事件使其点击商品时对应的food,点击评价则对应的是rating。
|
|
:class='{activity_show: changeShowType =="food"}'
绑定当前显示为food。vue绑定class的使用方法,通过绑定一个class变量来直接操作,并且这里的逻辑会跟js代码里面对应。
内容
内容区域分为菜单列表、食品列表、购物车。
菜单列表
菜单列表就是食品分类,每个分类会有对应的食品列表。话不多说,先请求数据。
shop.js
|
|
shop.vue
|
|
data钩子中定义数据menuList
,表示菜单分类列表,得到数据后填充dom。
|
|
v-for="(item,index) in menuList" :key="index"
遍历出每个菜单分类。
<img :src="getImgPath(item.icon_url)" v-if="item.icon_url">
要有个判断icon_url是否存在。
<span class="category_num" v-if="categoryNum[index]"></span>
菜单类型右上角已加入购物车的数量,同时也需要判断是否有值。data中定义categoryNum
,表示菜单类型右上角已加入购物车的数量。
食品列表
食品列表区域的最上方显示的是当前菜单的标题详情。
|
|
在食品列表区域的左上角有个省略号的图标,是显示当前菜单的标题详情,这需要个点击事件,点击后才会显示内容。先在data中定义titleDetailIndex
默认为null
,表示点击展示列表头部详情。创建点击事件showTitleDetail(index)
来控制显示列表标题详情提示。
|
|
效果如图:
在遍历过menuList的基础上,再对每个item的item.foods进行遍历,获得每个food。
v-for="(food, foodIndex) in item.foods" :key="foodIndex"
对food设置路由,点击某个food就直接进入下个页面。
<router-link :to="{path: 'shop/foodDetail'}" tag="div" class="menu_detail_link"></router-link>
food头像设置:<img :src="getImgPath(food.image_path)">
food名称:<strong class="description_foodName"></strong>
attributes:需要先判断attributes是否存在v-if="food.attributes.length"
,如果有对它进行遍历<li v-for="(attribute, foodIndex) in food.attributes" :key="foodIndex">
,同时设置它的显示样式 :style="{color: '#' + attribute.icon_color,borderColor:'#' +attribute.icon_color}"
,绑定当前class显示:class="{attribute_new: attribute.icon_name == '新'}"
。
food描述:<p class="food_description_content"></p>
food月销售量和好评率:<span>月售份</span> <span>好评率%</span>
food价格:<span>¥</span>
food规格:<span v-if="food.specifications.length">起</span>
完整代码太长就不贴了,上面每个dom显示数据都有讲到,具体代码见shop.vue组件。
完整效果如图: