具名插槽
使用方法
1.编写使用的组件模板,模板中的插槽添加name属性
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
| <template> <div id="Category"> <h3>{{ title }}分类</h3> <slot name="center">1. 我是一些默认值,当使用者没有传递具体结构时,我会出现</slot> <slot name="footer">2. 我是具名插槽</slot> </div> </template> <script> export default { name: "Category", props:['listData','title','img','video'] }; </script>
<style scoped> #Category { background-color: skyblue; width: 200px; height: 300px; } h3 { background-color: orange; } img { width: 150px; height: 100px; } video { width: 100%; } </style>
|
2.在APP.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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| <template> <div id="app"> <Category :listData="foods" title="美食"> <!-- <ul> <li v-for="(food, index) in foods" :key="index">{{ food }}</li> </ul> --> <img src="https://img95.699pic.com/photo/50099/7021.jpg_wh860.jpg" slot="center" /> <!-- slot属性:填坑的时候告诉Vue要给哪个坑【插槽】填东西,Vue会将slot属性所在的元素放到坑里 --> <a href="#" slot="footer">更多美食</a> </Category> <Category :listData="games" title="游戏"> <ul slot="center"> <li v-for="(game, index) in games" :key="index">{{ game }}</li> </ul> <!-- 1. 注意:空格分隔处依旧能点击跳转,非合适代码(看效果图) --> <!-- 往同一个坑里填多个东西,只会追加,不会覆盖 --> <!-- 往同一个坑里填多个东西时,如果每个东西分开写,slot属性要写多次 --> <a href="#" slot="footer">单机游戏 </a> <a href="#" slot="footer">网络游戏</a> </Category> <Category :listData="films" title="电影"> <!-- <ul> <li v-for="(film, index) in films" :key="index">{{ film }}</li> </ul> --> <video src="http://vjs.zencdn.net/v/oceans.mp4" controls slot="center" ></video> <!-- 2. 解决a标签跳转 使用div容器+类选择器 --> <!-- <div slot="footer" class="footer"> <a href="#">经典</a> <a href="#">热门</a> <a href="#">推荐</a> </div> <h4 slot="footer">欢迎前来观影</h4> -->
<!-- 3. 包裹多层div 换成不影响结构的template【不生成真实的DOM元素】 --> <!-- <template slot="footer"> --> <!-- 4. 具名插槽的新写法【只能用在template标签上,div上报错】【Vue2.6+ 才支持】 --> <template v-slot:footer> <template class="footer"> <a href="#">经典</a> <a href="#">热门</a> <a href="#">推荐</a> </template> <h4>欢迎前来观影</h4> </template> </Category> </div> </template>
<script> import Category from "./components/Category.vue"; export default { name: "App", data() { return { foods: ["火锅", "烧烤", "小龙虾", "牛排"], games: ["红色警戒", "穿越火线", "劲舞团", "超级玛丽"], films: ["《教父》", "《拆弹专家》", "《你好,李焕英》", "《尚硅谷》"], }; }, components: { Category, }, }; </script>
<style scoped> #app { text-align: center; color: #2c3e50; margin-top: 60px;
display: flex; justify-content: space-around; } .footer { display: flex; justify-content: space-around; } </style>
|