Vue.js进阶系列(10)--组件插槽slot

  你以为组件就这么完了?想太多啦~组件是Vue中很重要的部分,取经的道路还是十分漫长滴。今天呢,小编为大家带来组件的进阶版:组件插槽

一、插槽是谁?

1.生活中的插槽

  其实我们生活中有很多很多的插槽。比如电脑的USB插槽、插板中的电源插槽等等。每个插槽都有它们之间的价值。比如电脑的USB插槽,可以用来插U盘,链接鼠标,链接手机、音响等等,通过这些插槽,大大拓展了原有设备的功能。

2.组件中的插槽

  组件中的插槽,让使用者可以决定组件内部的一些内容到底展示什么,具有插槽的组件将会有更加强大的拓展性,这跟王者荣耀中获得的绝版皮肤是一样的道理。

二、插槽从哪里来?

其实为什么会有插槽的产生呢,因为客户的无厘头需求。

image.png

  不行,小编最近不能再吐槽客户了,要抑制住最近的情绪,世界如此美妙,你却如此暴躁,这样不好,不好。我们先用下面的例子来引入插槽从哪里来:
image.png

  三个页面中都有导航栏,基本结构都是一样的:左中右分别有一个东西,只是显示的内容不同而已。那我们如何来实现这种结构相似但是内容不同呢?
  你一定是想着,直接定义三个组件,然后在模板中分别显示不同的内容,对不对?那小编要恭喜你,你就快要被炒了。
  首先,如果我们封装成三个组件,显然不合适,比如每个页面都有返回,这部分的内容我们就要重复去封装
  其次,如果我们封装成一个,还是不合理,因为有些左侧的菜单栏,有些中间是搜索框,有些是文字。
那我们该怎么办呢?其实很简单,用组件插槽。

三、怎么用给插槽?

  上面最佳的解决办法是将共性抽取到组件中,将不同暴露给插槽,一旦我们使用了插槽,就相当于预留了空间空间的内容取决于使用者。具体呢可以分成以下两种用法:

1.使用空插槽
    <body>
        <div id="warp">
            <cnp></cnp>
            <cnp></cnp>
            <cnp></cnp>
        </div>
        <template id="tem">
            <div>
                <h2>我是标题</h2>
                <p>我是段落</p>
                <button>按钮</button>
            </div>
        </template>
        <script>
            var vm = new Vue({
                el:"#warp",
                components:{
                    cnp:{
                        template:"#tem"
                    }
                }
            })
        </script>
    </body>
image.png

  小编想将第二个子组件的按钮变成span标签,将第三个子组件的按钮变成i标签,只需要引入slot标签,然后在cnp标签添加内容即可

<!-- 第一步:在子组件模板使用slot标签 -->
<template id="tem">
    <div>
        <h2>我是标题</h2>
        <p>我是段落</p>
        <slot></slot>
    </div>
</template>
<!-- 第一步:在子组件cnp标签填充内容 -->
<div id="warp">
    <cnp><buton>按钮</buton></cnp>
    <cnp><span>我是span标签</span></cnp>
    <cnp><i>我是i标签</i></cnp>
</div>

image.png

  使用了slot标签,就相当于预留了空间,空间的内容取决于使用者。比如本例子中,子组件cnp模板使用slot标签,slot的内容就会被cnp标签的内容替换掉,比如第一个slot的内容就被button标签替换了,第二个slot的内容就被span标签替换了。

2.有默认值的插槽

  这种情况一般是,总共有十个东西,八个的内容是一样的,只有两个内容不一样情况。比如接着上面的例子,小编想第一个子组件和第二个子组件都是按钮,第三个子组件是span标签,只需要在slot标签填充默认的内容即可:

<template id="tem">
    <div>
        <h2>我是标题</h2>
        <p>我是段落</p>
        <slot><button>按钮</button></slot>
    </div>
</template>
<div id="warp">
    <cnp></cnp>
    <cnp></cnp>
    <cnp><span>我是span标签</span></cnp>
</div>
image.png

  为什么这里的第一个cnp和第二个cnp标签没有内容也有东西显示出来呢?因为slot有默认的button。当cnp没有写内容的时候,就显示slot默认的内容;当cnp写了内容,原本slot默认的内容就会被覆盖。
  其实小编很好奇【因为小编是好奇宝宝,哈哈哈O(∩_∩)O哈哈~】如果是下面这种情况,slot的内容会被那个标签替换呢?

<div id="warp">
    <cnp>
        <p>哈哈哈</p>
        <span>呵呵呵</span>
        <i>嘻嘻嘻</i>
    </cnp>
</div>

  被“哈哈哈”替代?被“呵呵呵”替代?被“嘻嘻嘻”替代?那么究竟花落谁家呢?让我们拭目以待吧!


image.png

骗你的,其实下面就有答案:

image.png

  事实证明,slot被三个标签同时替代了!也就是说会被cnp标签的所有内容替换掉,记住了嘛?这个是小黑板的知识点唷o( ̄︶ ̄)o

四、具名插槽

  什么是具名插槽呢?简单的理解就是给slot起名字,为什么要起名字呢?因为有名字我们才好区分,才好让使用者对某个特定名字的插槽进行不同的操作。比如:

image.png

三个页面的导航栏不一样,那么我们就需要在子组件cnp的模板中用三个插槽

<template id="tem">
    <div>
        <slot><</slot>
        <slot>购物车</slot>
        <slot>···</slot>
    </div>
</template>
image.png

  可以发现,通过给solt设置默认值是可以实现这个样式的。但是呢,我们子组件一般都提倡复用,在第一个页面可能有“购物车”这个样式,第二个页面未必有这个样式,如果每调用一次子组件就修改slot的默认值,你会发现这是一件非常错误的事情。
所以我们通过具名插槽来实现,具体看下面的代码:

<template id="tem">
    <div>
        <slot name="left"></slot>
        <slot name="center"></slot>
        <slot name="right"></slot>
    </div>
</template>
<div id="warp">
    <cnp>
        <span slot="left"><</span>
        <span slot="center">购物车</span>
        <span slot="right">···</span>
    </cnp>
</div>

  首先我们为插槽起了名字,然后在使用的时候,只要告诉某个标签,你的内容想显示在那个插槽,就写入那个插槽的名字。就像去参加相亲,你肯定会写下你心仪对象的名字啦(✿◡‿◡)。

  好啦~今天小编分享的slot小知识就到这里啦,谢谢大伙的支持。
    ❤❤❤记得点赞唷(^U^)ノ~YO❤❤❤

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

推荐阅读更多精彩内容