目录

1. 商家整体界面搭建

2. 模拟(mock)数据/接口

3. vue transition动画

4. 滚动实现(better-scroll)

5. 滚动右边食物列表,同步更新左侧菜单

6. 点击左侧列表项, 右侧滑动到对应位置

8. 父组件调用子组件的方法(ref)

9. 列表过滤显示

10 项目优化

11 打包可视化


1. 商家整体界面搭建

搭建整个商家的界面,拆分界面路由。路由包含一级路由(点餐、评价、商家)

             

2. 模拟(mock)数据/接口

商家页面的数据使用mock数据来模拟从后台获取的数据

2.1 安装

npm install mockjs

2.2 编写JSON数据

商家页面主要有点餐、评价、商家三个数据

在JSON文件中,存放这三个数据,编写数据的时候要注意数据的格式(对象还是数组)。

以key:value的形式放到JSON文件中

2.3 引入mock

创建一个js文件,在文件中引入Mock,编写每个数据对应的接口

在main.js 中引入上面的js文件

2.4 使用mock数据

在接口文件中添加三个ajax请求

其余的步骤就是在页面请求分发vuex的actions事件,actions提交ajax请求,请将获取的数据commit到mutation,mutation改变state中的数据。

3. vue transition动画

给商家信息详情添加一个动画效果:点击的时候,渐渐的出现商家详情,点击取消,渐渐地消失

 <transition name="fade"><!--这里放需要做动画的内容--></transition>

在style中设置动画的样式

设置离开的时候透明度为0,即完全看不到

&.fade-enter-active,&.fade-leave-activetransition opacity .5s
&.fade-enter,&.fade-leave-toopacity 0

4. 滚动实现(better-scroll)

BetterScroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件。它的核心是借鉴的 iscroll (opens new window)的实现,它的 API 设计基本兼容 iscroll,在 iscroll 的基础上又扩展了一些 feature 以及做了一些性能优化。

BetterScroll 是使用纯 JavaScript 实现的,这意味着它是无依赖的。

4.1 安装

npm install @better-scroll/core --save

4.2 引入

import BScroll from '@better-scroll/core

4.3 创建scroll对象

注意:创建scroll对象应该在获取数据之后,这与scroll的实现原理有关。

当数据没有加载的时候,content中的内容即没有超过其外层div,那么创建了scroll对象也不能滑动。只有在content内容超过其外层div,创建的scroll对象才能进行滚动。

以滑动食品列表为例子。

