饿了么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 浏览器, ...
随机推荐
- HNOI2018/AHOI2018 游戏
这题放过了暴力其实就没啥意思了 虽然暴力复杂度很玄学,但是思维水平确实没啥 Description link 题意概述:现在有一条长度为 \(n\) 的链,有些边是有限制的 限制为能到某个点,才能经过 ...
- Evaluation metrics for classification
Accuracy/Error rate ACC = (TP+TN)/(P+N) ERR = (FP+FN)/(P+N) = 1-ACC Confusion matrix Precision/Recal ...
- 以KNN为例用sklearn进行数据分析和预测
准备 相关的库 相关的库包括: numpy pandas sklearn 带入代码如下: import pandas as pd import numpy as np from sklearn.nei ...
- Microsoft COCO 数据集
本篇博客主要以介绍MS COCO数据集为目标,分为3个部分:COCO介绍,数据集分类和COCO展示. 本人主要下载了其2014年版本的数据,一共有20G左右的图片和500M左右的标签文件.标签文件标记 ...
- numpy 加速 以及 ipython
先安装openblas, 然后用pip 安装numpy sudo ln -s /usr/lib64/libopenblas-r0.2.14.so /usr/lib64/libopenblas.so 为 ...
- 17.3.15---关于GPIO控制流水灯的信息
添加一个网址: http://rmingwang.com/gpio-control-flow-lamp-code-archive.html 还有一个 http://www.openedv.com/po ...
- i2c驱动dht12的原理和步骤
一.步骤 1.首先匹配i2c的控制器设备和控制器驱动,会生成一个struct i2c_adapter对象, 2.根据i2c_board_info ,在 arch/arm/mach-sunxi/s ...
- PyTorch基础——预测共享单车的使用量
预处理实验数据 读取数据 下载数据 网盘链接:https://pan.baidu.com/s/1n_FtZjAswWR9rfuI6GtDhA 提取码:y4fb #导入需要使用的库 import num ...
- 吴裕雄--天生自然C语言开发:文件读写
#include <stdio.h> int main() { FILE *fp = NULL; fp = fopen("/tmp/test.txt", "w ...
- 浅谈PHP小马免杀
在渗透测试过程初期,上传小马,拿到 webshell 再进行下一步的操作,现如今的网站安全更多是 一些云防护.CDN防护.服务器安全软件等等,给渗透测试.提权等带来了一定难度的提升, 今天探讨一下如何 ...