mpVue高仿美团小程序教程

本章涉及知识点

1、前言

2、mpVue框架简介

3、项目配置和结构

4、主程序入口配置

5、首页页面

6、城市选择页面

7、搜索页面

8、订单列表页面

9、我的页面

10、商品详情页面

11、评论列表页面

12、提交订单页面

13、订单详情页

14、通用方法封装

15、Vuex的设计

16、后记

一、前言

继写完上一篇原生JS实现轻量Vue+指令解析+变异数组监听的代码和文章后,本来笔者已经写完了原生JS实现轻量React的代码,而正在写其文章的时候,突然被mpVue打断,因为从前自己一直不喜欢小程序开发,依赖微信平台不说,微信还重新封装了一遍其语法糖,但是mpVue的开源让开发者可以用原生Vue来开发小程序,其实其本质任然是将Vue编译成原生小程序的AST,最后再翻译成原生webView代码,于是笔者暂停下了写React的文章转而用mpVue先开发个小程序

既然是美团开源的框架,那我们就高仿一个美团呗!于是就写了这篇文章教程,笔者花了3天时间,用mpVue框架+自定义Vue组件+原生小程序组件+Vuex开发出了一个高仿美团的小程序,相似度达到90%以上,体验程度还是非常流畅的,毕竟翻译到最后是原生App代码

二、mpVue框架简介

我们知道微信小程序有着自己的一套语法糖,包括自己的标签,样式规范和语法,本身也没有组件化机制(表示难以接受),其推出的Wepy也是类Vue的开发规范,用着也是别扭,为此,mpVue是完全基于Vue的开发规范,包括生命周期,且完全支持Vue自定义组件规范,对于Vue开发者来说,可以无缝对接的开发小程序

关于mpVue更多的功能,可以参考其官网:mpVue官网

三、项目配置和结构

整体项目结构

可以看到mpVue的项目目录结构非常熟悉,下面我们开始开发各个页面

四、主程序入口配置

入口设计-1

我们在项目入口里引入公共css、公共方法、以及store,并将公共方法挂载到Vue的原型上

入口设计-2

根据小程序app.json的配置,我们配置好所有页page、window以及tabBar

五、首页页面

首页有轮播图,图标九宫格,猜你喜欢的商品列表,还有当前城市和搜索面板,其分别是选择城市页面和搜索页面页面的入口

首页页面的页面布局代码为

首页部分代码-1
首页部分代码-2
首页部分代码-3

其中我们提取封装出商品卡片组件good

good组件部分代码

注意我们注入store中的当前城市变量,让其不被跳转影响

引入store

最终首页在真机上显示如下

首页

六、城市选择页面

城市选择页面有当前/最近访问城市、热门城市、根据首字母展示所有城市,还有右侧固定住的26个首字母作为点击事件,可以滑动到相应的首字母下的城市列表

我们封装出city组件,其页面布局代码为

city组件部分代码-1
city组件部分代码-2

我们引入cityData,并在点击任意城市的时候emit给父组件(即城市选择页面)

对于点击首字母滑动页面到相应首字母对应城市的位置的处理,由于小程序没有任何dom,我们不能使用锚点或者window.scrollTo,但是我们可以利用原生小程序提供的scroll-view中scroll-into-view属性来滚动到相应位置,为此我们只需要用Vue来托管scroll-into-view变量currView即可

city组件部分代码-3

最终城市选择页面在真机上显示如下

城市选择页面

七、搜索页面

搜索页面有搜索输入框,猜你想找和历史搜索的面板,对于动态监听到输入的搜索关键词,以滚动列表的形式展示符合搜索关键词的结果集合,所以猜你想找和历史搜索的面板,与搜索结果列表为互斥关系

搜索页面的页面布局代码为

搜索页面部分代码-1
搜索页面部分代码-2

对于模拟搜索动态列表,我们在data里定义搜索总集合、当前搜索关键词和根据当前搜索关键词匹配到的结果列表

搜索页面部分代码-3

我们需要监听input的输入事件和完成事件,来维护当前搜索关键词和动态过滤符合搜索关键词的结果集

搜索页面部分代码-4

最终搜索页面在真机上显示如下

搜索页面

八、订单列表页面

订单列表页面比较简单了,只有商品列表的滚动展示

这里为了演示滚动效果,我模拟循环了12次常量数据,订单列表页面的页面布局代码为

订单列表页面部分代码-1

最终订单列表页面在真机上显示如下

订单列表页面

九、我的页面

我的页面有登录、退出、以及4个入口项,在点击登录后动态获取用户信息,渲染登录按钮为用户的头像、昵称、性别和居住地信息,点击退出按钮后清除用户信息并替换为登录按钮

