【Vue项目】去哪儿网APP②首页开发

重点思想

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

<template>

</template>
lll
<script>
export default {

}
</script>

<style lang="stylus" scoped>

</style>

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

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-active
    background: $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代码会经常用到,可建立一个styl文件,将其存为函数方便复用。

保证内容不超出父盒子

在一个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.data
      if (res.ret && res.data) {
        const data = res.data
        this.city = data.city
        this.swiperList = data.swiperList
        this.iconList = data.iconList
        this.recommendList = data.recommendList
        this.weekendList = data.weekendList
      }
    }
  },
  mounted () {
    this.getHomeInfo()
  }
  1. 在项目中,static文件夹是可以直接被外部访问到的,因此可以用来存放数据index.json。并且可以在.gitignore文件中设置static文件夹不上传至线上平台。
  2. 如果我们的代码要上线,那我们的地址就要写成/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中引入时需要在前面加~

全部评论

相关推荐

05-04 09:38
已编辑
门头沟学院 引擎开发
个人9本海硕,本硕期间一直在投游戏相关实习/校招,岗位由客户端-&gt;引擎-&gt;TA-&gt;AIGC。最终目标肯定是独游制作人,所以程序策划美术都点了些,感觉也没谁了。值此春招末尾总结下技术向校招要点,算是回馈牛客社区了。也附上我的Github和个人博客,欢迎各种交流讨论。&nbsp;前言&nbsp;首先是个人惯例的劝退游戏行业。参见缅怀故人&nbsp;和永远有多远&nbsp;,相比于互联网,游戏薪资大概相当但要求更高,加班严重且更为局限。如果你只是带着一腔热情想入这行,建议先找个日常实习了解下真实的游戏行业再做选择。&nbsp;准备&nbsp;当然,在你决定踏出这步后,第一步就是准备相关的笔试面试。这里先建议找到你感兴趣的公司岗位的JD,然后...
牛客28967172...:说的还是有道理的,我校招时就拿到过网易雷火好几个顶级项目组方向的offer,基本上流程和你说的一样。 但本质还是劝退互联网的游戏方向,本质上是代价更高,而且职业生涯容错率很低,方向比较窄。 代价是众所周知的严重加班,游戏大版本赶工基本上通宵无休,甚至国庆五一都没放假是常态。 职业生涯性价比低是因为游戏行业本质上就是赢家通吃,但你要跳槽只有腾讯网易等头部,要么就是米哈游莉莉丝库洛三七等少数中厂,然后就没了,公司是断崖的少 游戏开发相比互联网方向岗位非常非常少,比如网易整个雷火也才五六百人,里面十几个工作室,招人比例非常低,其他游戏公司也是一样。 而且方向也很窄,你做引擎开发就只能跳相关,你做游戏客户端也只能跳相关(游戏客户端都算吃香的,但市场hc也非常非常少,跳槽机会更少),基本上很难转回互联网 这里对比传统互联网,大厂多的都说不过来,而且容错率很大,你做搜索方向可以跳推荐,你做推荐方向可以跳广告,要求远没有游戏行业那么严,甚至你之前干测试都能跳槽研发方向
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务