Vue 插槽

一、概念

要了解 slot 插槽 , 首先需要了解自定义组件,以及组件中的模板

举例:
自定义一个组件名 tag1

//组件模板为
var tag1mes = {
  template:`<dl> 
    <dt>狮子</dt>
    <dd>是一种生存在非洲与亚洲的大型猫科动物</dd>
  </dl>`
}
...定义一个局部组件
components:{
   tag1:tag1mes
}
...

在结构中加入这个组件<tag1></tag1>,利用浏览器调试工具,可以看到渲染的结构为

<dl>
  <dt>狮子</dt>
  <dd>是一种生存在非洲与亚洲的大型猫科动物</dd>
</dl>
模板页面渲染

此时此刻,如果我们想进一步丰富template模板中展示内容的灵活性,可以借助插槽slot
需求:如果我们想把模板中的狮子替换成老虎

二、如何实现?

匿名插槽

<tag1>老虎</tag1>  //将要写的内容写在标签内,像HTML标签一样

var tag1mes = {
  template:`<dl> 
    <dt><slot></slot></dt>  //添加的位置上,增加<slot></slot>标签
    <dd>是一种生存在非洲与亚洲的大型猫科动物</dd>
  </dl>`
}

渲染后,狮子就变成老虎了


匿名插槽

此外可以添加默认值

var tag1mes = {
  template:`<dl> 
    <dt><slot>狮子</slot></dt>  //slot中为默认值
    //slot中的是默认的,<tag1>标签内为用户设置的,【设置没有显示默认,设置有,显示设置的】
    <dd>是一种生存在非洲与亚洲的大型猫科动物</dd>
  </dl>`
}

呈现效果
<tag1>老虎</tag1>,渲染标题为老虎,
<tag1></tag1> 渲染结果为,默认的狮子,
最后,由于这种<slot></slot>插槽没有name属性,因此叫【匿名插槽】

具名插槽
需求:如果不仅替换标题,还要替换标题的内容描述,怎么办?
显然
<tag1> 老虎, 大型猫科动物;毛色浅黄或棕黄色,满身黑色横纹;头圆、耳短,耳背面黑色,中央有一白斑甚显著。 </tag1>
怎么分开对应dt,dd标签是个问题

这时候可以使用具名插槽,见例子

<tag1 :fatherdata="fatherdata">
        <template slot="tit">老虎</template>
        <template slot="mes">大型猫科动物;毛色浅黄或棕黄色,满身黑色横纹;头圆、耳短,耳背面黑色,中央有一白斑甚显著。</template>
</tag1>

template:` <dl>
      <dt><slot name="tit">狮子</slot></dt>
      <dd><slot name="mes">是一种生存在非洲与亚洲的大型猫科动物</slot></dd>
</dl>`

通过slot name的属性,将template slot="name名" 一一对应起来


具名插槽
三、新版本语法 v-slot

Vue的版本官方一直在更新变化,其中上面使用的 slot="xx" 以及后面会提及的 scope-slot="xx" 在2.6.0+ 中已弃用
所以我们要使用新的v-slot
语法格式

v-slot:slotName  //slotName不能加双引号“”

匿名插槽在新语法下,默认指向default

v-slot:default

例子修改,结果仍然正常

<tag1 :fatherdata="fatherdata">
        <template v-slot:tit>老虎</template>
        <template v-slot:mes>大型猫科动物;毛色浅黄或棕黄色,满身黑色横纹;头圆、耳短,耳背面黑色,中央有一白斑甚显著。</template>
</tag1>

注意事项
在旧版本中slot="xxx"的情况下,可以挂载在非 template标签上,如:

<p slot="tit">老虎</p>

但是在v-slot:tit的情况下,必须使用template标签

<template v-slot:tit>老虎</template>

否则报错:
Failed to compile.
v-slot can only be used on components or <template>.

简写方式
如果你想使用简写语法,必需指定插值的名字

v-slot:header 简写成 #header
v-slot:default 简写成 #default
四、作用域插槽

意义何在?
如果你想 父组件访问子组件内部数据

语法格式:旧版本 slot-scope

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

针对上面例子

//新旧语法不能混用在一个组件标签上
//slot="xxx" slot-scope="xx" 均为旧写法,是可以的
//v-slot:xxx slot-scope="xxx" 新旧写法混合,直接报错
//渲染错误: Unexpected mixed usage of different slot syntaxes

<tag1>
        <template slot="tit" slot-scope="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>`
}

新语法格式为

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>`
}

上结果


作用域插槽

作用域插槽图解
父组件访问子组件内部数据

作用域插槽图解

插槽父子之间传值 2.6+

父组件

<template #swiperSlide='{dataMes}'>
  ...
</template>

子组件

<slot 
  name="swiperSlide" 
  :dataMes='dataMes'
></slot>

说明:
父组件通过 #slotName 获取子组件 ,
通过 { 数据名 } 获取子组件中的数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342