一、什么是插槽

插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot>  表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签,父组件填充的内容称为插槽内容

  • 子组件不提供插槽时,父组件填充失效
  • 父组件无填充时,<slot></slot>中的备用内容会启用生效
  • 父级模板里的所有内容都是在父级作用域中编译的,子模板里的所有内容都是在子作用域中编译的,互不影响

二、匿名插槽(默认插槽)

介绍

在外部组件没有提供任何内容的情况下,可以使用匿名插槽提供默认内容。

使用场景

比如

MyComponent.vue

<n-el>
<slot>这是一个默认展示的内容</slot>
</n-el> //组件使用
<MyComponent/>

如下:

如果外部组件提供了插槽内容,我们提供的内容会覆盖掉默认的内容

如下:

<MyComponent>加入一段文字</MyComponent>

注: 插槽内容可以是任意合法的模板内容,不局限于文本。

如下:

<MyComponent>
<n-button>加入一个按钮</n-button>
</MyComponent>

三、具名插槽

介绍

<slot>元素带有 name 属性的插槽被称为具名插槽。

使用场景

作用于一个组件中拥有多个插槽,而name相当于插槽的标识,用来给各个插槽分配唯一的 ID。

MyComponent.vue

<n-el class="flex flex-col justify-center items-center h-[80vh] w-full">
<n-el class="text-[pink] text-[18px] mb-2">组件相关内容</n-el>
<slot name="head"></slot>
<slot name="main"></slot>
<slot name="footer"></slot>
</n-el>

外部引用该组件

<MyComponent>
<template v-slot:head>
<n-el>这是头部内容</n-el>
</template>
<template v-slot:main>
<n-el>这是主体内容</n-el>
</template>
<template v-slot:footer>
<n-el>这是尾部内容</n-el>
</template>
<template v-slot:no>
<n-el>组件中没有可匹配的插槽name,不显示</n-el>
</template>
</MyComponent>

v-slot可以简写成#

    <MyComponent>
<template #head>
<n-el>这是头部内容</n-el>
</template>
<template #main>
<n-el>这是主体内容</n-el>
</template>
<template #footer>
<n-el>这是尾部内容</n-el>
</template>
<template #no>
<n-el>组件中没有可匹配的插槽name,不显示</n-el>
</template>
</MyComponent>

现在  <template>  元素中的所有内容都将被传递到相应的插槽。

注意: 匿名插槽也有自己的name,只不过 name 会被隐式地命名为default

上面的写法等价于:

四、动态插槽名

<MyComponent>
<template v-slot:[slotName]>
...
</template> <!-- 缩写为 -->
<template #[slotName]>
...
</template>
</MyComponent>

如下

MyComponent.vue

<n-el>
<n-el>组件相关内容</n-el>
<slot name="head"></slot>
</n-el>
<script setup lang="ts">
const data = 'head'
</script>
<template>
......
<MyComponent>
<template #[data]> 头部内容 </template>
</MyComponent>
.......
</template>

五、作用域插槽

介绍

作用域插槽可以让父级外层组件能够访问子组件的数据,子组件向将数据提供给插槽,组件 props 传递数据的方式,子组件向插槽传递一个attributes,父组件通过v-slot带的值(任意命名)来获取子组件的数据。

使用场景

(一)、默认插槽

MyComponent.vue

<n-el class="flex flex-col justify-center items-center h-[80vh] w-full">
<slot content="螺蛳粉" data="10"></slot>
</n-el>

写法一: v-slot 写在组件上

   <MyComponent v-slot="res">
<n-el>老板:来 {{ res.data }} 份 {{ res.content }} ~</n-el>
</MyComponent>

注意: v-slot="res"  可以类比这里的函数签名,和函数的参数类似,我们也可以在  v-slot  中使用解构:

<MyComponent v-slot="{ data, content }">
<n-el>
老板:来 {{ data }} 份 {{ content }} ~
</n-el>
</MyComponent>

写法二: v-slot 写在 template 上

   <MyComponent>
<template v-slot:default="res">
<n-el>老板:来 {{ res.data }} 份 {{ res.content }} ~</n-el>
</template> //或者
<template #default="res">
<n-el>老板:来 {{ res.data }} 份 {{ res.content }} ~</n-el>
</template> </MyComponent>

(二)、具名插槽

具名作用域插槽的工作方式也是类似的,插槽 props 可以作为  v-slot  指令的值被访问到:v-slot:name="slotProps"。当使用缩写时是这样:

MyComponent.vue

<n-el class="flex flex-col justify-center items-center h-[80vh] w-full">
<slot content="北京烤鸭" data="5" name="food1"></slot>
<slot content="长沙臭豆腐" data="15" name="food2"></slot>
</n-el>
   <MyComponent>
<template #food1="res">
<n-el>老板:来 {{ res.data }} 份 {{ res.content }} ~</n-el>
</template>
<template #food2="res">
<n-el>老板:来 {{ res.data }} 份 {{ res.content }} ~</n-el>
</template>
</MyComponent>

