由来:
自定义组件,以及组件中的模板
定义一个组件名 tag1var tag = {template: `<dl><dt>狮子</dt><dd>是一种猛兽</dd></dl>`}// 定义一个局部组件components:{tag1}
在页面结构中,使用组件
<tag1></tag1>
匿名插槽
// <tag1>老虎</tag1>var tag1 = {template: `<dl><dt><slot></slot></dt><dd>是一种猛兽</dd></dl>`}
标签内的内容会替换 模板中 slot 插槽的位置。
模板中的slot中,可以预先定义默认值,书写页面结构时,没有传入内容,使用默认值。
具名插槽
替换了标题,还要替换描述得话,一个插槽就不够用了。
var tag2 = {template: `<dl><dt><slot name="title" /></dt><dd><slot name="desc"/></dd></dl>`}
<tag2><tempalte slot="title">狮子</template><tempalte slot="desc">是猛兽。</template></tag2>
新版本 插槽
<tag2><tamplate v-slot:title>老虎</template><tamplate v-slot:desc>是猛兽。</template><!-- 简写 --><tamplate #title>老虎</template><tamplate #desc>是猛兽。</template></tag2
作用域 插槽
旧版本 slot-scope
slot-scope="slotProps" slotProps 是自定义的变量名,指向子组件中的 data 函数返回值
// 新旧语法不能混合使用在一个组件标签上// slot="xxx" slot-scope="xx" 都是旧标签,是可以的// v-slot:xxx slot-scope="xxx" 新旧混合 mixed,会报错`<tag1><template slot="titile" slot-scope="slotProps">{{ slotProps.text1 }}</template><template v-slot:desc></template></tag1>`var tag1={data:function(){return {text1:'子组件的内容'}},template:` <dl><dt><slot name="tit" v-bind:txt1="txt1">狮子</slot></dt><dd><slot name="mes">是一种生存在非洲与亚洲的大型猫科动物</slot></dd></dl>`}
新版本
// v-slot:tit="slotProps" //slotProps为自定义的变量名,指向子组件中的data函数返回值//将具名插槽赋值,很简洁;//不仅完成插槽指向,还完成了数据挂载`<tag1><template v-slot:tit="slotProps">{{slotProps.txt1}}</template><template v-slot:mes></template></tag1>`var tag1mes = {data:function(){return {txt1:'我是子组件里的数据: 猫头鹰'}},template:` <dl><dt><slot name="tit" v-bind:txt1="txt1">狮子</slot></dt><dd><slot name="mes">是一种生存在非洲与亚洲的大型猫科动物</slot></dd></dl>`}
参考:
