关于插槽那点事

属于每次面试都会被问到,懂但是不知道咋说那种(好吧,主要是我菜我不会),所以今天专门整理一下
我学一个新东西一般都是“3W1H”

What是什么

Vue 实现了一套内容分发的 API,将<slot>元素作为承载分发内容的出口。说白了slot就是个槽口就是个坑(此坑非彼坑),你在使用组件时可以拿内容去填坑,子组件在自己的模板中去渲染父组件传递过来的内容。

Why 为什么用

丰富组件内容和布局的灵活性,增强组件的扩展性和实用性,让用户可以去更好地复用组件和对其做定制化处理

Where在哪用

其实知道了为什么用就大致知道了在哪用,这个没有硬性要求。例如如果父组件在使用到一个复用组件的时候,在不同的地方有少量的更改,这种情况没有必要去重写,此时我们就可以使用插槽。当然还需根据自己项目实际情况来,不做过多赘述

How怎么用

插槽分为三种:默认插槽、具名插槽以及作用域插槽
常规使用组件

//APP.vue
<my-slot></my-slot>

MySlot内容

<p>this is start</p>
<p>this is end</p>

效果如下
effect1.png
  • 默认插槽:

父组件在子组件<slot> </slot>处插入内容

<my-slot :name="name">
  <p>该我表演了</p>
</my-slot>

子组件:

<p>this is start</p>
  <slot></slot>
<p>this is end</p>

效果如下:
effect2.png

检查代码元素,发现以上代码就相当于


element.png

有的小伙伴可能会问那它有没有默认值呢,我们之前学过的很多东西都有默认值,例如函数参数,props,provide/inject等等,答案是有的,我们直接在槽口里面写入默认模版/代码即可,如
//父组件
<my-slot></my-slot>
//子组件
<p>this is start</p>
    <slot><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot>
<p>this is end</p>

效果
effect3.png

以上代码就相当于
dmslot3.png

如果我们派发不止一个元素那将显示哪个呢?第一个?最后一个?还是所有
光说没用,咱得试试
//父组件
<my-slot :name="name">
  <p>该我表演了</p>
  <span>瞅瞅</span>
  <button>click Me!  click Me!</button>
</my-slot>

效果:
effect4.png

如果我们有多个槽口呢?都显示吗?

//子组件
<p>this is start</p>
    <slot><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot>
    <slot><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot>
    <slot><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot>
<p>this is end</p>

效果:
effect5.png

那可不,都显示了呢
还有没有问题,没有问题我提了啊。如果我要指定某元素派发到某槽口呢?例如刚刚你是发传单,见人就发,现在我只让你发给穿黄衣服的人。也就是我们现在要在父组件中,精确的在想要的位置,插入对应的内容呢,这就引出了具名插槽

  • 具名插槽
    怎么样能让原有插槽成为具名插槽呢,倒也简单,给插槽命一个名即可,即添加name属性。
//子组件
<p>this is start</p>
  <slot name="title"
    ><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot
  >
  <slot name="con"
    ><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot
  >
  <slot name="btn"
    ><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot
  >
<p>this is end</p>

父组件通过v-slot : name 的方式添加内容:

<my-slot>
  <template v-slot:title>
    <p>该我表演了</p>
  </template>
  <template v-slot:con>
    <span>瞅瞅</span>
  </template>
  <template v-slot:btn> <button>click Me! click Me!</button> </template>
</my-slot>

注:为了方便,书写 v-slot:xx 的形式时,可以简写为 #xx。自己可以试试,我就不演示了
另外说一点插槽名也是有默认值的,默认值很默认,那就是default。。。例如

//子组件
<p>this is start</p>
  <slot name="title"
    ><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot
  >
  <slot name="con"
    ><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot
  >
  <slot><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot>
  <slot name="btn"
    ><span> 如果你看到我,那我就是默认值,没有人和我玩</span></slot
  >
<p>this is end</p>

父组件:
1.png
  • 作用域插槽
    插槽和模版都有编译作用域,父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。父组件不能直接使用子组件内的数据,那怎么才能访问子组件作用域,使用子组件的数据呢?我们把需要传递的内容绑到 <slot> 上,然后在父组件中用v-slot设置一个值来接收我们传递过来的数据:
//父组件
    <my-slot>
      <template #testdata="slotfirstProps">
        {{ slotfirstProps.value1 }}
      </template>

      <template #default="slotsecondProps">
        {{ slotsecondProps.value2 }}
      </template>
    </my-slot>
//子组件
  <div>
    <p>this is start</p>
    //d1、d2都是我定义在data中的数据
    <slot name="testdata" :value1="d1"> 这就是默认值1</slot>
    <slot :value2="d2"> 这就是默认值2 </slot>
    <p>this is end</p>
  </div>

效果如下:
effect.png

铛铛铛~完结撒花,如有不对欢迎指正。觉得有帮助的话记得点个赞哦

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

推荐阅读更多精彩内容

  • Vue 实现了一套内容分发的 API,由 元素作为承载分发内容的出口。 slot 首先说说slot vue里提...
    前端辉羽阅读 911评论 0 8
  • vue里提供了一种将父组件的内容和子组件的模板整合的方法:内容分发,通过slot插槽来实现。 在组件标签内部写入的...
    视觉派Pie阅读 8,794评论 0 20
  • 前言 Vue中的插槽是一个非常强大的功能,在复用组件模块的时候,针对相似的结构,拥有不通的内容时,使用插槽就非常方...
    itclanCoder阅读 1,371评论 0 1
  • 一、什么是插槽? 在进行组件化开发时,通常会遇到同一个功能,有共性的部分,也有不同的部分,此时我们就需要在子组件内...
    Year_h阅读 466评论 0 5
  • 本篇(可能此系列会包含很多篇)纯属从Vue官方文档找来的内容,也可能会根据自身的知识情况扩展、延伸、归纳,进行个性...
    爆发吧小宇宙阅读 567评论 2 1