关于vue 的slot分发内容 (多个分发)
时间:2022-08-23 10:22:25|栏目:vue|点击: 次
slot分发内容 (多个分发)
组件模板-元素可以用一个特殊的属性 name 来配置如何分发内容。多个 slot 可以有不同的名字。具名 slot 将匹配内容片段中有对应 slot 特性的元素
<style media="screen"> .panel{ margin:10px;width:150px; border:1px solid #ccc } .panel-header,.panel-bottom{ height: 20px; background-color:antiquewhite; } .panel-body{ min-height: 50px; } </style>
<div class="app"> <!--多个slot分发内容 v-for遍历--> <panel2 v-for="item in list"> <h2 slot="title">{{item.title}}</h2> <p slot="desc">{{item.desc}}</p> <span slot="tims">{{item.tims}}</span> </panel2> </div>
<!--组件模板--> <script type="text/x-Template" id="panelTpl"> <div class="panel"> <div class="panel-header"><slot name="title"></slot></div> <div class="panel-body"> <slot name="desc"></slot> </div> <div class="panel-bottom"><slot name="tims"></slot></div> </div> </script>
<script type="text/javascript"> var panelTpl={ template:'#panelTpl' } var vm=new Vue({ el:'.app', components:{//注册组件 "panel2":panelTpl }, data:{ list:[ {title:'新闻一标题',desc:'一的描述',tims:'2018-07-19'}, {title:'新闻二标题',desc:'二的描述',tims:'2018-07-18'}, {title:'新闻三标题',desc:'三的描述',tims:'2018-07-17'} ] } }); </script>
slot的多种用法
基本用法
//组件 <template> <div class="com"> <slot name="header"></slot> <slot>如果没有插槽或者不具名就是显示当前</slot> <slot name="floot"></slot> </div> </template> <script> export default { } </script> //使用 <template> <div id="app"> <com> <div class="header" slot="header"> 我将会插入到名为header的插槽当中 </div> <div class="floot" slot="floot"> 我将会插入到名为floot的插槽当中 </div> </com> </div> </template> <script> import com from '@/components/com.vue'; export default { name:"App", components:{ com } } </script>
插槽中使用data
//组件 <template> <div class="com"> <slot name="header" :slotData="comData"></slot>//slotData表示插槽key值 <slot>如果没有插槽或者不具名就是显示当前</slot> <slot name="floot" :slotData="comData"></slot> </div> </template> <script> export default { data() { return { comData:{ header:"我将会插入到名为header的插槽当中", floot:"我将会插入到名为floot的插槽当中" } } }, } </script> //使用 <template> <div id="app"> <com> <template v-slot:header="{slotData}"> //必须使用template包裹,v-slot后面跟着的是插槽名,slotData插槽里表示的key值 <div class="header"> {{slotData.header}} </div> </template> <template v-slot:floot="{slotData}"> <div class="floot"> {{slotData.floot}} </div> </template> </com> </div> </template> <script> import com from '@/components/com.vue'; export default { name:"App", components:{ com } } </script>
动态插槽
//组件 <template> <div class="com"> <slot name="header" :slotData="comData"></slot> <slot name="body" :slotData="comData"></slot> <slot name="floot"></slot> </div> </template> <script> export default { data() { return { comData:{ header:"我将会插入到名为header的插槽当中", body:"我将会插入到名为body的插槽当中" } } }, } </script> //使用 <template> <div id="app"> <com> <template v-slot:[slotName]="{slotData}"> <div class="slot"> {{slotData[slotName]}} </div> </template> <div class="floot" slot="floot"> <button @click="changeSlotName">改变动态插槽</button> </div> </com> </div> </template> <script> import com from '@/components/com.vue'; export default { name:"App", components:{ com }, data(){ return{ slotName:"header" } }, methods: { changeSlotName(){ this.slotName = this.slotName === "header" ? "body" : "header"; } } } </script>