由来:

自定义组件,以及组件中的模板

  1. 定义一个组件名 tag1
  2. var tag = {
  3. template: `
  4. <dl>
  5. <dt>狮子</dt>
  6. <dd>是一种猛兽</dd>
  7. </dl>
  8. `
  9. }
  10. // 定义一个局部组件
  11. components:{
  12. tag1
  13. }

在页面结构中,使用组件

  1. <tag1></tag1>

模板写法固定,于是 就有了 灵活的 插槽。

匿名插槽

  1. // <tag1>老虎</tag1>
  2. var tag1 = {
  3. template: `
  4. <dl>
  5. <dt>
  6. <slot></slot>
  7. </dt>
  8. <dd>是一种猛兽</dd>
  9. </dl>
  10. `
  11. }

标签内的内容会替换 模板中 slot 插槽的位置。
模板中的slot中,可以预先定义默认值,书写页面结构时,没有传入内容,使用默认值。

具名插槽

替换了标题,还要替换描述得话,一个插槽就不够用了。

  1. var tag2 = {
  2. template: `
  3. <dl>
  4. <dt>
  5. <slot name="title" />
  6. </dt>
  7. <dd>
  8. <slot name="desc"/>
  9. </dd>
  10. </dl>
  11. `
  12. }
  1. <tag2>
  2. <tempalte slot="title">狮子</template>
  3. <tempalte slot="desc">是猛兽。</template>
  4. </tag2>

新版本 插槽

  1. <tag2>
  2. <tamplate v-slot:title>老虎</template>
  3. <tamplate v-slot:desc>是猛兽。</template>
  4. <!-- 简写 -->
  5. <tamplate #title>老虎</template>
  6. <tamplate #desc>是猛兽。</template>
  7. </tag2

作用域 插槽

旧版本 slot-scope

slot-scope="slotProps" slotProps 是自定义的变量名,指向子组件中的 data 函数返回值

  1. // 新旧语法不能混合使用在一个组件标签上
  2. // slot="xxx" slot-scope="xx" 都是旧标签,是可以的
  3. // v-slot:xxx slot-scope="xxx" 新旧混合 mixed,会报错
  4. `<tag1>
  5. <template slot="titile" slot-scope="slotProps">
  6. {{ slotProps.text1 }}
  7. </template>
  8. <template v-slot:desc></template>
  9. </tag1>
  10. `
  11. var tag1={
  12. data:function(){
  13. return {
  14. text1:'子组件的内容'
  15. }
  16. },
  17. template:` <dl>
  18. <dt><slot name="tit" v-bind:txt1="txt1">狮子</slot></dt>
  19. <dd><slot name="mes">是一种生存在非洲与亚洲的大型猫科动物</slot></dd>
  20. </dl>`
  21. }

新版本

  1. // v-slot:tit="slotProps" //slotProps为自定义的变量名,指向子组件中的data函数返回值
  2. //将具名插槽赋值,很简洁;
  3. //不仅完成插槽指向,还完成了数据挂载
  4. `<tag1>
  5. <template v-slot:tit="slotProps">
  6. {{slotProps.txt1}}
  7. </template>
  8. <template v-slot:mes></template>
  9. </tag1>
  10. `
  11. var tag1mes = {
  12. data:function(){
  13. return {
  14. txt1:'我是子组件里的数据: 猫头鹰'
  15. }
  16. },
  17. template:` <dl>
  18. <dt><slot name="tit" v-bind:txt1="txt1">狮子</slot></dt>
  19. <dd><slot name="mes">是一种生存在非洲与亚洲的大型猫科动物</slot></dd>
  20. </dl>`
  21. }

参考: