❤ 项目源码 ❤
GitHub地址:https://github.com/Umbrella001/mtapp

文章目录

  • 一、完成效果图
    • ① 面包屑的使用
    • ② 设计多级分类的DOM结构
    • ③ 产品卡片显示数据格式:
    • ④ 如何使用第三方插件库 》 高德地图API插件
    • ⑤ 将详情页设计的所用到的组件整合(page > product.vue),学习如何组合...

一、完成效果图

① 面包屑的使用

格式:<当前城市定位>美团 > <当前城市定位><所在城市地区名>

HTML:使用E-UI的面包屑页面代码
https://element.eleme.cn/#/zh-CN/component/breadcrumb

这种有静态属性的拼接,为了避免浏览器重绘闪动,使用ssr去服务端渲染;

  <div class="m-crumbs"><el-breadcrumb separator=">"><el-breadcrumb-item :to="{ path: '/' }">{{ $store.state.geo.position.city.replace('市','') }}美团</el-breadcrumb-item><el-breadcrumb-item><a href="/">{{ $store.state.geo.position.city.replace('市','') }}{{ decodeURIComponent(keyword) }}</a></el-breadcrumb-item></el-breadcrumb></div>
② 设计多级分类的DOM结构

catagroy.vue:
总列表通过上下两部分去循环,此时是不带弹出层的,这个当成组件开发iselect.vue

    <dl class="classic"><dt>分类</dt><dt>全部</dt><ddv-for="(item,idx) in types":key="idx"><iselect:name="item.type":list="item.module"/></dd></dl><dl class="classic"><dt>区域</dt><dt>全部</dt><ddv-for="(item,idx) in areas":key="idx"><iselect:name="item.type":list="item.module"/></dd></dl>

iselect.vue :
注意接收的数据是hover时对应的数据头,在请求

<template><div class="m-product-select"><dl class="tab"><dt>{{ name }}<i class="el-icon-arrow-down el-icon--right"/></dt><dd><h3>{{ name }}</h3><spanv-for="(item,idx) in list":key="idx">{{ item }}</span></dd></dl></div>
</template>// javascript
export default {props: {name: {type:String,default:''},list: {type: Array,default(){return []}}}
}
③ 产品卡片显示数据格式:

先循环每一个产品整体卡 list.vue > Item

  <div class="m-products-list"><dl><ddv-for="item in nav":key="item.name":class="[item.name,item.active?'s-nav-active':'']"@click="navSelect">{{ item.txt }}</dd></dl><ul><Itemv-for="(item,idx) in list":key="idx":meta="item"/></ul></div>

产品卡内部DOM结构 product.vue

》评分Rate使用E-UI的评分系统

<template><dl class="s-item"><dt><img:src="meta.img"alt="商品图片"></dt><dd><h3><nuxt-link :to="{path:'detail',query:{keyword:meta.name,type:meta.module}}">{{ meta.name }}</nuxt-link></h3><el-ratev-model="meta.rate":colors="['#ff9900', '#ff9900', '#FF9900']"disabled/><spanv-if="meta.rate>4"class="s-item-comment">很好</span><spanv-else-if="meta.rate>3"class="s-item-comment">一般</span><spanv-elseclass="s-item-comment">很差</span><span class="s-item-value">{{ meta.rate }}分</span><span class="s-item-comment-total">{{ meta.comment }}人评论</span><p><span class="s-item-type">{{ meta.type }}</span><span class="s-item-addr">{{ meta.addr }}</span></p><p><em class="s-item-price">¥{{ meta.price }}起</em><b>{{ meta.status }}</b></p><ul><!-- <li><span class="detail-type">门票</span>{{meta.ticket}}</li><li><span class="detail-type">跟团</span>{{meta.group}}</li> --><li v-if="meta.scene&&meta.scene.length"><span class="detail-type">景酒</span>{{ meta.scene }}</li><li v-else><span class="detail-type">景酒</span>暂无描述</li></ul></dd></dl>
</template><script>
export default {props: {meta: {type:Object,default(){return {}}}}
}
</script>

注意:

注意这里中使用的数据结构就是是对象,但之前不是说循环必须使用数组Array吗?但是这里注意,我们在 list.vue 的确是循环list就是数组,但是它里面的数据,是分成另一个组件去开发,所以这里传过去的,当然可以是对象,也务必是对象,为什么? 因为前后端数据格式都不一样,前端要有自己的对象数据,这样即使后端偷偷该数据,我们也只是改个拿数据的地方,而并不需要改动HTML的地方,明白我意思没,前端要漫步映射后端的字段

