饿了么vue实现学习笔记
技术栈:vue2 + vuex + vue-router + webpack + ES6/7 + fetch + sass + flex + svg
以功能实现着手学习
1. 定位功能 home.vue
通过跨域获取当前的地理位置
http://cangdu.org:8001/v1/cities?type=guess
2. 选择城市转跳页面到搜索详细地址 home.vue
根据API接口的ID,通过
router-link :to="'/city/' + guessCityid"传值
路由定位到city.vue组件
根据路由cityid获取cityid:
this.cityid = this.$route.params.cityid;
通过跨域获取城市名称
3. 搜索地址,并且点击时缓存 city.vue
还是通过跨域访问获取JSON数据,并且在前端控制UI的显示
//http://cangdu.org:8001/v1/pois?type=search&city_id=2&keyword=123
缓存:window.localStorage.getItem(name);
3.1地址的本地缓存加载
如果存在地址的本地缓存的话,在页面初始化时通过getStore方法加载缓存,并且加以显示
3.2搜索地址
在挂载mount的时候已经通过router那里获取到所属城市的id了,如果输入的地址不为空,那么设置3个参数historytitle,placelist,placeNone,分别控制UI(搜索历史,清空所有的显示),输入地址内容的显示,以及如果没有结果显示的UI。
3.3本地缓存的存储
点击一个搜索出来的地址以后,获取本地对该地址数组的缓存:1.如果缓存存在,那么判断地址跟缓存中的数据是否重复,如果不重复,则加入到缓存中去,否则不加入,并且重新设置缓存。2.如果缓存不存在直接加入到数组中,设置为数组缓存。
3.4完成缓存操作以后,通过路由转跳到新的组件上去。
4. 展示所选地址附近商家列表和食品类型列表
4.1展示导航食品类型列表
1.根据搜索地址那儿的router获取经纬度:
"geohash":"30.26537,120.17519"
2.根据api接口获取JSON数组
api:http://cangdu.org:8001/v2/index_entry?30.26537,120.17519&group_type=1&flags[]=F
3.设置新数组负责展示模块
4.2通过组件展示附近商家列表
1.定义一个shopList组件,为组件传值,传值的方式有两种,一种是直接在组件那儿设置参数传值,另外一种是通过mutation传值,通过state取值。
2.在methods处定义一个异步函数initDate,去api获取数据,完成以后再mounted()那儿初始化。
5. 搜索美食,餐馆
跨域。该项目有BUG,显示经纬度错误,已修改PR。
修改详情如下:
BUG显示经纬度错误
src/components/footer section处加入query
代码从 <section @click = "gotoAddress({path: '/search/geohash'})" class="guide_item">
改为<section @click = "gotoAddress({path: '/search/geohash',query: {geohash}})" class="guide_item">
src/page/search/search.vue mouted处
代码从 this.geohash = this.$route.params;
改为 this.geohash = this.$route.query.geohash;
6.根据距离、销量、评分、特色菜、配送方式等进行排序和筛选 ---组件展示
1.当选中要排序的内容时,将要排序的内容赋值,到data()中,并且将参数传到组件中
赋值例子:
this.restaurant_category_ids=id
传参到组件:
<shop-list :geohash="geohash" :restaurantCategoryId="restaurant_category_id" :restaurantCategoryIds="restaurant_category_ids" :sortByType='sortByType' :deliveryMode="delivery_mode" :confirmSelect="confirmStatus" :supportIds="support_ids" v-if="latitude"></shop-list>
2.组件通过props获取父组件中的传值
props: ['restaurantCategoryId', 'restaurantCategoryIds', 'sortByType', 'deliveryMode', 'supportIds', 'confirmSelect', 'geohash']
3.创建监听,如果数据改变了的话,通过异步函数去取值,例子如下:
1.创建监听:
watch: {
//监听父级传来的restaurantCategoryIds,当值发生变化的时候重新获取餐馆数据,作用于排序和筛选
restaurantCategoryIds: function (value){
this.listenPropChange();
}
}
2.在methods处创建异步函数:
async listenPropChange(){
this.showLoading = true;
this.offset = 0;
let res = await shopList(this.latitude, this.longitude, this.offset, '', this.restaurantCategoryIds, this.sortByType, this.deliveryMode, this.supportIds);
this.hideLoading();
//考虑到本地模拟数据是引用类型,所以返回一个新的数组
this.shopListArr = [...res];
}
7. 餐馆食品列表页
1.点击菜单,显示相应的foodList
设置menuIndexChange,解决运动时foodList处依然监听的BUG,点击时menuIndexChange为false,运动结束,true,继续监听,获取shopListTop数组,用scrollTo,移动到相应的foodList
2.下拉食品列表,显示相应的菜单
监听加载数据的动画结束时的状态,动画结束以后获取食品列表的高度,并且对食品列表设定监听,根据pos.y的值来与食品列表高度数组比较获取index,并且显示。同时,设置scrollToElement,当食品列表下移到一定高度时,菜单下移,当点击一定高度以下(从上往下看)菜单时,菜单点击结束,恢复监听,菜单下移。
notice:有点疑问的是,为什么设置好偏移量以后,菜单会下移,从代码层面看,是跟BScroll有关系的。BScroll有点不熟悉hhh,我就看的懂BScroll的参数,并且给它注释了。
8. 购物车功能
8.1购物车父组件功能说明
1.moveInCart
添加到购物车动画
2.showChooseList
显示选规格的界面
3.showReduceTip
显示减少按钮
4.showMoveDot
接收子组件传递的参数,用于moveInCart
8.2moveInCart和showMoveDot
用JS实现点击添加以后,图标移动到购物车
1.在组件中,点击添加按钮,触发addToCart事件,在事件中获取按钮距离视图左边和底部的位置,并且对showMoveDot数组赋值为true,触发父组件showMoveDot的事件
2.父组件showMoveDot的事件触发函数showMoveDotFun对相关参数进行赋值,其中this.showMoveDot = [...this.showMoveDot, ...showMoveDot];是在原先的数组上,清空数组,继续添加数据的意思
3.transition中v-for="(item,index) in showMoveDot"存在该数据的值,则执行动画,执行动画参数:
appear
@after-appear = 'afterEnter'
@before-appear="beforeEnter"
4.用JS实现afterEnter和beforeEnter
9. 店铺评价页面
点击标签无变化,我看了下API接口,是接口数据的问题。
10. 单个食品详情页面
11.商家详情页
12.登录、注册
后台传递一个base64格式的图片与图片内容
图片给用户看,图片内容校验用户输入的验证码
用户输入的匹配后将验证码内容一起发到服务器再验证
<------之后的部分觉得没必要再看下去了.------>
13.修改密码
14.个人中心 -- 完成
15.发送短信、语音验证 -- 完成
16.下单功能 -- 完成 ✨✨
饿了么vue实现学习笔记的更多相关文章
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- Vue.js学习笔记:在元素 和 template 中使用 v-if 指令
f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- Vue 新手学习笔记:vue-element-admin 之安装,配置及入门开发
所属专栏: Vue 开发学习进步 说实话都是逼出来的,对于前端没干过ES6都不会的人,vue视频也就看了基础的一些但没办法,接下来做微服务架构,前端就用 vue,这块你负责....说多了都是泪,脚手架 ...
- Vue.js——学习笔记(一)
Vue-自学笔记 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...
- Vue.js 学习笔记之二:数据驱动开发
在 Vue.js 框架中,与 HTML 页面元素的交互方式没有像原生 JavaScript 接口那么直接,它是通过先在 HTML 元素标签中嵌入一系列类似于普通标签属性的 Vue 指令属性来绑定数据, ...
- Vue.js 学习笔记之三:与服务器的数据交互
显而易见的,之前的02_toDoList存在着一个很致命的缺陷.那就是它的数据只存在于浏览器端,一但用户关闭或重新载入页面,他之前加入到程序中的数据就会全部丢失,一切又恢复到程序的初始状态.要想解决这 ...
- Vue.js 学习笔记之四:Vue 组件基础
到目前为止,这个系列的笔记所展示的都是一些极为简单的单页面 Web 应用程序,并且页面上通常只有几个简单的交互元素.但在实际生产环境中,Web 应用程序的用户界面往往是由多个复杂的页面共同组成的.这时 ...
- Vue.js 学习笔记之五:编译 vue 组件
正如上一篇笔记中所说,直接使用 ES6 标准提供的模块规范来编写 Vue 组件在很多情况下可能并不是最佳实践.主要原因有两个,首先是市面上还有许多并没有对 ES6 标准提供完全支持的 Web 浏览器, ...
随机推荐
- LeetCode——324. 摆动排序 II
给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums = [1, 5 ...
- java线程——notifyAll通知的泄露
版权声明:本文为CSDN博主「兰亭风雨」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/ns_code/ar ...
- UML-如何使用层进行设计?
1.将代码组织映射为层和UML包 com.mycompany |_nextgen |_ui |_domain |_service |_util org.apache.log4j 2.使用对象设计应用 ...
- LGOJ1344 追查坏牛奶
Description link 题意概述:给一张图,每条边有边权,求让点 \(1\) 和点 \(n\) 不连通的"最小破坏边权和" 和 "在此基础上的最小破坏边数&qu ...
- Java之同步方法处理实现Runnable接口的线程安全问题
/** * 使用同步方法解决实现Runnable接口的线程安全问题 * * * 关于同步方法的总结: * 1. 同步方法仍然涉及到同步监视器,只是不需要我们显式的声明. * 2. 非静态的同步方法,同 ...
- ZJNU 1372 - 破解情书
取模运算在数组内循环解密,否则会MLE /* Written By StelaYuri */ #include<stdio.h> ],cn[]; int main() { int i,j, ...
- PHP系列 | ThinkPHP5.1 如何自动加载第三方SDK(非composer包 )
注意:这里只是针对于非Composer 安装包的自动加载的实现,能用composer安装的自动跳过. 由于ThinkPHP5.1 严格遵循PSR-4规范,不再建议手动导入类库文件,所以新版取消了Loa ...
- UVa202
刚刚开始写的适合感觉是转换成字符然后开始遍历一遍,后面发现各种不行,就回去看了看题目,重新构思,写了好久还是WA,最后只能看下大神的操作(我太菜了). 先简单梳理下题目意思:首先给出两个数,然后这两个 ...
- nginx 反向代理学习
目录 nginx 反向代理学习 一.正向代理和反向代理的区别 1.1正向代理 1.2 反向代理 二.nginx反向代理的使用 nginx 反向代理学习 一.正向代理和反向代理的区别 正向代理代理客户端 ...
- 2017年3月16工作日志【mysql更改字段参数、java8 map()调用方法示例】
修改某个表的字段类型及指定为空或非空 >alter table 表名称 change 字段名称 字段名称 字段类型 [是否允许非空],变更字段名称及属性 >alter table 表名称 ...