首先,创建一个函数,创建scroll对象

 _initScroll(){this.foodsScroll=new BScroll('.foods-wrapper',{probeType:2,  //因为惯性滑动不会触发click:true})}

在获取数据之后,通过一个回调函数和nextTick来调用创建scroll对象的函数

this.$store.dispatch('getShopGoods',()=>{//数据更新之后创建一个下拉对象this.$nextTick(()=>{this._initScroll()this._initTops()})})

better-scroll中还提供了其他的方法:

如监听滚动,可以用于实现滚动到对应的食品,左边菜单栏显示对应的菜单

监听惯性滑动的结束,以更新左边选中的菜单

5. 滚动右边食物列表,同步更新左侧菜单

思路:

1. 使用一个类名:current表示当前分类,即当current为true时,对应的菜单是选中的样式

2. 设计一个计算属性, currentIndex,计算当前菜单应该在第几个

计算思路:

获取右边每类食物对应的li,遍历每个li,获取其窗口高度,初始top为0,每遍历一个都让top加上,并保存到top数组中,这样,就获得了每种食物对应的li的高度

 //初始化tops_initTops(){//1. 初始化topsconst tops=[]let top=0tops.push(top)//2. 收集  找到所有分类的liconst lis=this.$refs.foodsUrl.getElementsByClassName('food-list-hook')Array.prototype.slice.call(lis).forEach(li=>{top+=li.clientHeighttops.push(top)})//3. 更新数据this.tops=tops},

实时监听滚动的高度(Y轴坐标)

绑定两个监听事件是因为其中一个是监听惯性滑动的结束,因为选择的滚动类型为2,不包括惯性滚动,因此,还需要监听惯性滚动结束时的Y轴坐标

//右侧列表绑定scroll监听 监听坐标this.foodsScroll.on('scroll',({x,y})=>{this.scrollY=Math.abs(y)})//右侧列表绑定scroll结束的监听this.foodsScroll.on('scrollEnd',({x,y})=>{this.scrollY=Math.abs(y)})

当滚动的高度处于当前的tops中某两个高度之间时,就找到了对应的index

currentIndex(){//得到条件的数据const {scrollY,tops}=this//根据条件计算产生一个结果const index=tops.findIndex((top,index)=>{return scrollY >= top && scrollY < tops[index + 1]})//返回结果return index;}

6. 点击左侧列表项, 右侧滑动到对应位置

  //监听菜单点击事件clickMenuItem(index){//使右侧列表滑动到对应的位置//先得到目标位置const scrollY=-this.tops[index]//立即更新scrollY,更新当前分类this.scrollY=scrollY//平滑到对应位置this.foodsScroll.scrollTo(0,scrollY,300)},

7. 新增动态绑定的数据

当点击添加食物时,食物会添加一个count属性,以记录添加食物的数量

[INCREMENT_FOOD_COUNT](state, {food}) {if(!food.count){//第一次到购物车//food.count=1 //新增属性,没有数据绑定效果Vue.set(food,'count',1) //让新增属性也有数据绑定//将food添加到cartFoods中state.cartFoods.push(food)}else {food.count++}},

8. 父组件调用子组件的方法(ref)

当在父组件点击食物,显示对应 的食物详情时,需要调用食物详情组件的toggleShow方法,让该组件显示

//显示点击的foodshowFood(food){//设置food 显示food组件this.food=food//调用子组件对象的方法(父组件中调用子组件对象的方法)this.$refs.food.toggleShow()}

9. 列表过滤显示

评价列表的过滤显示。评价列表需要过滤满意,不满意,全部三种选择,同时还可以选择只看有文本内容的评论

思路:selectType为012分别代表按钮满意,不满意,全部

rateType是评论的一个属性,有0 1 两个值,分别代表满意,不满意

需要同时满足两个条件:

条件一、 selectType=2||selectType===rateType

前者表示选择全部,后者表示选择满意或者选择不满意

条件二、 !onlyShowText || text.length>0

选择不看没有文本内容的或者选择看有文本内容的

filterRatings(){//得到相关的数据const {ratings,onlyShowText,selectType}=this//产生一个过滤新数组return ratings.filter(rating=>{const {rateType, text} = rating//条件一  selectType 0/1/2  rateType 0/1//        selectType=2||selectType===rateType//条件二  onlyShowText true/false   text 有值|没值//        !onlyShowText || text.length>0return (selectType===2||selectType===rateType) && (!onlyShowText || text.length>0)})}

10 项目优化

1. 缓存路由组件对象

<keep-alive></keep-alive>

2. 路由组件懒加载

//路由组件懒加载
const MSite = ()=>import('../pages/MSite/MSite')
const Order = ()=>import('../pages/Order/Order')
const Profile = ()=>import('../pages/Profile/Profile')
const Search = ()=>import('../pages/Search/Search')

当使用当组件的时候,才去调用函数

3. 图片懒加载(vue-lazyload)

1) 安装

npm install --save vue-loader

2) 使用

import VueLazyload from 'vue-lazyload'
//这是一张图片
import loading from './common/imgs/loading.gif'
Vue.use(VueLazyload, { //自定义一个指令lazyloading
})

11 打包可视化

npm run build --report

尚硅谷外卖项目笔记二相关推荐

  1. 尚硅谷外卖项目笔记一

    目录 1. 项目准备 2  路由的使用 3  stylus 4  swiper组件的使用 5  vuex 6  路由组件的meta属性 7 异步数据的请求 8 ajax跨域问题:配置代理 9 异步数据 ...

  2. 尚硅谷Vue2学习笔记 (二)

    脚手架文件结构 node_modules publicfavicon.ico 页签图标index.html 主页面 srcassets 存放静态资源logo.png component 存放组件Hel ...

  3. Vue移动端项目---尚硅谷外卖

    文章目录 Vue移动端项目--尚硅谷外卖 项目目录结构介绍 移动端适配 头部和底部导航 登录注册页面 密码登录 短信登录 Profile页面 未登录 已登录 Msite页面 首页导航 ShopList ...

  4. 尚硅谷前端项目开发笔记

    尚硅谷前端项目开发笔记 B站视频直达,这个项目亮点在于所有 API 请求都并非在组件内编写,而是在组件内使用this.$store.dispatch() 派发任务,再由 Vuex(actions.mu ...

  5. 尚硅谷SpringBoot学习笔记

    目录 简介​编辑 快速搭建一个SpringBoot的网页 自动配置原理 容器功能 组件添加 原生配置文件引入 配置绑定 自动配置原理 1.引导加载自动配置类 2.按需配置开启自动配置项 开发小技巧 1 ...

  6. 尚硅谷VUE项目-前端项目问题总结07--产品详情页【vuex-排他操作foreach-放大镜-轮播图-兄弟组件通信$bus-购物车-路由跳转传参-路由传参+会话存储】-游客身份-节流

    尚硅谷VUE项目-前端项目问题总结07---产品详情页 1.静态组件(详情页还未注册为路由组件) 2.发请求 3.vuex-获取产品详情信息 3.1放大镜 3.2 属性值[排他操作] 3.3轮播图[j ...

  7. 尚硅谷Python自学笔记

    文章目录 尚硅谷Python自学笔记 计算基础知识 进制 文本文件和字符集 Python介绍 Python入门 Pytho基本语法 数值 字符串 对象(Object) 对象的结构 算数运算符 条件判断 ...

  8. 尚品汇项目笔记(持续更新中)

    项目网络教学视频链接:尚硅谷VUE项目实战,前端项目-尚品汇(大型\重磅)_哔哩哔哩_bilibili 目录 一. 使用vue-cli脚手架去初始化项目 二.项目的其他配置 三.项目路由分析 四.创建 ...

  9. 瑞吉外卖项目笔记+踩坑1——基础功能

     导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 1 ...

最新文章

  1. 安装nginx1.8
  2. Redhat7开机图形或文字界面
  3. thinkphp memcache mysql_thinkphp中memcache的用法实例
  4. solr 启动时指定 solr.home
  5. linux特殊权限之访问权限
  6. SpringMVC面试
  7. mac下qt与mysql配置
  8. testng_TestNG @工厂注释
  9. 纯CSS3渐变色板配色代码
  10. 力扣-559. N 叉树的最大深度
  11. Chrome插件——一键保存网页为PDF1.0发布
  12. 字节跳动否认完成支付牌照收购 或是基于央行批准的不确定性
  13. linux未备案本地网站访问,教你如何解析未备案的域名到国内服务器
  14. 怎么离线发布全国谷歌高清卫星影像地图瓦片
  15. 强化学习——Modle-free DRL算法
  16. Android联网失败报错:java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.xxx not permitted
  17. 浅谈java使用指定字符集编码,以及常见的字符集
  18. Linux系统下的10款非常优秀的POS开源软件
  19. 【极简版GH60】【GH60剖析】【三】组件的选购
  20. linux convert 命令 把gif转成jpg或png格式的问题

热门文章

  1. 如何管理应用的生命周期?
  2. vnr光学识别怎么打开_SLS46CK4单光束安全传感器原版使用说明-Leuzeelectronic.PDF
  3. 记一次 Paramiko 提示 Authentication (publickey) failed问题解决过程
  4. android pppd log,未记录的pppd退出代码
  5. bp1048仿真器的使用
  6. 哪个求职网站最靠谱?
  7. matlab怎么取消科学计数法_在MATLAB中更改数据科学计数法
  8. pytorch多卡并行模型的保存与载入
  9. 使用虚拟机备份软件备份Microsoft Hyper-V 虚拟机
  10. 河南科技学院计算机对口分数线,2010年河南科技学院对口招生分数线是多少?...