vue 實戰 之 餓了嗎 頁頭模板
阿新 • • 發佈:2019-02-10
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>