首页开发中的重难点

  • 重点思想:页面组件化
  • 页面组件化下的组件引入及使用
  • flex:1
  • 使用iconfont图标
  • 使用vue-awesome-swiper实现轮播效果
  • 实现带有分页器的轮播
  • 实现有分页效果的图标(icon)轮播区域
  • 用padding-bottom实现固定宽高比
  • 实现文本太多,显示省略号(…)效果:
  • 保证内容不超出父盒子
  • 使用vue axios来获取数据
  • 解决轮播图在使用axios获取数据后,出现刷新后首先播放最后一张图的问题
  • 代码优化

重点思想:页面组件化

第一次接触一个完整的Vue项目,从看视频一步一步的做,个人觉得最重要的思想就是,懂得页面组件化这个概念。
将一个页面分成各个部分,例如首页,将它分成头部、轮播图、图标区域、热销推荐区域以及周末去哪儿区域,每个区域都是由一个组件来开发实现。这样实现了页面中每个部分的开发实现自由,以及提高后续对某个部分修改维护的效率
在一个组件中,分别由三个部分组成,分别是模板template(页面展示代码),数据script(业务实现代码),样式style(页面布局代码)。
本次开发中,使用了stylus这个CSS预处理器。因此最终整个组件的初始化如下:

<template></template><script>
export default {}
</script><style lang="stylus" scoped></style>

其中,style中的scoped关键字代表该样式只对当前组件有效,实现局部化样式

页面组件化下的组件引入及使用

因为一个页面是由多个组件来构成的,则主页面需要引入局部组件,并且使用局部组件。

  1. 首先,引入组件:
import HomeHeader from './components/Header'
import HomeSwiper from './components/Swiper'
import HomeIcons from './components/Icons'
import HomeRecommend from './components/Recommend'
import HomeWeekend from './components/Weekend'

然后在components部分定义局部组件:

components: {HomeHeader,HomeSwiper,HomeIcons,HomeRecommend,HomeWeekend}
  1. 接着,在data部分中,返回通过axios获取到的页面数据:
data () {return {lastCity: '',swiperList: [],iconList: [],recommendList: [],weekendList: []}},

然后在模板块中使用局部组件,并通过父子组件传值,将通过axios获取到的页面数据传给局部组件:

<template><div><home-header></home-header><home-swiper :list="swiperList"></home-swiper><home-icons :list="iconList"></home-icons><home-recommend :list="recommendList"></home-recommend><home-weekend :list="weekendList"></home-weekend></div>
</template>

注意:所有局部组件包裹在一个<div>组件中
4. 局部组件中,通过props接收父组件传递的数据,并定义数据类型为Array:

props: {list: Array},

flex:1

在header-input区域中(中间输入框区域),采用flex布局。在左右区域设置width的情况下,设置flex:1,实现中间区域在剩下的区域间均匀分配空间(自由拓展)。

使用iconfont图标

首先,在iconfont官网选择好要使用的图标,将之加入购物车并下载。
接着,将下载后的尾缀.svg .ttf .woff .eot的字体文件放入styles中的iconfont文件夹中,并将iconfont.css文件放入styles文件夹中,还要改变iconfont.css中文件加载路径。
最后,在mian.js中引入iconfont.css文件:

import './assets/styles/iconfont.css'

使用vue-awesome-swiper实现轮播效果

首页开发中,轮播图区域、图标区域皆使用了swiper实现了轮播效果。

  1. 首先根据GitHub上vue-awesome-swiper,安装并引入使用swiper。
  2. 更多详细使用则是参考这个网站:vue轮播(完整详细版),在这个网站上可以参考实现轮播图自动切换的效果
  3. 在swiper中绑定了:options=“swiperOption”,所以我们也要在data中添加swiperOption对象
