Vue 插槽(slot)详细介绍,2024年最新前端插件化

//B.vue

我是B组件

//观察页面元素,被替换成C组件

也印证了开篇对插槽作用的解释,即使用的组件指定的位置留一个坑,如果在外部,使用其组件包裹某内容(可以是任何模板代码,也可以是HTML,还可以是组件),则该内容就会被分发到处(一个有趣的说法就是把“坑”补上),渲染出来。当然,也可以不放任何内容,不影响组件渲染,就好比最开始的情况。

注意:如果B组件的 template 中没有包含一个 <slot> 元素,即不使用插槽,则该组件起始标签和结束标签之间的任何内容都会被抛弃。例如:

//B.vue

我是B组件

//不使用插槽

//A.vue

我是A组件

//此时在包裹的内容都会被抛弃

页面效果如下,在B组件中插入的C组件被抛弃了,因为B组件中没使用插槽:

后备(默认)内容

有时为一个插槽设置具体的后备 (也就是默认的) 内容是很有用的,它只会在没有提供内容的时候被渲染。例如在B组件中:

我们可能希望这个B组件内绝大多数情况下都渲染文本“我是B组件”。为了将“我是B组件”作为后备内容,我们可以将它放在 <slot> 标签内:

我是B组件

现在当我在一个父级组件中使用B组件并且不提供任何插槽内容时:

后备内容“我是B组件”将会被渲染:

但是如果我们提供内容:

我是插槽内容

则这个提供的内容将会被渲染从而取代后备内容:

具名插槽

所谓具名插槽,顾名思义就是起了名字的插槽。有时我们需要多个插槽,例如当我们想使用某种通用模板:

对于这样的情况,<slot> 元素有一个特殊的 attribute:name。这个 attribute 可以用来定义额外的插槽:

//B.vue

一个不带 name 的 <slot> 出口会带有隐含的名字“default”。

在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 slot 指令,并以 slot 的参数的形式提供其名称(当然也可以直接放在标签中,如

):

我是A组件

我是header部分

我是main(默认插槽)部分

我是footer部分

现在 <template> 元素中的所有内容都将会被传入相应的插槽。任何没有被包裹在带有slot 的 <template> 中的内容都会被视为默认插槽的内容。

页面效果如下:

观察页面元素,内容被放入相应名字的插槽中:

Tips:说到这里就不得不提一下,这种方式在项目中比较常用,可以当成一个复用(通用)模板组件。如多个组件的布局使用相似模板,只是具体内容不同,那么我们可以使用这种插槽方式封装成一个通用组件,在其他组件使用的时候只需要传对应的内容到对应名字的插槽即可,不需要将该模板在每个组件重新写一遍,减少代码冗余,大大提高开发效率。

作用域插槽

有时让插槽内容能够访问子组件中才有的数据是很有用的。现在,假设B组件:

我是B组件

{{obj.firstName}}

我们可能想换掉备用内容,用“lion”来显示。如下,在A组件:

我是A组件

{{obj.lastName}}

然而上述代码不会正常工作,因为只有B组件可以访问到 obj,而我们提供的内容是在父级渲染的,即在父级作用域中。页面并无变化:

为了让 obj在父级的插槽内容中可用,我们可以将 obj作为 <slot> 元素的一个 attribute 绑定上去:

我是B组件

{{obj.firstName}}

绑定在 <slot> 元素上的 attribute 被称为插槽 prop。现在在父级作用域中,我们可以使用带值的 slot-scope 来定义我们提供的插槽 prop 的名字:

我是A组件

{{data.obj.lastName}}

在这个例子中,我们选择将包含所有插槽 prop 的对象命名为 data,但你也可以使用任意你喜欢的名字。此时页面效果如下:

如果你有使用过ElementUI里面的表格el-table,当改变某一列展示的字段时,我们经常使用:

{{scope.row.xxx}}

插槽版本变化

v-slot 指令自 Vue 2.6.0 起被引入,提供更好的支持 slot 和 slot-scope attribute 的 API 替代方案。v-slot 完整的由来参见这份 RFC。在接下来所有的 2.x 版本中 slot 和 slot-scope attribute 仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中。也就是说,在vue2版本中,我们仍可以使用slot跟slot-scope,但是在vue3中就只能使用v-slot了。

原来的带有slot的具名插槽

//B.vue

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

基础面试题

主要内容包括:HTML,CSS,JavaScript,浏览器,性能优化等等

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

o-1712705125319)]
[外链图片转存中…(img-oD2s3m0e-1712705125319)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-EH0ln6H5-1712705125319)]

基础面试题

主要内容包括:HTML,CSS,JavaScript,浏览器,性能优化等等

[外链图片转存中…(img-P1Ftl6e2-1712705125320)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-oLDbcn7i-1712705125320)]

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中的slot)是一种用于在组件中入内容的机制。它允许我们在组件的模板中定义一些占位符,然后在使用该组件时,可以将具体的内容入到这些占位符中。 在Vue 2.x版本中,我们可以使用`<slot>`元素来定义,并使用`<slot>`元素的`name`属性来定义具名。例如: ```html <template> <div> <slot></slot> <!-- 默认 --> <slot name="header"></slot> <!-- 具名 --> <slot name="footer"></slot> <!-- 具名 --> </div> </template> ``` 然后,在使用该组件时,我们可以在组件标签中入内容,这些内容将会替换对应的。例如: ```html <my-component> <p>默认的内容</p> <template v-slot:header> <h1>具名header的内容</h1> </template> <template v-slot:footer> <p>具名footer的内容</p> </template> </my-component> ``` 在Vue 3.x版本中,为了统一的语法,引入了`v-slot`指令,取代了`slot`和`slot-scope`这两个在Vue 2.x中已被废弃但仍可使用的属性。使用`v-slot`指令时,可以直接在组件标签上使用,而不需要再使用`<template>`元素。例如: ```html <my-component> <template #default> <p>默认的内容</p> </template> <template #header> <h1>具名header的内容</h1> </template> <template #footer> <p>具名footer的内容</p> </template> </my-component> ``` 需要注意的是,在Vue 3.x中,只能使用`v-slot`指令来定义,而不能再使用`slot`和`slot-scope`属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值