1)组件编写 ----- `Home/components/home-panel.vue`
<template>
<div class="home-panel">
<div class="container">
<div class="head">
<h3>
{{ title }}<small>{{ subTitle }}</small>
</h3>
<!-- 右侧内容区域 -->
<slot name="right" />
</div>
<!-- 主体内容区域 -->
<slot />
</div>
</div>
</template>
<script>
export default {
name: 'HomePanel',
props: {
// 主标题
title: {
type: String,
default: ''
},
// 副标题
subTitle: {
type: String,
default: ''
}
}
}
</script>
<style scoped lang='less'>
.home-panel {
background-color: #fff;
.head {
padding: 40px 0;
display: flex;
align-items: flex-end;
h3 {
flex: 1;
font-size: 32px;
font-weight: normal;
margin-left: 6px;
height: 35px;
line-height: 35px;
small {
font-size: 16px;
color: #999;
margin-left: 20px;
}
}
}
}
</style>
2)组件测试 -----------`views/playground/index.vue`
<template>
<!-- 面板组件测试 -->
<home-panel title="人气推荐" sub-title="人气爆款 不容错过">
<template #right>
<span>查看更多</span>
</template>
<template>
<div>我是主体内容</div>
</template>
</home-panel>
</template>
<script>
import HomePanel from '@/views/Home/components/home-panel'
export default {
components: {
HomePanel
}
}
</script>
使用例子1
<template>
<HomePanel title="新鲜好物" sub-title="新鲜出炉 品质靠谱">
<template #right>
<span>查看更多</span>
</template>
<template #default>
<ul ref="pannel" class="goods-list">
<li v-for="item in list" :key="item.id">
<RouterLink to="/">
<img :src="item.picture" alt="" />
<p class="name">{{ item.name }}</p>
<p class="price">¥{{ item.price }}</p>
</RouterLink>
</li>
</ul>
</template>
</HomePanel>
</template>
<script>
import HomePanel from './home-panel'
import { findNew } from '@/api/home'
import { ref } from 'vue'
export default {
components: {
HomePanel
},
setup () {
// 1.定义响应式数据
const list = ref([])
return {
list
}
}
}
</script>
<style scoped lang='less'>
.goods-list {
display: flex;
justify-content: space-between;
height: 406px;
li {
width: 306px;
height: 406px;
background: #f0f9f4;
// 激活效果
transition: all 0.5s;
&:hover {
transform: translate3d(0, -6px, 0);
box-shadow: 0 6px 8px rgba(0, 0, 0, 0.2);
}
// end
img {
width: 306px;
height: 306px;
}
p {
font-size: 22px;
padding-top: 12px;
text-align: center;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.price {
color: @priceColor;
}
}
}
</style>
使用例子2
<template>
<HomePanel title="人气推荐" sub-title="人气爆款 不容错过">
<ul class="goods-list">
<li v-for="item in goods" :key="item.id">
<RouterLink to="/">
<img :src="item.picture" alt="">
<p class="name">{{item.title}}</p>
<p class="desc">{{item.alt}}</p>
</RouterLink>
</li>
</ul>
<template #right>
<span>查看更多</span>
</template>
</HomePanel>
</template>
<script>
import HomePanel from './home-panel'
import { findHot } from '@/api/home'
export default {
name: 'HomeHot',
components: { HomePanel },
data () {
return {
goods: []
}
},
async created () {
const data = await findHot()
this.goods = data.result
}
}
</script>
<style scoped lang='less'>
.goods-list {
display: flex;
justify-content: space-between;
height: 426px;
li {
width: 306px;
height: 406px;
img {
width: 306px;
height: 306px;
}
p {
font-size: 22px;
padding-top: 12px;
text-align: center;
}
.desc {
color: #999;
font-size: 18px;
}
}
}
</style>
通过使用例子1和使用例子2,可以看出----插槽的位置只和模板位置有关,跟使用插槽的template无关