data () {return {swiperOption: {pagination: '.swiper-pagination',loop: true,// 自动切换效果autoplay: true,speed: 1500}}
}

实现带有分页器的轮播

  1. 首先,需要在data中定义以下代码:
data () {return {swiperOption: {//定义了轮播页码pagination: '.swiper-pagination'}}}
  1. 如果想要修改页码的颜色,则需要采用样式穿透(>>>):
.icons >>> .swiper-pagination-bullet-activebackground: $bgColor !important
  1. 如果实现轮播的自动播放以及循环播放,则可定义如下代码:
swiperOption: {pagination: '.swiper-pagination',//循环播放loop: true,// 自动切换效果autoplay: true,speed: 3000}

实现有分页效果的图标(icon)轮播区域

  1. 使用计算属性实现分页功能:list为icon的数据。一页只能有8个图标,**遍历list,当多余8个时,就要放到第二页去,即放到下一个轮播图中。**例如第九个icon,page=Math.floor(9 / 8)=1;说明第九个icon在第1页(页码从0开始算),这样就生成了带有分页效果的icon轮播区域
 computed: {pages () {const pages = []this.list.forEach((item, index) => {const page = Math.floor(index / 8)if (!pages[page]) {pages[page] = []}pages[page].push(item)})return pages}}
  1. 之后在swiper-slide中用v-for先遍历pages,生成多个swiper-slide,每个swiper-slide对应一页。在每个swiper-slide中遍历pages中的每个item,生成每页的icon,简单来说就是两个for循环的嵌套。
 <swiper :options="swiperOption"><swiper-slide v-for="(page,index) of pages" :key="index"><div class="icon" v-for="item of page" :key="item.id"><div class="icon-img"><img class="icon-img-content" :src="item.imgUrl" /></div><p class="icon-desc">{{item.desc}}</p></div></swiper-slide><div class="swiper-pagination"  slot="pagination"></div></swiper>

用padding-bottom实现固定宽高比

将height设置为0,padding-bottom会以宽度为标准撑出高度:
如以下代码:

height :0
padding-bottom :53%

这个方法也可以解决图片的抖动问题。

实现文本太多,显示省略号(…)效果:

overflow :hidden
white-space :nowrap
text-overflow :ellipsis

此处css代码会经常用到,可建立一个style文件,将其存为函数方便复用。

保证内容不超出父盒子

在一个flex布局中,设置flex:1,min-width: 0,保证内容不超出外层容器
如果没有设置min-width,当内容大于剩余盒子宽度时会超出父盒子,设置min-width保证内容局限在父盒子内。

使用vue axios来获取数据

axios是通过promise实现对ajax技术的一种封装

  1. 首先使用命令$ npm install axios --save安装以及在文件中引入。
  2. 使用以下代码实现使用axios来获取数据
methods: {getHomeInfo () {axios.get('/api/index.json').then(this.getHomeInfoSucc)},getHomeInfoSucc (res) {res = res.dataif (res.ret && res.data) {const data = res.datathis.city = data.citythis.swiperList = data.swiperListthis.iconList = data.iconListthis.recommendList = data.recommendListthis.weekendList = data.weekendList}}},mounted () {this.getHomeInfo()}

利用mounted()函数,当页面挂载成功后,调用getHomeInfo()函数,获取数据。
3. 在项目中,static文件夹是可以直接被外部访问到的,因此可以用来存放数据index.json。并且可以在.gitignore文件中设置static文件夹不上传至线上平台。
4. 如果我们的代码要上线,那我们的地址就要写成/api/index.json类似格式。此时,可以借助webpack-dev-server给我们提供了一个在config文件夹下的index.js中的proxyTable这个代理功能来解决这个问题。

    proxyTable: {'/api': {target: 'http://localhost:8080',pathRewrite:{'^/api': '/static/mock'}}}

解决轮播图在使用axios获取数据后,出现刷新后首先播放最后一张图的问题

在swiper中,使用v-if="list.length"判断list数组是否已经获取了ajax数据,如果数组为空时,swiper不会被创建。
不过为了减少在模板中出现逻辑性代码,采用计算属性来解决这个问题:

computed: {showSwiper () {return this.list.length}}

v-if则改为:v-if="showSwiper"

代码优化

  1. header中的背景色经常会被使用到,所以可以优化一下代码,在styles文件夹下创建一个varibles.styl文件,编写以下代码:
$bgColor = #00bcd4
  1. 为了简化引入路径,可以在build文件夹下的webpack.base.conf.js中编写以下代码:
'styles': resolve('src/assets/styles')

保存后,可以在引入varibles.styl时,使用该简化后的路径:

@import'~styles/varibles.styl'

注意:在css中引入样式时需要在import前加@;
在css中引入时需要在前面加~

【Vue项目】二、去哪儿网APP——首页开发相关推荐

  1. 【vue】二、vue2仿去哪儿网app——首页开发

    文章目录 二.vue2仿去哪儿网app--首页开发 Ⅰ 页面结构 Ⅱ 开发笔记及注意点 1.公共样式抽取 2.路径 --> 绝对路径 3.用padding-bottom实现固定宽高比 4.保证内 ...

  2. 六十五、完成Vue项目去哪儿网App首页开发(来源:慕课网)

    2020/10/21. 周三.今天又是奋斗的一天. @Author:Runsen @Date:2020/10/21 写在前面:我是「Runsen」,热爱技术.热爱开源.热爱编程.技术是开源的.知识是共 ...

  3. Vue 实例实战之 Vue webpack 仿去哪儿网App页面开发(应用中的几个页面简单实现)

    Vue 实例实战之 Vue webpack 仿去哪儿网App页面开发(应用中的几个页面简单实现) 目录 Vue 实例实战之 Vue webpack 仿去哪儿网App页面开发(应用中的几个页面简单实现) ...

  4. vue项目实战-去哪儿网

    前言 为了更快地上手学习vue,我在慕课网找到Dell-Lee老师的去哪儿网视频教程,听了老师讲的课程,的确非常受益.去哪儿网项目,是我学习vue练习做的第一个项目,也是目前来说用vue做的唯一的一个 ...

  5. 一.Vue2.5开发去哪儿网app首页⑤——图标区域轮播逻辑实现

    实现图标区域可以轮播 <template><swiper :options="swiperOption"><swiper-slide><d ...

  6. 六十四、Vue项目去哪儿网App开发准备

    2020/10/20 . 周二.今天又是奋斗的一天. @Author:Runsen @Date:2020/10/20 写在前面:我是「Runsen」,热爱技术.热爱开源.热爱编程.技术是开源的.知识是 ...

  7. 基于Mint UI和MUI开发VUE项目一之环境搭建和首页的实现

    一:简介 Mint UI 包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要.通过它,可以快速构建出风格统一的页面,提升开发效率.真正意义上的按需加载组件.可以只加载声明过的组件及其样式 ...

  8. 【Android自定义View实战】之仿去哪儿网App图片按压显示指纹并缩放效果TouchFingerImageView

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52986713 [DylanAndroid的csdn博客] 我们发现去哪儿网ap ...

  9. 实战项目:医院挂号网(ui组件开发)

    实战项目:医院挂号网 1 首页.UI组件-UiSearch 1.1 代码 2.首页.UI组件-UiTab 2.1 代码 2.2 注意点 3.首页.UI组件-UiBackTop 3.1 代码 3.2 注 ...

最新文章

  1. 和php区别_PHP中global与$GLOBALS的区别
  2. 一个数字可以在不损失精度的情况下达到的JavaScript的最高整数值是多少?
  3. 计算机网络第二章:物理层
  4. js返回上一页并刷新代码整理 转
  5. Java IO 之 SequenceInputStream 原理解析
  6. rman 备份后恢复整个数据库文件的操作
  7. Java基础学习总结(84)——Java面向对象六大原则和设计模式
  8. SoundWireServer使用以及失败问题
  9. 搞定操作系统面试,看这篇就够了(二)
  10. iperf3带宽测试工具
  11. C++大小写转换tolower/toupper以及transform函数
  12. transition transform属性造成文字抖动及模糊的解决方法
  13. Django设置中国时区问题
  14. hdu6194 string string string
  15. iOS 关于ASIHTTPRequest
  16. 【C++】手把手教你写出自己的Stack和Queue类
  17. linux内核协议栈 TCP层数据发送之TSO/GSO
  18. 农家女靠养花赚钱,年收入几十万
  19. 专业术语——Alpha 通道
  20. 天津杨柳青十八天“传销”经历

热门文章

  1. htcm8 android8,HTC全面屏手机 U11 Plus曝光:6寸+骁龙835,安卓8.0系统
  2. iCloud Drive,简单实用的苹果原生云存储
  3. 软件公司项目经理岗位职责
  4. lx2160a - uart2(ttyAMA1)调试
  5. 基于Javaweb的小项目(类似于qqzone) 7 —— 日志相关操作
  6. [NKNY]寒假培训《NY寒假有奖欢乐赛 》总结
  7. [转载] opencart支付宝 免费下载
  8. 字模在c语言运行后出现乱码,C语言字模问题
  9. jsx中文是什么牌子口红_cl口红是什么牌子 cl口红中文名字
  10. iframe嵌套百度地图