首页导航栏的封装(navbar)
因为导航栏的通用性,在其它项目中可能可以用到,所以我们把它封装到components中的common里面去,命名为NavBar.vue
因为导航栏可能因为内容的改变而会有不同位置出现不同的内容,所以我们为其定义三个插槽,分别为左中右,同时定义样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
   | <template>   <div class="nav-bar">     <div class="left">       <slot name="left"></slot>     </div>     <div class="center">       <slot name="center"></slot>     </div>     <div class="right">       <slot name="right"></slot>     </div>   </div> </template>
  <script>   export default {     name: "NavBar"   } </script>
  <style scoped>   .nav-bar {     height: 44px;     display: flex;     text-align: center;     line-height: 44px;     box-shadow: 0 1px 1px rgba(100,100,100,.1)   }   .center {     flex: 1;   }   .right, .left {     width: 60px;   } </style>
   | 
 
接着,当然就是在首页引用该组件啦,在首页导入该组件,同时在插槽处添加所需加的内容,然后就是样式的相关修改了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
   | <template>   <div id="home">     <nav-bar class="home-nav">       <div slot="center">购物街</div>     </nav-bar>>   </div> </template>
  <script>   import NavBar from 'components/common/navbar/NavBar.vue'
    export default {     name:'Home',     components: {       NavBar     },     data () {       return{       }     },     created() {     },     computed: {     }   } </script>
  <style scoped>   #home {     padding-top: 44px;     position: relative;   }   .home-nav {     position: fixed;     top: 0;     left: 0;     right: 0;     color: white;     z-index: 10;     background-color: var(--color-tint);   } </style>
   | 
 
请求首页的多个数据
请求,就意味着我们需要书写网络请求相关代码了,安装axios插件
来到network下新建home.js文件,作为统一的网络请求
引入相关模块,并导出网络请求,使用函数getHomeMultidata封装该请求
1 2 3 4 5 6 7 8
   | import {request} from './request.js'
  export function getHomeMultidata() {   return request({     url: '/home/multidata'   }) } }
  | 
 
接着,在Home组件中,在其被创建(create)时加入该网络请求
1 2 3 4 5 6 7 8 9 10 11
   | import {getHomeMultidata, getHomeGoods} from 'network/home.js'
  export default {    name:'Home',    created() {       getHomeMultidata().then(res => {          this.banners = res.data.banner.list          this.recommends = res.data.recommend.list       })    }  }
  | 
 
定义一个data数据用来存储请求返回得到的数据(熟悉垃圾回收)
1 2 3 4 5 6
   | data () {   return{     banners: [],     recommends: []   } },
  | 
 
轮播图(swiper)
轮播图的制作后面要补上(vue实现)
这里根据设计图,将首页再次划分成几大模块

好吧,图有点丑,但不妨碍理解,这里,我们最终要呈现的是swiper这个大的组件,所以,为了让首页的逻辑更加清晰点,我们只定义上述图中的组件,而每个组件的内部实现,则由各自的组件去实现
所以,我们在home文件夹下新建childComps文件夹,新建HomeSwiper.vue,用来封装swiper相关组件
在HomeSwiper里,引入两个swiper相关模块并设置样式,好的,到这里,你就会发现父组件的数据咋办,是的,用props
HomeSwiper.vue
1 2 3 4 5 6 7 8
   | props: {   banners: {     type: Array,     default() {       return []     }   } }
  | 
 
Home.vue
1
   | <home-swiper :banners='banners'></home-swiper>
   | 
 
ok,放出HomeSwiper全部代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | <template>   <swiper>     <swiper-item v-for="(item,index) in banners">       <a :href="item.link">         <img :src="item.image" alt="">       </a>     </swiper-item>   </swiper> </template>
  <script> import { Swiper, SwiperItem } from 'components/common/swiper/index.js' export default {   name: 'HomeSwiper',   props: {     banners: {       type: Array,       default() {         return []       }     }   },   components: {     Swiper,     SwiperItem   } } </script>
  <style scoped> </style>
   | 
 
推荐信息的展示
这里没啥可说的,主要是用到v-for去展示推荐信息,直接看源码(HomeRecommend)
FeatureView的实现
这个更简单,案例直接写死了,直接放代码
TabControl
和推荐信息一个道理,没啥好说,最多就是样式上的修改
这里有一个重点说一下,其他直接看源码就可,在home.vue,为了实现tabControl吸顶效果,这里要使用到css一个属性position: sticky
1 2 3 4 5
   | .tab-control {   position: sticky;   top: 43px;   z-index: 10; }
  |