「开源-前端」vue全家桶制作一个精致的仿美团项目

偷懒的程序员 2019-03-07 17:21:09 ⋅ 736 阅读

一、项目展示:


注意:如果gif动态图看不了,麻烦大家点击github美团项目中mt-app/src/assets/美团.gif便可以观看!

本项目很适合vue初学者,如果业务逻辑看不懂,很欢迎一起讨论!

源码地址在最后,欢迎 star 和 fork

如果对你有些许帮助,不妨点赞、关注我一下啊

二、项目涉及到技术栈:

  • vue全家桶:Vue、Vue-router、Vue-cli等

  • 组件化:单Vue文件

  • 模块化:ES6 Module

  • 第三方模块:better-scroll axios等

  • 基础开发环境和包管理:Node、npm

  • 构建工具:webpack

  • 编辑器:webstrom

三、项目主要功能

一言而蔽之:一款集点菜、用户评价和商家信息为一体的移动端点餐APP

1.点餐页面

点选商品后自动添加到购物车,并计算好总价,在商品列表、购物车列表和商品详情页都可以随意增减数目,此外左侧商品分类和右侧的商品相互关联,通过better-scroll插件滑动商品列表时,相应的商品分类也会跟着跳转。

2.用户评价页面

主要包括一个TAB栏,包括三部分:全部、有图和评价三个模块

3.商家信息页面

主要介绍一些商家基本信息,可以通过better-scroll插件,进行左右滑动图片

四、项目难点

该项目业务逻辑主要集中在点餐模块,而点餐模块中难点便是如何实现商品列表滑动,以及右侧商品分类和左侧商品列表如何联动?


首先要实现商品列表的滑动,就需要用到一个better-scroll插件,better-scroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件。

  • 安装better-scroll npm install better-scroll --save

  • 在Good.vue文件中script引入import BScroll from 'better-scroll'

这些准备工作做好后,实现左右两边列表联动,总结起来有以下四个步骤:

1. 计算商品分类的区间高度

//template部分 <!--商品列表--> <div class="foods-wrapper" ref="foodScroll"> <ul> <!--专场--> <li class="container-list food-list-hook"> <div v-for="(item,index) in container.operation_source_list" :key="index"> <img :src="item.pic_url"> </div> </li> <!-- 具体分类 --> <li v-for="(item,index) in goods" :key="index" class="food-list food-list-hook"> <h3 class="title">{{item.name}}</h3> <!-- 具体的商品列表 --> <ul> <li v-for="(food,index) in item.spus" :key="index" @click="showDetail(food)" class="food-item"> ......//JS部分methods:{ calculateHeight() { // 计算分类的区间总高度(包括专场和所有具体分类的总高) let foodlist = this.$refs.foodScroll.getElementsByClassName("food-list-hook") let height = 0 this.listHeight.push(height) for (let i = 0; i < foodlist.length; i++) { let item = foodlist[i] height += item.clientHeight // 累加 this.listHeight.push(height) } console.log(this.listHeight)//[0, 43, 1231, 2401, 3589, 4451, 6121, 7656, 8497, 9344, 10080] }, initScroll() { this.menuScroll = new BScroll(this.$refs.menuScroll, { //实例化 click: true //点击事件才能生效 }) this.foodScroll = new BScroll(this.$refs.foodScroll, { probeType: 3, click: true })}, created() { fetch("/api/goods") .then(res => res.json()) .then(response => { if (response.code == 0) { this.container = response.data.container_operation_source this.goods = response.data.food_spu_tags this.poiInfo = response.data.poi_info  this.$nextTick(() => { //在created中数据虽已初始化,但dom未生成,页面还没显示,要使用回调函数,确保DOM已经更新 this.initScroll() // 执行滚动方法 this.calculateHeight() //调用计算分类区间高度的方法 }) } }) }

2. 监听滚动的位置

