1. 程式人生 > >app ziroom 的 Vue 重構(三)

app ziroom 的 Vue 重構(三)

原始碼地址:https://github.com/BokeChen/Vue-ziroom
接著講:合租/整租 home頁面的實現
4.編寫Footer 公共元件
從頁面佈局來看,可以看出Footer是通過position:fixed來定位的,而且其他頁面都有。所以把它歸類為公共元件。
在src 的components下面新建Footer.vue 檔案。

<template>
  <div class="footer">

  </div>
</template>

<script>
export default {
  name: 'Footer'
, data () { return { } } }
</script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style lang="less" scoped> @import '../style/mixin.less'; .footer{ } </style>

拷入footer用到的雪碧圖(IconList1.png)到src的assets資料夾下面。IconList1.png 是通過手機截圖然後ps切出來的整合的圖片。手機截出來的原圖是手機螢幕的兩倍,為了省事,我修改了html的視口比例,設定initial-scale=0.5。這樣css的尺寸就可以直接用截圖的尺寸了。
footer公共元件建立好後,需要在首頁裡面引用。
home裡面的引用:

<template>
  ...
    <Footer activeTapIndex="0"></Footer>
...
</template>
<script>
import Footer from '../../components/Footer.vue';
export default {
 ...
 mponents:{
        Footer,//子元件宣告
    }
 ...
}
</script>

Footer:

<template>
  <div class="footer">