我的页面的页面布局代码为

我的页面部分代码-1
我的页面部分代码-2

我们引入store来在用户点击登录或者退出的时候,动态维护用户登录状态和用户信息

我的页面部分代码-3

最终我的页面在真机上显示如下

我的页面

十、商品详情页面

商品详情页面有商品主图价格信息、映像标签、商家信息、套餐信息、购买须知、部分用户评论和相关商品推荐板块,页面里有两个其它页的入口,分别是提交订单和用户评论列表入口

商品详情页面的页面布局代码为

商品详情页部分代码-1
商品详情页部分代码-2
商品详情页部分代码-3
商品详情页部分代码-4
商品详情页部分代码-5

这个页面里用到了卡片组件good,打星评分组件star和评论组件comment,good组件首页已经封装好,下面我们封装出star和comment组件

下面是star组件的布局代码

star组件部分代码-1

注意:由于小程序没有伪类,为此我们利用absolute来动态渲染星星的颜色

为此需要动态的计算每一个星星染色宽度,100表示完全染色,30表示1/3染色

star组件部分代码-2

下面是comment组件的布局代码

comment组件部分代码-1

最终商品详情页面在真机上显示如下

商品详情页面

十一、评论列表页面

这个页面是通过商品详情页为入口进入,其评论分为全部、晒图评论、低分评论和最新评论,各个评论的通过swiper滑动切换来更新相应的评论列表

评论列表页面的页面布局为

评论列表页面部分代码-1
评论列表页面部分代码-2
评论列表页面部分代码-3

为了演示不同类型评论的切换,我们定义好全集评论列表,并过滤计算出不同类型的数组用于渲染不同的列表

评论列表页面部分代码-4

最终评论列表页面在真机上显示如下

评论列表页面

十二、提交订单页面

这个页面主要有数量的动态增加或者减少,以及价格的动态变化

提交订单页面的页面布局为

提交订单页面部分代码-1
提交订单页面部分代码-2

由于数量需要动态增减,我们封装出计数组件counter

counter组件的布局为

counter组件部分代码-1

增减数量后emit给父组件即可

counter组件部分代码-2

最终订单提交页面在真机上显示如下

订单提交页面

十三、订单详情页面

订单详情页面由订单列表页进入,主要就是商家信息和订单信息的展示

订单详情页部分代码-1
订单详情页部分代码-2

最终订单详情页面在真机上显示如下

订单详情页

十四、通用方法封装

开发完所有页面后,我们来封装一些通用函数,方便挂载到Vue原型上在任何页面使用

首先是Ajax封装,由于微信提供的request是类似Jquery的语法里带上各个回调函数,这让我们使用习惯Promise或者es7的async/await的异步编程风格后显得非常不舒服,所以我们将request封装成Promise风格,让我们可以在任何页面通过async/await来接收服务器的返回值

封装Ajax为Promise风格的函数如下

封装Ajax

下面我们简单的封装一些常用的方法,如打开新窗口,返回上一级窗口和重定向

常用的方法

最后在主程序入口里挂载即可

挂载通用方法

十五、Vuex的设计

我们在store里设置三个状态,分别为当前城市、用户是否登录标志和用户信息集合,并在mutations里提供更新维护这三个状态的方法接口即可

Vuex的设计-1
Vuex的设计-2

最后将store挂载到Vue的原型上即可

挂载store

十六、后记

这个案例,通过使用mpVue框架模仿一个美团小程序,业务上模拟了从商品列表,到商品详情,到评论列表,到订单提交,到订单列表,到订单详情,以及城市选择、全局搜索过滤,以及我的页面的登录等,可以看到用Vue模板引擎框架和原生JS编程,能够非常轻易的做出一个体验非常流畅的小程序

由于案例只是做纯前端的渲染逻辑展示,所以数据全集都是写死的,并没有Ajax服务器数据,不过开发者应该都知道,前后端分离,只要将所有页面data里的数据通过封装好的Ajax拉取到服务器数据后渲染即可

案例代码见:高仿美团小程序

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 转载 :OpenDiggawesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库...
    果汁密码阅读 22,983评论 8 125
  • 圣人先得我心。 那些自己没有能力言说的情绪,已经被前人或时人中的天才先说了出来。 那些自己没有勇气提出的主张,也早...
    Scartrans阅读 209评论 0 0
  • 南京博物院,帝国盛世,这些诉说历史的文物,美吗?哈哈
    快乐巫师阅读 158评论 0 1
  • “哎哎,这怎么好意思呢,不能收,你拿回去。” “不不,这是给孩子的一点心意,大过年的,不是给你的,是给孩子的,拿着...
    奇妙的树阅读 150评论 0 0