一文详解Vue插槽slot的使用与案例展示,看完就彻底明白了

2023-05-16

目录

一、插槽的含义

二、插槽的三种使用方法

1.默认插槽

2.具名插槽

3.作用域插槽

4.版本变化


插槽 slot 在实际的项目开发中是经常使用的,主要分为三大类:默认插槽具名插槽作用域插槽,也是比较容易上手的。

一、插槽的含义

插槽 slot 是写在子组件的代码中,供父组件使用的占位符。在代码中,大致写为如下的形式,后面会进行详细的写法介绍。

<slot> </slot>

插槽其实就是在写 slot 的地方挖个坑,等着组件的使用者,即父组件,进行填充。子组件中使用插槽 slot 后,父组件可以在这个占位符中填充内容,包括数据、html代码、组件等,也就是说,当子组件的某部分内容是根父组件填充的不同而变化的,那我们就可以使用插槽slot,具体填充什么,由父组件而定。

让父组件向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于父组件 => 子组件

话不多说,下面,我们就来看看 slot 的具体如何使用吧!

二、插槽的三种使用方法

1.默认插槽

有两个组件,App是父组件,Child是子组件

父组件代码如下:

<template>
  <div class="parent">
    <span>我是父组件</span>
    <Child></Child>
  </div>
</template>

<script>
import Child from './components/Child'
export default {
  name:'app',
  components:{
    Child
  }

}
</script>

<style scoped>
.parent{
  width: 400px;
  height: 400px;
  background-color: #bfa;
}
</style>

 

子组件的代码:

<template>
  <div class="child">
    <div>我是子组件</div>
    <br>
    <slot>我是默认插槽,当父组件不填充任何内容时,我这句话才会出现</slot>
  </div>
</template>

<script>
export default {
  name:'Child',
  data() {
    return {
      
    }
  },
};
</script>

<style>
.child {
  width: 200px;
  height: 200px;
  background-color: lightblue;
  margin: auto;
}
</style>

 

启动项目,在浏览器中显示:

 这时候,我们已经使用 slot ,在子组件中占了一个坑,但是我们还没有填充内容,接下来填充内容:

 可以看到,填充的内容,确实在子组件中显示

 

假如,我们去掉子组件的插槽,父组件在子组件填充的内容还能看到吗?我们来试一试:

可以看到:浏览器中,只显示两个组件原本的信息,父组件填充的内容是看不到的。

 

在 slot 中,不仅可以填充文字,也可以填充图片、视频、HTML结构等,如填充图片:

浏览器中显示如下: 

 

2.具名插槽

具名插槽,顾名思义,就是带有名字的插槽,具有 name 属性,一个不带 name 的 <slot> 会带有默认的名字 default

在子组件中,slot 指定 name 属性

<template>
  <div class="child">
    <div>我是子组件</div>
    <br>
    <slot name="content">
      我是插槽默认的内容,当父组件不填充任何内容时,我这句话才会出现
    </slot>
  </div>
</template>

<script>
export default {
  name:'Child',
  data() {
    return {
      
    }
  },
};
</script>

<style>
.child {
  width: 200px;
  height: 200px;
  background-color: lightblue;
  margin: auto;
}
</style>

在父组件中,需要使用 template ,在 template 模板中,指定 slot 在子组件中的 name

<template>
  <div class="parent">
    <span>我是父组件</span>
    <Child>
      <template slot="content">
        <div>这是父组件在子组件中填充的内容,在子组件中显示</div>
        <br />
        <img src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="" />
      </template>
    </Child>
  </div>
</template>

<script>
import Child from "./components/Child";
export default {
  name: "app",
  components: {
    Child,
  },
};
</script>

<style scoped>
.parent {
  width: 400px;
  height: 400px;
  background-color: #bfa;
}
img {
  width: 200px;
}
</style>

 浏览器可以正常显示填充的内容:

 假如,我们在父组件中,只写了 template ,并没有指定 slot 在子组件中的 name 值,

 那么,浏览器中:

 也就是说,在引用子组件的代码中, template 中的slot 是根据等号 后面的值,来寻找对应的插槽 slot ,从而在对应的位置上,填充相应的内容。当我们使用的插槽数量比较多时,具名插槽就有很大的实用性。

3.作用域插槽

 如果数据在子组件,可以在子组件中直接使用数据,但根据数据生成的结构需要组件的使用者来决定,我们就需要用到作用域插槽,同时,我们也可以实现多种结构。

例如:games数据在子组件中,但使用数据所遍历出来的结构由父组件App决定

