A Vue.js project
采用vue框架搭载美团网前端页面
reset.css //格式化css
border.css //解决border 1px问题
iconfont //字体图标
css页面引入其他文件需要在前面添加 ~
css BFC概念
vue.cil //vue脚手架
Eslink //JavaScript检查语法
stylus //简化css语法插件
stylus-loader
FastClick //解决用户点击屏幕大约延迟300毫秒后才会触发点击事件问题
vue-awesome-swiper //vueSwiper插件 对象前记得加 .
axios //vue推荐ajax,可以实现跨平台
better-scroll //页面滑动插件
vuex //数据共享
babel-polyfill //解决白屏(浏览器不支持promise)
轮播页面算法:
computed: {
pages () {
const pages = []
this.iconList.forEach((item, index) => {
const page = Math.floor(index / 8)
if (!pages[page]) {
pages[page] = []
}
pages[page].push(item)
})
return pages
}
}
当网络较慢时加载页面时,下方字体可能会提前比上方图片预先加载,此时字体极有可能在图片位置停留,影响用户体验,采用以下方法解决:
height: 0
padding-bottom: 50% //高比宽的值,当页面加载直接保留图片的位置
内容溢出省略号(自己老是记不住哇记不住)
overflow: hidden
white-space: nowrap
text-overflow: ellipsis
ajax方式:fetch,vue-resource,axios(vue官方推荐,可以实现跨平台)
# axios安装
npm install axios --save
# axios使用promise所以要使用.then方法获取返回对象
swiper页面: 用空数组进行创建时,初始渲染页面内容为最后一项,需要进行数组长度判定,为空不创建,否则再创建
v-for可以循环数组,对象,循环对象有两个值(item,key),item是key对应的数组,item可以再次进行循环
let && const && var用法: 1.const定义的变量不可以修改,而且必须初始化 2.var定义的变量可以修改,如果不初始化会输出undefined,不会报错 3.let是块级作用域,函数内部使用let定义后,对函数外部无影响 手指滑动逻辑 查看代码注释 主要参数: touchstart:手指按下 touchmove:手指按下并移动 touchend:手指松开
1.localStorage缓存使用类似cookie不会自己消失 2.city页面优化,当选择新城市时才会重新发送ajax否则使用缓存ajax 3.在App.vue添加keepalive会自动添加两个钩子,activated,deactivated,由于keepalive会使用缓存,使用这两个钩子可以做进一步操作
存在BUG: 1.进入美食详情图片后,可以向下滚动
存在BUG:(解决) 1.首页下滑,点击进入详情页面也会下滑 解决办法:vue-router官网建议代码:
scrollBehavior (to, from, savedPosition) {
return { x: 0, y: 0 }
}
vue递归的使用
解决点击不同内容加载不同数据 第一步:通过首页点击获取当前点击的index值
import { mapMutations } from 'vuex'
methods: {
getIndex (index) {
// 向vuex传值
// this.$store.commit('changeIndex', index) 这个不用vue高级方法,直接通过commit方法将值传入到Mutations中
this.changeIndex(index) //使用vue高级方法省略上面繁琐步骤,进行直接调用
},
// 将changeIndex映射到mapMutations中可以直接调用
...mapMutations(['changeIndex'])
}
第二步:Mutations.js中进行监听,当调用index改变时对state数据进行修改
changeIndex (state, index) {
state.index = index
}
第三步:detail获取对应的id
created () { //主要不能用beforeCreate否则id值拿不到
this.id = this.$store.state.index
}
第四步:需要的地方直接获取id注意this的作用域
解决进入美食详情页面路由缓存问题
<keep-alive exclude="Detail">
</keep-alive>
但是会引入新的问题,detail-header方面滚动借用keepalive路由产生的两个钩子进行调用函数,所以detail-header页面需要把activated,deactivated两个钩子替换为mounted,unmounted钩子,便解决问题
- 解决文字上下左右居中 flex布局
display: flex
justify-content: center
align-items: center
- flex布局下文字隐藏切记需要在父级元素添加:flex:1
- img标签绑定属性时切记---:src="item.image" //不加双花括号
- for循环中若想引入常量需要进行绑定才可使用
<div v-for="(item,index) of comments" :key="index" :address="address">
<div>{{address}}</div>
</div>
存在BUG:(解决) 1.用户个人星星显示逻辑不清楚
- 解决方案:eg 页面两个用户 分数分别为 35,50
1:获取当前页面所有用户星星分数并且push到一个数组中 ["35", "50"] 2:for循环获取每个分数的十位 3 5 3:再利用for循环将获取值push到一个数组中 [1, 1, 1, 0, 0, 1, 1, 1, 1, 1] 3:利用数组的方法slice切割数组 0: (5) [1, 1, 1, 0, 0] 1: (5) [1, 1, 1, 1, 1] 4:循环用户获取computed中的值 :resultStar="resultStar" 5:星星标签中设置v-for="(item,index) of resultStar[index]" index为当前第几个用户 6:循环星星标签即可
多页面应用(返回html) 优点:首屏时间快,SEO效果好 缺点:页面切换慢
单页面应用(js渲染)推荐 优点:页面切换快 缺点:首屏事件慢,SEO差
vue项目打包: 1.
npm run build
2.打包完成后为 dist 包 也就是要上线的内容,可以放到后台服务器根路径下
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
For a detailed explanation on how things work, check out the guide and docs for vue-loader.