④ 如何使用第三方插件库 》 高德地图API插件

百度搜索高德地图开放平台 https://lbs.amap.com/ → 成功注册后
→ 点击产品介绍下的地图
→ 移动到页面底部选择【javascript API】
→ 点击控制台,进入【应用管理】,获取key值

→ 找到javascript的【地图控件】参考文档做即可(注意这里引入地图控件js的话在【准备】,用框架的话就使用异步导入的方式),最终的代码差不多为这样:

<template><div:id="id":style="{width:width+'px',height:height+'px',margin:'34px auto'}"class="m-map"/>
</template><script>
export default {props: {width: {type:Number,default:300},height: {type:Number,default:300},point: {type:Array,default(){return [116.46,39.92]}}},data() {return {id: `map`,key: '2fc3f4c37d30bd0b4cdecb85ed8c249f'}},watch: {point: function (val, old) {this.map.setCenter(val)this.marker.setPosition(val)}},mounted() {let self = thisself.id = `map${Math.random().toString().slice(4, 6)}`window.onmaploaded = () => {let map = new window.AMap.Map(self.id, {resizeEnable: true,zoom: 11,center: self.point})self.map = mapwindow.AMap.plugin('AMap.ToolBar', () => {let toolbar = new window.AMap.ToolBar()map.addControl(toolbar)let marker = new window.AMap.Marker({icon: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png',position: self.point})self.marker = markermarker.setMap(map)})}const url = `https://webapi.amap.com/maps?v=1.4.10&key=${self.key}&callback=onmaploaded`let jsapi = document.createElement('script')jsapi.charset = 'utf-8'jsapi.src = urldocument.head.appendChild(jsapi)},
}
</script>

关于地图相关控件,差不多按照上面的格式配合文档写就行
1.既然图片提出来做单独组件的话,那就不要定死数据,比如地图DOM节点的宽高和id名就应该使用动态数据

⑤ 将详情页设计的所用到的组件整合(page > product.vue),学习如何组合…
<template><el-row class="page-product"><el-col :span="19"><crumbs :keyword="keyword"/><categroy:types="types":areas="areas"/><list :list="list"/></el-col><el-col :span="5"><amapv-if="point.length":width="230":height="290":point="point"/></el-col></el-row></template><script>
import Crumbs from '@/components/products/crumbs.vue'
import Categroy from '@/components/products/categroy.vue'
import List from '@/components/products/list.vue'
import Amap from '@/components/public/map.vue'
export default {components:{Crumbs,Categroy,List,Amap},data(){return {list:[],types:[],areas:[],keyword:'',point:[]}},async asyncData(ctx){let keyword = ctx.query.keywordlet city = ctx.store.state.geo.position.citylet {status,data:{count,pois}} = await ctx.$axios.get('/search/resultsByKeywords',{params:{keyword,city}})let {status:status2,data:{areas,types}} = await ctx.$axios.get('/categroy/crumbs',{params:{city}})if(status===200&&count>0&&status2===200){return {list: pois.filter(item=>item.photos.length).map(item=>{return {type: item.type,img: item.photos[0].url,name: item.name,comment: Math.floor(Math.random()*10000),rate: Number(item.biz_ext.rating),price: Number(item.biz_ext.cost),scene: item.tag,tel: item.tel,status: '可订明日',location: item.location,module: item.type.split(';')[0]}}),keyword,areas: areas.filter(item=>item.type!=='').slice(0,5),types: types.filter(item=>item.type!=='').slice(0,5),point: (pois.find(item=>item.location).location||'').split(',')}}}
}
</script>

总结:
有没有发现入口文件,发了主要的请求(对比page文件夹下的changeCity.vueproducts.vue),他们各自特点,前者是子组件中自己发送请求,自给自足,最后总入口文件 changeCity.vue 引入即可;后者则是入口组件发送请求,然后发放个对应的组件,也就是父传子的思想,而各自组件就接收 products.vue 传递过来的数据

❤ 项目源码 ❤
GitHub地址:https://github.com/Umbrella001/mtapp

美团项目 --- 产品列表页 8相关推荐

  1. 商城项目商品列表页的渲染实现(含动图)

    有了v-for循环,渲染商品列表简直不要太方便了,以前写一个商品列表页要一天,现在只需要几分钟,除了模拟数据会耗一点时间.这里可以了解下Mock模拟数据,它可使前端工程师独立于后端进行开发,在前端可以 ...

  2. vue项目实现列表页-详情页返回不刷新,再点其他菜单项返回刷新的需求

    问题背景:有时候一些列表会有一些跳转的需求,比如跳到详情页.或者是其他相关的页面(比如跳到用户列表去查看用户的相关信息)等,此时再返回列表页,列表页会刷新重置.目前需求就是需要改成如下情况: 问题1. ...

  3. Vue项目 课程列表页 跳转 课程详情页 跳转 视频播放页

    课程列表页Course.vue - Coursemain.vue 跳转至 课程详情页 <!-- 课程列表 --><div class="container-body&quo ...

  4. 产品列表页分类筛选、排序的算法实现(PHP)

    一.简单的单条件查询 工作都是从简单的开始,先从最简单的单表查询开始,这个一般用在首页以及一些比较独立的页面,只需要查找几个符合条件的产品展示出来即可,可以使用分页或者不使用分页.下面这个是产品控制器 ...

  5. html产品列表页的设计,产品列表页.html

    丹青诺和 if (!(/msie [6|7|8|9]/i.test(navigator.userAgent))){ new WOW().init(); }; 全量收集,全效还田 丹青粪肥资源化利用模式 ...

  6. 微信小程序实现美团goods商品列表页开发

    1.使用的组件 scroll-view和wx.createSelectorQuery()方法 2.代码图 js代码 Page({/*** 页面的初始数据*/data: {currentIndex:0, ...

  7. bootstrap3 商品列表_用一下午写了一个仿美团app产品列表,用weui(bootstrap可去掉)写成...

    // 静态路径用的cdn,直接可用.iconfont图标本地,自己下载即可 附近 body{font-family: "微软雅黑";background-color: #eeeee ...

  8. 仿美团app产品列表,用weui(bootstrap可去掉)写成

    // 静态路径用的cdn,直接可用.iconfont图标本地,自己下载即可<!DOCTYPE html> <html> <head lang="en" ...

  9. Magento后台产品列表添加自定义属性

    在后台产品列表页添加自定义的属性,实现可以检索 app\code\core\Mage\Adminhtml\Block\Catalog\Product\Grid.php(建议进行重写) 我这里添加的属性 ...

最新文章

  1. 图像配准----NCC
  2. mysql简易oa系统_基于mybatis设计简单OA系统问题2
  3. Android之如何优雅的管理ActionBar
  4. 跑yolo3模型出的效果图_效果图和效果图设计到底有什么区别?区别大着呢,亲……...
  5. Python之web开发(六):python使用django框架搭建网站之图表显示操作
  6. opencv实现正交匹配追踪算法OMP
  7. web高德地图怎么加载离线地图_怎么验证全国离线卫星地图缓存文件的完整性
  8. mfc从文件中读取数据_Python 中的 bytes、str 以及 unicode 区别
  9. 清华“最强本科生”揭晓!网友:我大概是来凑数的……
  10. 编程杂谈—— 浮点数
  11. [AGC007 E]Shik and Travel
  12. 001 初学android开发,从搭建环境开始(jdk+eclipse+android sdk+windows7)
  13. python 3.5 format_python 3.5学习笔记(第四章)
  14. 景区分时实名预约系统
  15. java 九宫格数独,(完整)九宫格数独题目大全,推荐文档
  16. Windows实例通过IIS如何搭建多个FTP站点
  17. 【算法】牛和牛栏如何匹配到最大值
  18. 周星驰vs韩寒vs宁浩…Python告诉你春节该看哪部电影
  19. 2019安徽省程序设计竞赛 D.自驾游(最短路)
  20. sklearn的predict_proba

热门文章

  1. ORA-04098: 触发器无效且未通过重新验证
  2. linux怎么查看硬件网络信息,Linux 硬件信息网络信息查看
  3. 计算机英语unit3答案,《计算机英语(第3版)》练习参考答案
  4. 【安全用妆周】2021年全国化妆品安全科普宣传周网络知识竞赛开启
  5. 会议室大屏幕使用什么显示设备好?
  6. ActiveX控件不能示例解决方法
  7. 论安防行业的扩张与收缩转型
  8. 图的Laplacian矩阵
  9. python+opencv图像处理之边缘检测车道线识别
  10. 如何区分ICP增值电信许可证和EDI电信增值经营许可证