技术栈: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实现学习笔记的更多相关文章

  1. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  2. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

  3. Vue.js学习笔记:在元素 和 template 中使用 v-if 指令

    f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  4. Vue 新手学习笔记:vue-element-admin 之安装,配置及入门开发

    所属专栏: Vue 开发学习进步 说实话都是逼出来的,对于前端没干过ES6都不会的人,vue视频也就看了基础的一些但没办法,接下来做微服务架构,前端就用 vue,这块你负责....说多了都是泪,脚手架 ...

  5. Vue.js——学习笔记(一)

    Vue-自学笔记 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...

  6. Vue.js 学习笔记之二:数据驱动开发

    在 Vue.js 框架中,与 HTML 页面元素的交互方式没有像原生 JavaScript 接口那么直接,它是通过先在 HTML 元素标签中嵌入一系列类似于普通标签属性的 Vue 指令属性来绑定数据, ...

  7. Vue.js 学习笔记之三:与服务器的数据交互

    显而易见的,之前的02_toDoList存在着一个很致命的缺陷.那就是它的数据只存在于浏览器端,一但用户关闭或重新载入页面,他之前加入到程序中的数据就会全部丢失,一切又恢复到程序的初始状态.要想解决这 ...

  8. Vue.js 学习笔记之四:Vue 组件基础

    到目前为止,这个系列的笔记所展示的都是一些极为简单的单页面 Web 应用程序,并且页面上通常只有几个简单的交互元素.但在实际生产环境中,Web 应用程序的用户界面往往是由多个复杂的页面共同组成的.这时 ...

  9. Vue.js 学习笔记之五:编译 vue 组件

    正如上一篇笔记中所说,直接使用 ES6 标准提供的模块规范来编写 Vue 组件在很多情况下可能并不是最佳实践.主要原因有两个,首先是市面上还有许多并没有对 ES6 标准提供完全支持的 Web 浏览器, ...

随机推荐

  1. PHP静态方法和普通方法的区别

    <?php header('content-type:text/html;charset=utf-8'); /* 普通方法,存放类内,只有一份 静态方法,也是存放于类内,只有一份 区别在于:普通 ...

  2. CodeForces 1294B Collecting Packages(排序+贪心)

    http://codeforces.com/contest/1294/problem/B 大致题意: 一张图上有n个包裹,给出他们的坐标,一个机器人从(0,0)出发,只能向右(R)或向上(U),问能否 ...

  3. 吴裕雄--天生自然 PHP开发学习:MySQL 插入数据

    <?php $servername = "localhost"; $username = "root"; $password = "admin& ...

  4. springboot cloud 网盘

    boot https://pan.baidu.com/s/12SkGJNu_M-I-pjg-GxqHRw     5uga boot-cloud https://pan.baidu.com/s/1gO ...

  5. 【转】Rendering Problems The following classes could not be instantiated

    xml 设计时警告 打开es/values/目录下styles.xml文件. 把:<style name="AppTheme" parent="Theme.AppC ...

  6. Python 学习笔记:Python 操作 SQL Server 数据库

    最近要将数据写到数据库里,学习了一下如何用 Python 来操作 SQL Server 数据库. 一.连接数据库: 首先,我们要连接 SQL Server 数据库,需要安装 pymssql 这个第三方 ...

  7. Python字符串与列表

  8. Opencv笔记(九)——图像阈值

    学习目标: 学习简单阈值,自适应阈值,Otsu's 二值化等 学习函数cv2.threshold,cv2.adaptiveThreshold 等. 一.简单阈值 与名字一样,这种方法非常简单.但像素值 ...

  9. spring 方法注入、方法替换

    spring 提供了很多的注入方式,set注入.构造注入.p命名空间.c命名空间.字段注入等等,这些没啥可说的了. 方法注入 因为开发时我需要spring管理一个实例,但是这个实例并非单例,应该每一次 ...

  10. ACM-ICPC Nanjing Onsite 2018 I. Magic Potion

    题意:类似二分图匹配给的题目,不过这次在这里给出了k,表示没人可以再多一次匹配机会,这次匹配不能用上一次被匹配的对象 分析:不能用匈牙利做俩次匹配,因为俩次的最大匹配并不等价于总和的匹配,事实证明,你 ...