子组件中,使用 <slot :games="games"> 指明使用什么数据,并将数据传给插槽的使用者

<template>
  <div class="child">
    <span>我是子组件</span>
    <h5>{{title}}</h5>
    <slot :games="games">
      我是插槽默认的内容,当父组件不填充任何内容时,我这句话才会出现
    </slot>
  </div>
</template>

<script>
export default {
  name:'Child',
  props:['title'],
  data() {
    return {
      games:['红色警戒','穿越火线','超级玛丽'],
    }
  },
};
</script>

<style>
.child {
  width: 200px;
  height: 200px;
  background-color: lightblue;
  margin: auto;
}
</style>

 在父组件中,使用子组件通过插槽传递过来的数据,渲染结构,有3种形式:

<template>
  <div class="parent">
    <span>我是父组件</span>
    <Child title="游戏1">
			<template scope="youxi1">
        <!-- 无序列表结构 -->
				<ul>
					<li style="color:red" v-for="(g,index) in youxi1.games" :key="index">{{g}}</li>
				</ul>
			</template>
		</Child>
    <hr>
    <Child title="游戏2">
      <template slot-scope="youxi2">
        <!-- 有序列表结构 -->
        <ol>
          <li v-for="(g,index) in youxi2.games" :key=index>{{g}}</li>
        </ol>  
      </template>
    </Child>
    <hr>
    <Child title="游戏3">
      <template scope="{games}">
        <!-- h4结构 -->
        <h5 v-for="(g,index) in games" :key=index>{{g}}</h5>
      </template>
    </Child>
    <hr>
  </div>
</template>

<script>
import Child from "./components/Child";
export default {
  name: "app",
  components: {
    Child,
  },
};
</script>

<style scoped>
.parent {
  width: 400px;
  height: 700px;
  background-color: #bfa;
}
img {
  width: 200px;
}
</style>

浏览器中:

  

 第1种:是基本用法,使用 scope = "  youxi1 ",youxi1 是自定义的变量,来接收子组件传过来的数据,它是一个对象,使用插值语法,把 youxi1 打印出来:

 第2种:将 scope 替换为 slot-scope

第3种:使用 es6 解构赋值的方法,直接将对象数据解构为数组,然后进行 v-for 的遍历

上述的小案例,就实现了:使用同样的数据,父组件将其渲染成不同的结构,非常方便实用。 

