1. 程式人生 > >vue 實戰 之 餓了嗎 頁頭模板

vue 實戰 之 餓了嗎 頁頭模板

header 元件

js 定義方法和樣式

首先接收 由 main.js 傳過來的 sells 資料,利用這些資料渲染到html中,具體程式碼如下:

<script>
//匯入 評星star的元件
import star from 'components/star/star'

export default {
 //接收父元件 main.js 傳來的資料
  props: {
    seller: {
      type: Object
    }
  },
  //每個vue 例項被生成後呼叫這個函式
  created() {
  // 定義class的名稱,html可以直接動態的使用這些class
this.iconClassMap = ['decrease', 'discount', 'special', 'invoice', 'guarantee'] }, components: { star }, data() { return { //用來判斷是否顯示店面詳細資訊,預設不顯示 detailShow: false } }, methods: { showDetails() { this.detailShow = true; }, hideDetail() { this
.detailShow = false; } } }
</script>

渲染html ,顯示資料

這裡的html顯示的資料都是動態生成的,根據從main.js傳過來的資料
例如: 顯示圖片的商標

<img :src="seller.avatar" width="64" height="64" />

商家的資訊和描述資訊

<div class="title">
                <span class="brand"></span>
                <span class
="name">
{{seller.name}}</span> </div> <div class="description"> {{seller.description + ' / ' + seller.deliveryTime + '分鐘送達'}} </div>

注意的是,商家優惠活動和彈出商品優惠活動的資訊都要通過v-if指令來判斷
(1)商家優惠活動具體程式碼如下:

<div class="supports" v-if="seller.supports">
                <div class="supports_desc" >
                    <span class="icon" :class="iconClassMap[seller.supports[0].type]"></span>
                    <span class="text">{{seller.supports[0].description}}</span>
                </div>
            </div>

上述程式碼中 :class ,其實用的是 v-bind指令的簡寫。iconClassMap其實在上述js中已經定義了,對不同優惠的種類使用不同的class,相關class的css 定義如下:

.icon
            display inline-block
            vertical-align top
            width 12px
            height 12px
            margin-right 4px
            background-size 12px 12px
            background-repeat no-repeat
            &.decrease
              bg-image('decrease_1')
            &.discount
              bg-image('discount_1')
            &.guarantee
              bg-image('guarantee_1')
            &.invoice
              bg-image('invoice_1')
            &.special
              bg-image('special_1')
          .text
            line-height 12px
            font-size 10px

(2)彈出商家資訊
利用 v-if =”detailShow” 指令,根據detailShow是否為true ,來判斷是否彈出資訊,detailShow初始化為false,當用戶點選按鈕時,繫結showDetails事件 @click=”showDetails()”,此方法在js也已經定義,就是令當前的detailShow置為true,反之亦然。
注意的是,彈出加了個過渡效果transition,類似於css3
具體程式碼如下

// transition 過渡效果,判斷是否顯示
  <transition name="fade">
    <div v-if="detailShow" class="detail">
      <div class="detail-wrapper clearfix">
          <div class="detail-main">
            <h1 class="name">{{seller.name}}</h1>
            <div class="star-wrapper">
              <star :size="48" :score="seller.score"></star>
            </div>
            <div class="title">
              <div class="line"> </div>
              <div class="text">優惠資訊</div>
              <div class="line"></div>
            </div>
            <ul v-if="seller.supports" class="supports">
              <li class="support-item" v-for="item in seller.supports">
                <span class="icon" :class="iconClassMap[item.type]"></span>
                <span class="text">{{item.description}}</span>
              </li>
            </ul>
            <div class="title">
              <div class="line"></div>
              <div class="text">商家公告</div>
              <div class="line"></div>
            </div>
            <div class="bulletin">{{seller.bulletin}}</div>
          </div>
      </div>
      <div class="detail-close">
        <i class="icon-close" @click="hideDetail()"></i>
      </div>
    </div>
  </transition>