<ul class="footer-ul"> <li v-for="(item ,index) in links"> <router-link v-bind:to="item" v-bind:class="(index==activeTapIndex)?('activeColor'+index):''"> <i class="footer-Icon"></i> <p>
{{linkContent[index]}}</p> </router-link> </li> </ul> </div> </template> <script> export default { name: 'Footer', props: ["activeTapIndex"],//父元件的傳值,告訴子元件要啟用的選項 data () { return { links: ['/home','/apartment','/postStacks','lifeService','/main'],//導航的路由 linkContent: ['合租/整租','自如寓','民宿/驛棧','生活服務','我的'],//導航欄文字說明 } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style lang="less" scoped> @import '../style/mixin.less';//引進@rootFontSize等一些基本設定值 .footer{ height:120rem/@rootFontSize; width:100%; background-color:white; ul{ display:flex; justify-content: space-between; p{color:@comonColorGray;} } //li 單獨放出來了是為了縮減選擇器的層級,推薦選擇器的層級最好不大於3級 li{ padding-top:24rem/@rootFontSize; width:20%; text-align: center; .footer-Icon{ display:inline-block; width:49rem/@rootFontSize; height:45rem/@rootFontSize; background:url(../assets/IconList1.png) no-repeat 0 0; background-size:736rem/@rootFontSize 518rem/@rootFontSize; //限制背景圖的大小 } } li:nth-child(1) .footer-Icon{ background-position: 0 0;//雪碧圖的取圖方法 } li:nth-child(2) .footer-Icon{ background-position: -149rem/@rootFontSize 0;//雪碧圖的取圖方法 } li:nth-child(3) .footer-Icon{ background-position: -299rem/@rootFontSize 0;//雪碧圖的取圖方法 } li:nth-child(4) .footer-Icon{ background-position: -446rem/@rootFontSize 0;//雪碧圖的取圖方法 } li:nth-child(5) .footer-Icon{ background-position: -594rem/@rootFontSize 0;//雪碧圖的取圖方法 } .activeColor0{ p{color:@comonColorBlack;}//被啟用的選單,字型變黑顯示 .footer-Icon{ background-position: 5rem/@rootFontSize -70rem/@rootFontSize !important;//雪碧圖的取圖方法 }} .activeColor1{ p{color:@comonColorBlack;}//被啟用的選單,字型變黑顯示 .footer-Icon{ background-position: -149rem/@rootFontSize -70rem/@rootFontSize !important;//雪碧圖的取圖方法 }} .activeColor2{ p{color:@comonColorBlack;}//被啟用的選單,字型變黑顯示 .footer-Icon{ background-position: -299rem/@rootFontSize -70rem/@rootFontSize !important;//雪碧圖的取圖方法 }} .activeColor3{ p{color:@comonColorBlack;}//被啟用的選單,字型變黑顯示 .footer-Icon{ background-position: -446rem/@rootFontSize -70rem/@rootFontSize !important;//雪碧圖的取圖方法 }} .activeColor4{ p{color:@comonColorBlack;}//被啟用的選單,字型變黑顯示 .footer-Icon{ background-position: 594rem/@rootFontSize -70rem/@rootFontSize !important;//雪碧圖的取圖方法 }} } </style>

在公共樣式裡面新增.footer的類設定
common.less:

...
.footer{
    position:fixed;
    bottom:0;
    left:0;
  }

執行後的效果圖:
這裡寫圖片描述

5.編寫Header公共元件
在components資料夾下面新增Header.vue 。header.vue 所需要的背景圖放置的assets資料夾下面。

Header.vue:
<template>
  <header class="header">
    <div>
     <p v-if="bannerScrollTop<50">
      <img class="header-logo" v-bind:src="require('../assets/ziroomlogo.png')"/>
      <span class="header-province">{{province}}</span>
     </p>
     <p v-else>
     <i class="header-serchIcon"></i>
      <input class="header-searchInp" type="text"  />
     </p>

      <span class="header-msgTip"></span>
      </div>
  </header>
</template>

<script>
export default {
  name: 'Header',
   props: ["bannerScrollTop","searchInputShow","province"],//父元件的傳值,告訴子元件要啟用的選項
  data () {
    return {

    }
    } 
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less" scoped>
  @import '../style/mixin.less';//引進@rootFontSize等一些基本設定值
  .header{
    width:100%;
    height:76rem/@rootFontSize;
    line-height:70rem/@rootFontSize;
    background-color:@comonColorWhite;
   div{

    position:relative;
    p{height:100%;line-height:76rem/@rootFontSize;}
    .header-logo{
     padding-left:28rem/@rootFontSize;
     padding-right:30rem/@rootFontSize;
     padding-top:19rem/@rootFontSize;
    }
    .header-province{
      font-size:24rem/@rootFontSize;
      padding-right:24rem/@rootFontSize;

      background:url(../assets/IconList1.png) no-repeat -43rem/@rootFontSize -138rem/@rootFontSize;
      background-size:@IconListWidth @IconListheight;
    }
    .header-msgTip{
      position:absolute;
      top:19rem/@rootFontSize;
      right:26rem/@rootFontSize;
      width:38rem/@rootFontSize;
      height:38rem/@rootFontSize;
      background:url(../assets/IconList1.png) no-repeat 0rem/@rootFontSize -139rem/@rootFontSize;
      background-size:@IconListWidth @IconListheight;

    }
    .header-searchInp{
      width:631rem/@rootFontSize;
      height:61rem/@rootFontSize;
      border-radius:63rem/@rootFontSize;
      font-size:28rem/@rootFontSize;
      border:none;
      outline:none;
      background-color:@comonColorGray;
      margin-left:29rem/@rootFontSize;
      padding-left:70rem/@rootFontSize;
      padding-right:30rem/@rootFontSize;
    }
    .header-serchIcon{
      position:absolute;
      top:23rem/@rootFontSize;
      left:54rem/@rootFontSize;
      width:32rem/@rootFontSize;
      height:32rem/@rootFontSize;
      background:url(../assets/IconList1.png) no-repeat -156rem/@rootFontSize -146rem/@rootFontSize;
      background-size:@IconListWidth @IconListheight;

    }
   }
  }
</style>

在home.vue 裡面引進Header.vue:

<template>
...
<Header bannerScrollTop="0" searchInputShow="1" province="北京"></Header>
...
</template>
<script>
import Header from '../../components/Header.vue';
 export default{
 ...
  components:{
        Footer,//子元件宣告
        Header
    }
 ...
}
</script>

在common.less 裡面新增固定定位。
common.less

...
.header{
    position:fixed;
    top:0;
    left:0;
    z-index:1;
}
...

Head.vue 元件基本寫完,就是還差點樣式過渡效果。
其他元件的編寫,都差不多這個思路。下面幾章就不詳細將講元件編寫了,就選擇性的講講元件的編寫的一些優化的點或者難實現的點。
現在還在編寫首頁樣式,等完成了再寫部落格。
現完成的首頁的樣式效果:
這裡寫圖片描述
一個人切圖拼圖量尺寸,寫html寫樣式,再寫js,這些活都很需要時間,所以整體進度會有點點慢。如果這些頁面都寫完,後面我會考慮用nodejs+mySql寫個後臺。