vue3 | slots的更多相关文章

  1. 预计2019年发布的Vue3.0到底有什么不一样的地方?

    摘要: Vue 3.0预览. 原文:预计今年发布的Vue3.0到底有什么不一样的地方? 作者:小肆 微信公众号:技术放肆聊 Fundebug经授权转载,版权归原作者所有. 还有几个月距离 vue2 的 ...

  2. 尝鲜 vue3.x 新特性 - CompositionAPI

    0. 基础要求 了解常见的 ES6 新特性 ES6 的导入导出语法 解构赋值 箭头函数 etc... 了解 vue 2.x 的基本使用 组件 常用的指令 生命周期函数 computed.watch.r ...

  3. Vue3语法快速入门以及写一个倒计时组件

    Vue3写一个倒计时组件 vue3 beta版本发布已有一段时间了,文档也大概看了一下,不过对于学一门技术,最好的方法还是实战,于是找了一个比较简单的组件用vue3来实现,参考的是vant的count ...

  4. vite + ts 快速搭建 vue3 项目 以及介绍相关特性

    博客地址:https://ainyi.com/98 Vue3.0,One Piece 接下来得抽空好好学习了 vite 尤大在 Vue 3.0 beta 直播中推荐了 vite 的工具,强调:针对Vu ...

  5. vue3系列:vue3.0自定义弹框组件V3Popup|vue3.x手机端弹框组件

    基于Vue3.0开发的轻量级手机端弹框组件V3Popup. 之前有分享一个vue2.x移动端弹框组件,今天给大家带来的是Vue3实现自定义弹框组件. V3Popup 基于vue3.x实现的移动端弹出框 ...

  6. vue3系列:vue3.0自定义全局弹层V3Layer|vue3.x pc桌面端弹窗组件

    基于Vue3.0开发PC桌面端自定义对话框组件V3Layer. 前两天有分享一个vue3.0移动端弹出层组件,今天分享的是最新开发的vue3.0版pc端弹窗组件. V3Layer 一款使用vue3.0 ...

  7. vue3.0 composition API

    一.Setup函数 1.创建时间:组件创建之前被调用,优先与created被调用,this指向的实例为window,created所指向的实例为proxy 2.this指向:不会指向组件实例 3.参数 ...

  8. Vue3.0新特性

    Vue3.0新特性 Vue3.0的设计目标可以概括为体积更小.速度更快.加强TypeScript支持.加强API设计一致性.提高自身可维护性.开放更多底层功能. 描述 从Vue2到Vue3在一些比较重 ...

  9. 简单梳理下 Vue3 的新特性

    在 Vue3 测试版刚刚发布的时候,我就学习了下 Composition API,但没想到正式版时隔一年多才出来,看了一下发现还是增加了不少新特性的,在这里我就将它们一一梳理一遍. 本文章只详细阐述 ...

  10. 基于vue3+electron11实现QQ登录切换|自定义导航栏|托盘|打包

    上一篇有给大家分享过使用vue3和electron快速搭建项目.创建多窗口/父子modal窗口的一些方法.今天继续给大家分享一些vue3.x+electron11项目开发中的一些知识点/踩坑记录,希望 ...

随机推荐

  1. JAVA-注解之 TODO、FIXME、XXX

    TODO.FIXME.XXX    //TODO : 表示待实现的功能    //FIXME: 代码存在Bug,不能Run或运行结果不正确,需要修复    //XXX  : 勉强可以工作,但是实现的方 ...

  2. 优秀的Kafka GUI客户端、可视化管理工具、监控工具

    想要查看Topic里的消息却找不到软件,想要查看或更新Broker.Topic配置,想要监控Broker服务器状态?试试下面的Kafka GUI工具--Kafka Assistant 官网地址:htt ...

  3. ES6高级编程(一)

    一.JavaScript概要 1.1.JavaScript组成 JavaScript主要由三部分构成,分别是ECMAScript.DOM与BOM ECMAScript定义了该语言的语法.类型.语句.关 ...

  4. c++题目:吃西瓜

    吃西瓜 [问题描述] 老胡买了是长方体形的西瓜来犒劳大家.... 这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小块都会有一个营养值(可 ...

  5. log4j漏洞原理

    一.前置知识 1.JNDI接口 JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发 ...

  6. 2.6:Python数据存取-文件、文件夹及目录、数据库

    一.Python文件读写 1.文件的打开模式 <class '_io.TextIOWrapper'>和<class '_io.BufferedReader'>.python使用 ...

  7. JavaEE Day02MySQL

    今日内容 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL语句 一.数据库的基本概念 1.数据库DataBase,简称DB 2.什么是数据库?         用于存储和管理数据的仓库 ...

  8. 【大数据面试】【框架】Linux命令、Shell工具、常见Shell脚本(群起脚本、数仓导入)

    一.Linux 1.常用高级命令 ps -ef:查看进程详情,ps -ef|grep dae可以搜索指定进程,-e表示环境变量 ps -au:以用户为主的详细格式,显示进程平均占用资源,不包括cmd列 ...

  9. 网络编程 - OSI七层协议详解

    目录 网络编程基础 软件开发架构 网络编程简介 OSI七层协议简介 OSI协议之物理连接层 OSI协议之数据链路层 网络相关专业名词 OSI之网络层 OSI协议之传输层 传输层之TCP协议/UDP协议 ...

  10. RGB以及RGBA

    字母含义及取值 R:红色.0~255 整数 G:绿色.0~255 整数 B:蓝色.0~255 整数 A:透明度.0~1.整数或者小数 RGB和RGBA的关系 项目遇见一个需求,后台返回所占比例,前端根 ...