前言
接触Vue2.x已经有一段时间,该项目是基于最新的Vue2.x技术实现的,用到的技术栈有
实现的功能:
- 商家优惠信息浮层,内容不足时关闭按钮仍能定位到底部(Sticky footers布局)
- 商品、评价、商家页面实现平滑滚动
- 商品页点击左侧menu,右侧内容跳转到相应位置
- 评论内容支持分类查看,无内容时不显示筛选组件
- 加入购物车按钮动画,商品飞入购物车动画,购物车展开收起动画
- 商家实景图片超过屏幕宽度时,可左右滚动
- 收藏商家使用localStorage缓存到浏览器本地
项目结构
|
|
项目组件分析
|
|
遇到的问题汇总
better-scroll组件的使用问题
1、better-scroll在移动端使用,初始化时要设置click:true,否则移动端无法点击。
2、better-scroll使用时,需在代码中使用如下判断,否则PC端将产生两次点击事件。
|
|
3、better-scroll的使用,必须保证子容器的高度或宽度超过父容器,否则无法滚动。如果子容器包含多个孙容器,可手动给子容器设置高度或宽度,使其能滚动(例如:项目中商家实景横向滚动效果,手动设置了容器的宽度,使其能滚动)。
4、better-scroll对DOM的依赖很强,所以不需保证DOM已经渲染完毕,才能创建或刷新better-scroll实例。在Vue中,可以使用$nextTick()
保证文档已经渲染完毕。
CSS样式问题
1、项目图标,可以使用icomoon.io将其转化为字体图标,这样可以保证icon的清晰度
2、border-1px的实现,通过@media
媒体查询,针对不同屏幕分辨率执行不同的缩放。即 @media + scale
公式:设备上像素 = 样式像素 * 设备像素比
|
|
|
|
更多关于设备像素比devicePixelRatio:http://www.zhangxinxu.com/wordpress/2012/08/window-devicepixelratio/
Sticky-footer 布局
header组件商家优惠中浮层采用了sticky footer布局,该布局的特点是,如果内容不足以充满整个屏幕,页脚也会贴在视窗底部,内容足够长时,页脚会被内容自动撑开。
|
|
更多关于sticky-footer布局:https://aotu.io/notes/2017/04/13/Sticky-footer/index.html
flex 布局
项目中多次使用flex布局,例如购物车组件的布局,左侧内容自适应,右侧宽度固定。
|
|
更多关于flex布局:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
padding-top = 100%的用法
为了防止图片加载过程中闪烁,且让图片的宽度自适应为屏幕宽度,高度与宽度相对(即正方形)。例如,商品详情页头图展示样式
|
|
背景模糊效果
本项目有两种不同的背景模糊,一个是filter:blur(10px)
,另一个是backdrop-filter:blur(10px)
。
1、filter:blur(10px) 所有子元素也会模糊,包括文字,所以header组件中,商家背景图单独成一个容器,采用绝对布局,z-index:-1
,这样可以避免背景模糊对其他元素的影响。另外,如果父容器下方有背景的阴影,设置overflow:hidden
即可!
|
|
2、backdrop-filter:blur(10px) 只模糊背景,不模糊其子元素。但这个特性只在ios设备有效,Android不支持!
transition过渡
transition在Vue2.0以后升级为
html:
|
|
javascript:
|
|
CSS:
|
|
更多关于
seller(商品)组件的滚动问题
1、初次打开seller页面,无法滚动
问题分析:我们知道better-scroll插件是一个依赖DOM的,页面刚刚打开的时候,DOM没有渲染完毕,程序此时就调用better-scroll所以无法滚动。
解决办法:在mounted()
钩子函数(Vue1.x用的是ready()
函数,)中创建/刷新better-scroll实例。
2、点击其他页面,再次回到seller页面时,无法滚动
问题分析:出现这个情况,是因为mounted()
函数在整个生命周期中只会执行一次。
解决办法:使用watch()
方法,并配合$nextTick()
。在watch方法中,监控seller
数据的变化,在文档渲染完毕后,重新创建/刷新better-scroll实例。
3、seller页面中,商家实景图片横向滚动问题
问题分析:better-scroll插件要求子容器宽度/高度要大于父容器才会滚动。而ul列表默认不会被内容撑开,
解决办法:给每个li设置display:inline-block
,然后手动设置ul的宽度,(每张图片的宽度+margin-right的值)*图片数量-最后一个marin-right。同时,new better-scroll对象时,需要设置scrollX: true,eventPassthrough: 'vertical'
(具体看下方代码)
|
|
window.localStorage的用法
此项目,将localStorage封装成一个通用的方法,并保存在src/common/js/store.js
中。收藏商家功能,体现了localStorage的用法。
App.vue动态给seller绑定id:
|
|
seller组件,使用loadFormLocal()加载本地内容:
|
|
seller组件,使用saveToLocal()把内容存储本地
|
|
store.js源码
|
|
解析地址栏中的url,并返回数据对象
使用window.localStorage.search可以获取地址栏中问号后面的数据。本项目,我们把用于解析url的函数封装在一个util.js
函数中。供app.vue动态给seller数据对象绑定商家的id,该函数源码如下:
|
|
此外,我们需要将得到的id和a带到数据中,实际上在获取数据的时候,并没有带着id和a,这时就要用到es6语法中Object.assign(),官方解释为:可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
在app.vue组件创建时,使用Object.assign()将id和a属性帮绑定到seller中:
|
|
使用keepalive属性
商品、评论、商家三个组件之间切换时,数据会被重新渲染,这不符合预期。解决办法是:在keepalive
。
|
|
vue-router2的使用
vue-router2 的用法与第一版有所变化,下方html代码中,注释部分是第一版的用法。
html代码:
|
|
路由配置:
|
|
vue-resource的使用
这个插件vue官方出的插件,这个插件的用法与vue-router的用法类似。其基本用法是使用Vue的实例调用get()方法获取数据,使用then()方法处理数据。
基本用法:
|
|
举个栗子:
|
|
Vue2.x组件间的通信问题
这是另一个话题了,打算另外开篇,感觉给自己挖了一个坑..
—2017-7-26 23:32—