4.版本变化

 Vue 2.6.0 起,引入了 v-slot ,上文提到了3类插槽的 slot 和 slot-scope ,可以直接替换为 v-slot ,在vue2版本中,我们仍可以使用 slot  slot-scope ,但是在vue3中就只能使用v-slot了。详细内容参见 vue官方文档 的解释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文详解Vue插槽slot的使用与案例展示,看完就彻底明白了 的相关文章

  • STM32(F407)—— 堆栈

    目录 1 SRAM 2 堆栈的作用 3 堆栈的设置 4 堆栈的实现 5 双堆栈机制 堆栈 是一种数据结构 堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 xff0c 相应地 xff0c
  • zabbix4.0学习五:Zabbix监控邮箱发送设置

    zabbix4 0学习五 xff1a Zabbix监控邮箱发送设置 文章目录 zabbix4 0学习五 xff1a Zabbix监控邮箱发送设置 前言配置centos安装mailx配置zabbix用户与报警媒介绑定 前言 zabbix里报警
  • STM32(F407)—— 存储区映射和存储器重映射

    Arm Cortex M4 处理器采用哈佛结构 xff0c 可以使用相互独立的总线来读取指令和加载 存储 数据 指令代码和数据都位于相同的存储器地址空间 xff0c 但在不同的地址范围 程序存储器 xff0c 数据存储器 xff0c 寄存器
  • MarkDown语法汇总

    文章目录 总览标题1 使用 号创建标题2 使用 61 和 号创建标题 段落1 换行2 字体格式3 删除线4 脚注5 下划线6 首行缩进7 字体颜色 大小 字体类型8 文本高亮 块引用1 嵌套块引用2 具有其他元素的块引用 列表1 有序列表2
  • 【VCU】详解S19文件(S-record)

    目录 1 概述 2 S record格式 3 S record类型 4 S19文件示例 5 校验和计算示例 6 参考 1 概述 Motorola S record是由Motorola创建的一种文件格式 xff0c 它以 ASCII十六进制
  • [ROS](03)CMakeLists.txt详解

    文章只是个人学习过程中学习笔记 xff0c 主要参考ROS教程1 目录 1 概述2 CMakeLists txt文件2 1 遵循的格式和顺序2 2 文件解析2 3 find package 2 4 catkin package 1 概述 C
  • [ROS](01)创建ROS工作空间

    文章只是个人学习过程中学习笔记 xff0c 主要参考ROS教程1 1 创建catkin工作空间 Catkin工作空间是一个文件夹 xff0c 可以在其中修改 构建和安装 catkin 包 span class token function
  • [ROS](04)package.xml详解

    文章只是个人学习过程中学习笔记 xff0c 主要参考ROS教程1 1 概述 软件包 xff08 package xff09 清单 xff08 manifest xff09 是一个名为 package xml 2 的 XML 文件 xff0c
  • [ROS](06)ROS通信 —— 话题(Topic)通信

    文章只是个人学习过程中学习笔记 xff0c 主要参考ROS教程1 目录 1 概念2 话题通信机制3 话题命令rostopic4 话题通信实操 键盘控制乌龟 xff08 turtlesim xff09 运动5 话题命令实操5 1 rostop
  • ubuntu18.04忘记密码后,如何重置密码的方法

    ubuntu18 04安装在VMware虚拟上 ubuntu18 04忘记密码后 xff0c 如何重置密码 xff1f 重启系统后 xff0c 当跳出如下图所示画面时 xff0c 按住Shift键不放 xff0c 等待 2 但出现如下图所示
  • [ROS]Ubuntu18.04下安装指定版本OpenCV

    Linux xff1a Ubuntu 18 04 ROS xff1a ROS Melodic 目录 1 获取 OpenCV 源代码2 安装所需的依赖软件包3 使用CMake从源代码编译OpenCV3 1 准备3 2 配置OpenCV3 3
  • [ROS](12)ROS通信 —— 参数服务器(Parameter Server)通信

    文章只是个人学习过程中学习笔记 xff0c 主要参考ROS教程1 2 ROS xff08 01 xff09 创建ROS工作空间 ROS xff08 02 xff09 创建 amp 编译ROS软件包Package ROS xff08 03 x
  • zabbix4.0学习六:Zabbix监控日志

    zabbix4 0学习六 xff1a Zabbix监控日志 前言 我们希望监控日志 xff0c 在日志出现特定标识或字符串时打印出日志 xff0c 并邮件通知我们 xff0c 以便我们手动处理 xff08 当然使用动作可自动处理 xff09
  • 听说你会Promise? 那么如何控制请求并发数呢?

    前言 现在面试过程当中 xff0c 手写题必然是少不了的 xff0c 其中碰到比较多的无非就是当属 请求并发控制了 现在基本上前端项目都是通过axios来实现异步请求的封装 xff0c 因此这其实是考你对Promise以及异步编程的理解了
  • [ROS]在VS Code下编写代码,汇总问题及解决办法

    Linux xff1a Ubuntu18 04 ROS xff1a melodic 在VS Code下编写代码 xff0c 汇总问题及解决办法 问题1 xff1a 编译C 43 43 代码可通过 xff0c 但抛出错误警告以及代码补全异常
  • 基本类型与包装(装箱)类型的区别

    Java的类型分为两部分 xff0c 一个是基本类型 xff08 primitive xff09 xff0c 如int double等八种基本数据类型 xff1b 另一个是引用类型 xff08 reference type xff09 xf
  • 学习笔记------关于字符串结束符'\0'、字符串定义方法

    字符串定义方法 有2种方法 xff1a 1 xff09 字符数组 2 xff09 字符指针 初始化 1 xff09 字符数组方式初始化大致3种 xff1a 1 char str 10 61 34 12345 34 或者char str 10
  • 树莓派连接vnc教程

    1 输入 sudo raspi config 进入到系统设置中开启vnc服务 2 进入后选择 Interfacing Options 进入 3 选择 VNC 进入 4 yes 下载软件 xff1a VNC Viewer 5 连接vnc xf
  • ubuntu 22.04设置root密码,与开启sshd服务

    1 sudo passwd root 直接输入两次密码即可完成 2 安装sshd服务 xff1a apt install ssh 3 启动ssh服务 systemctl start sshd 4 设置开机启动 xff1a systemctl
  • Python+Flask+Docker+Vue实现简单的股票数据统计

    闲暇时间实现了一个简单的股票数据统计功能 数据是从网上爬下来的 xff0c 页面支持按照股票名称 股票代码 股票类型 股价 市值等搜索并展示在下方列表 除了股票的基本信息以外 xff0c 还会显示其他炒股软件上不会展示的信息如流动比率 速动

随机推荐