initScroll() { this.menuScroll = new BScroll(this.$refs.menuScroll) this.foodScroll = new BScroll(this.$refs.foodScroll, { probeType: 3//在屏幕滑动的过程中实时派发 scroll 事件 click:true//点击事件才能生效 }) //foodScroll监听事件 this.foodScroll.on("scroll", (pos) => { this.scrollY = Math.abs(pos.y) console.log(this.scrollY) }) }

3. 根据滚动位置确认下标,与左侧对应

computed:{ currentIndex(){ for(let i = 0; i < this.listHeight.length; i++){ let height1 = this.listHeight[i] let height2 = this.listHeight[i+1] // 获取商品区间的范围 if(!height2 || (this.scrollY >= height1 && this.scrollY < height2)){ return i; // 是否在上述区间中 } } return 0 } <li class="menu-item" :class="{'current':currentIndex === 0}"//动态绑定一个样式,.current设置样式 @click="selectMenu(0)"> <p class="text"> <img class="icon" :src="container.tag_icon" v-if="container.tag_icon"> {{container.tag_name}} </p> </li> <li class="menu-item" :class="{'current':currentIndex === index + 1}" v-for="(item,index) in goods" :key="index" @click="selectMenu(index+1)" >

4. 通过下标实现点击左侧,滚动右侧

<li class="menu-item" :class="{'current':currentIndex===0}" @click="selectMenu(0)"><li class="menu-item" :class="{'current':currentIndex===index+1}" v-for="(item,index) in goods" :key="index" @click="selectMenu(index+1)">//同一个函数传值不一样 selectMenu(index) { let foodlist = this.$refs.foodScroll.getElementsByClassName("food-list-hook") let element = foodlist[index] this.foodScroll.scrollToElement(element, 250) }

五、项目总结

  • vue数据和视图的分离,以数据驱动视图,只关心数据变化,DOM操作被封装,在实际开发过程中大大提高了效率。

  • Vue的组件化功能可谓是它的一大亮点,通过将页面上某一组件的html、CSS、JS代码放入一个.vue的文件中进行管理可以大大提高代码的维护性。

  • 项目中未做移动端适配,在不同屏幕手机上打开,可能用户体验会差些

源码地址:https://github.com/ljianshu/mt-app

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    SpringBlade v2.8.0 已经发布,SaaS 微服务开发平台

    SpringBlade微服务开发平台 采用前后端分离模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、Element

    Vue 3 正式发布

    Vue.js 3.0 "One Piece" 已正式发布,此框架新主要版本提供了更好性能、更小捆绑包体积、更好 TypeScript 集成、用于处理大规模用例新 API,并为框架未来长期

    VUE 开源库收藏版(二):史上最全面学习资源 ,附GitHub源码地址

    最近做了一个Vue开源项目库汇总,里面集合了OpenDigg 上优质Vue开源项目库,方便移动开发人员便捷找到自己需要项目工具等,感兴趣可以到GitHub上给个star。

    VUE 开源库收藏版(一):史上最全面学习资源 ,附GitHub源码地址

    VUE 开源库收藏版(一):史上最全面学习资源 ,附GitHub源码地址

    A3Mall v1.5.2 发布,免费开源 PHP 小程序商城系统

    项目介绍 A3Mall商城系统是基于ThinkPhp6.0+Vue开发一套移动电商系统, 支持微信公众号商城、H5商城、小程序商城,支持多种营销活动,优惠劵、订单活动、购、秒杀、会员特价、积分

    精品推荐:基于Vue2.0高仿微信App单页应用 学习Vue新动力!

    利用Vue2.0模仿微信app,基本做到了以假乱真效果

    精品推荐:一览GitHub上最受程序欢迎5大Java开源项目

    列举了GitHub上一些最流行Java项目。从Mockitos到Guava,以及 java-design-patterns等供大家学习。

    连续三年蝉联第一,Flink 荣膺全球最活跃 Apache 开源项目(附课程)

    2020年,一个注定会被历史铭记一年。在全球化合作受到挑战大环境下,作为全球最大开源软件基金会,Apache 软件基金所引领开源社区,依然汇聚了全球顶尖开发人员,交出了一份鼓舞人心成绩单

    Leaf——点评分布式ID生成系统

    在复杂分布式系统中,往往需要对大量数据和消息进行唯一标识。如在点评金融、支付、餐饮、酒店、猫眼电影等

    「轻阅读」开源QPS压测结果近5w/s分布式ID生成器leaf调试实战

    大型互联网项目ID要保证全局唯一,一般不在用数据库自带id自增了,一般都会用分布式id生成器。

    仿今日头条 Gfast CMS 前端发布

    Gfast 开源以来,CMS管理模块一直深受大家喜欢于是就有朋友建议弄一个CMS前端给大家学习使用,然而由于公司最近事项比较多,所以一直没能及时处理,今天终于把所有前端处理完成,大家可以去下载学习

    GitHub精选:2018年11月份最热门Java开源项目

    又到了揭晓 11 月份最热门 Java 开源项目排名时候了,在本月名单中,出现了几个新面孔,如Java 核心知识库、轻量级容错组件Resilience4j .....

    推荐一款前端数据源管理工具 algeb

    ALGEB 简介 这是一个比较抽象库,一开始可能比较难理解。我写它初衷,是创建可响应数据请求管理。在传统数据请求中,我们只是把携带ajax代码一堆函数放在一起,这样就可以调用接口。但是这种

    微型Java开发框架Solon 1.1发布,QPS达10万+

    简介 Solon 是一个微型Java开发框架。项目从2018年启动以来,参考过大量前人作品;历时两年,2700多次commit;内核保持0.1m身材,超高Web跑分,良好使用体验

    Fes.js v0.4.1 版本发布,一套优秀中后台系统前端解决方案

    Fes.js 是一套优秀中后台前端解决方案。提供初始项目开发调试、Mock接口、编译打包命令行工具。内置布局、权限、数据字典、状态管理、存储、Api等多个模块。以约定、配置化、组件化设计思想

    开源推荐】基于 Go 语言轻量级高性能日志库 logit使用及测评

    logit 是一个简单易用并且是基于级别控制日志库,可以应用于所有 GoLang 应用程序中。

    MoguBlog(蘑菇博客)v5.3发布,前后端分离博客系统

    MoguBlog简介 MoguBlog(蘑菇博客),一个基于微服务架构前后端分离博客系统。前台使用Vue + Element , 后端使用spring boot + spring cloud

    精品推荐:【CKEditor】全球最优秀网页在线文字编辑器之一

    CKEditor是新一代FCKeditor,是一个重新开发版本。CKEditor是全球最优秀网页在线文字编辑器之一,因其惊人性能与可扩展性而广泛被运用于各大网站。