Vue 系列之:插槽

前言

插槽是定义在子组件中的,相当于一个占位符,父组件可以在这个占位符中填充HTML代码、组件等内容。

插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制。

基本使用

子组件:

<template>
    <div>
        <h1>今天天气状况:</h1>
        <slot></slot>
    </div>
</template>

<script>
export default {
    name: 'child'
}
</script>

父组件:

<template>
  <div class="box">
    <div>使用slot分发内容</div>
    <child>
      <div>多云</div>
    </child>
  </div>
</template>

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

<style scoped>
.box {
  margin: 20px;
}
</style>

在这里插入图片描述

如果把子组件中 slot 去掉,父组件不变:

<template>
    <div>
        <h1>今天天气状况:</h1>
        <!-- <slot></slot> -->
    </div>
</template>

<script>
export default {
    name: 'child'
}
</script>

在这里插入图片描述

如果子组件没有使用插槽,父组件如果需要往子组件中填内容是没法做到的。

具名插槽

具名插槽其实就是给插槽取个名字。一个子组件可以放多个插槽,而且可以放在不同的地方,而父组件填充内容时,可以根据这个名字把内容填充到对应插槽中。

子组件

<template>
  <div>
    <div class="top">
      <h1>头部</h1>
      <slot name="top"></slot> <!--具名插槽1-->
    </div>
    <div class="center">
      <h1>中间</h1>
      <slot></slot> <!--默认插槽-->
    </div>
    <div class="bottom">
      <h1>底部</h1>
      <slot name="bottom"></slot> <!--具名插槽2-->
    </div>
  </div>
</template>

<script>
export default {
  name: "child",
};
</script>

<style scoped>
.top {
  background-color: aqua;
}
.center {
  background-color: pink;
}
.bottom {
  background-color: aquamarine;
}
</style>

父组件:

<template>
  <div class="box">
    <div>使用slot分发内容</div>
    
    <child>
    
      <!--所有没指定插槽名称的会添加到默认插槽中-->
      <div>A</div>
      <div>
        B
        <span>C</span>
      </div>
      
      <!--具名插槽写法1-->
      <div slot="bottom">E</div>
      
      <!--具名插槽写法2-->
      <template v-slot:top>
        <div>D</div>
      </template>
      
    </child>
    
  </div>
</template>

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

<style scoped>
.box {
  margin: 20px;
}
</style>

在这里插入图片描述

无论父组件中插槽的顺序是怎样的,最终渲染结果都以子组件中插槽的顺序为准。

作用域插槽

作用域插槽其实就是带数据的插槽,简单的来说就是子组件提供给父组件的参数,该参数仅限于插槽中使用,父组件可根据子组件传过来的插槽数据来进行不同的方式展现和填充插槽内容。

子组件:

<template>
  <div>
      <h1>我是子组件</h1>
      <slot :aa="list" bb="123"></slot>
  </div>
</template>

<script>
export default {
  name: "child",
  data() {
      return {
          list: [
              1,2,3,4,5
          ]
      }
  }
};
</script>

父组件:

<template>
  <div class="box">
    <div>我是父组件</div>

    <child>
      <div slot-scope="ss1">
        <!--ss1这个名字是随便取的-->
        {{ ss1 }}
        <div>呵呵</div>
      </div>
    </child>

    <hr />

    <child>
      <div slot-scope="{ bb }"> <!--括号中的属性名必须是子组件中存在的-->
        {{ bb }}
        <div>嘻嘻</div>
      </div>
    </child>

    <hr />

    <child>
      <ul slot-scope="ss2">
        <li v-for="(item, index) in ss2.aa" :key="index">{{ item }}</li>
      </ul>
    </child>

    <hr />

    <child> 哈哈 </child>
  </div>
</template>

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

<style scoped>
.box {
  margin: 20px;
}
</style>

在这里插入图片描述

使用场景:如果子组件中的某一部分的数据,每个父组件都会有自己的一套对该数据的不同的呈现方式,这时就需要用到作用域插槽。

Vue2 和 Vue3 写法的区别

主要是一些写法上的区别

具名插槽

Vue2:

<!--子组件-->
<slot name="top"></slot>

<!--父组件-->
<div slot="top">xxx</div>

Vue3:

<!--子组件-->
<slot></slot>
<slot name="top"></slot>

<!--父组件-->
<template v-slot>
  <div>xxx</div>
</template>

<template #default>
  <div>xxx</div>
</template>

<template v-slot:top>
  <div>xxx</div>
</template>

<template #top>
  <div>xxx</div>
</template>

作用域插槽

Vue2:

<!--子组件-->
<slot :aa="list" bb="123"></slot>
// list: [ 1, 2, 3, 4, 5 ]

<!--父组件-->
<div slot-scope="ss1">
  {{ ss1 }} //输出 { "aa": [ 1, 2, 3, 4, 5 ], "bb": "123" }
</div>

<div slot-scope="{ bb }"> <!--括号中的属性名必须是子组件中存在的-->
  {{ bb }}  // 输出 123
</div>

Vue3:

<!--子组件-->
<slot :aa="list" bb="123" name="top"></slot>

<!--父组件-->
<template v-slot:top="ss1">
  <div>{{ ss1 }}</div> //输出 { "aa": [ 1, 2, 3, 4, 5 ], "bb": "123" }
</template>

<template v-slot:top="{ bb }">
  <div>{{ bb }}</div> // 输出 123
</template>

Vue3 写法扩展

<!--子组件-->
<template>
  <div>
      <h1>我是子组件</h1>
      <slot :aa="list" bb="123"></slot>
      <slot name="top"></slot>
  </div>
</template>

<script>
export default {
  name: "child",
  data() {
      return {
          list: [
              1,2,3,4,5
          ]
      }
  }
};
</script>

<style scoped>
</style>
<!--父组件-->
<template>
  <div class="box">
    <div>我是父组件</div>

    <child>
      <template v-slot="ss1">
        <div>传递所有参数:{{ ss1 }}</div>
      </template>
    </child>

    <child>
      <template v-slot="{ bb }">
        <div>通过解构传递具体参数:{{ bb }}</div>
      </template>
    </child>

    <child>
      <template v-slot="{ bb: haha }">
        <div>参数重命名:{{ haha }}</div>
      </template>
    </child>

    <child>
      <template v-slot="{ cc = '默认值' }">
        <div>参数默认值:{{ cc }}</div>
      </template>
    </child>

    <child>
      <template v-slot:[slotName]="{ dd = '默认值' }">
        <div>动态插槽名和默认值:{{ dd }}</div>
      </template>
    </child>
  </div>
</template>

<script>
import Child from "./Child.vue";
export default {
  components: { Child },
  data() {
    return {
      slotName: "top",
    };
  },
};
</script>

<style scoped>
.box {
  margin: 20px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983415.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一周热点-OpenAI 推出了 GPT-4.5,这可能是其最后一个非推理模型

在人工智能领域,大型语言模型一直是研究的热点。OpenAI 的 GPT 系列模型在自然语言处理方面取得了显著成就。GPT-4.5 是 OpenAI 在这一领域的又一力作,它在多个方面进行了升级和优化。 1 新模型的出现 GPT-4.5 目前作为研究预览版发布。与 OpenAI 最近的 o1 和 o3 模型不同,…

IP,MAC,ARP 笔记

1.什么是IP地址 IP 地址是一串由句点分隔的数字。IP 地址表示为一组四个数字&#xff0c;比如 192.158.1.38 就是一个例子。该组合中的每个数字都可以在 0 到 255 的范围内。因此&#xff0c;完整的 IP 寻址范围从 0.0.0.0 到 255.255.255.255。 IP 地址不是随机的。它们由互…

【A2DP】MPEG - 2/4 AAC 编解码器互操作性要求详解

目录 一、概述 二、编解码器特定信息元素(Codec Specific Information Elements ) 2.1 信息元素结构 2.2 对象类型(Object Type) 2.3 MPEG - D DRC 2.4 采样频率(Sampling Frequency) 2.5 通道(Channels) 2.6 比特率(Bit rate) 2.7 可变比特率(VBR) 三、…

网络安全规划重安全性需求

1.网络安全基本内容 安全包括哪些方面 操作系统内部的安全包括&#xff1a;数据存储安全、应用程序安全、操作系统安全。 此外还有网络安全、物理安全、用户安全教育。 网络安全&#xff1a; 网络安全是指网络系统的硬件、软件及其系统中的数 据受到保护&#xff0c;不因偶然…

发展史 | 深度学习 / 云计算

注&#xff1a;本文为来自 csdn 不错的“深度学习 / 云计算发展史 ” 相关文章合辑。 对原文&#xff0c;略作重排。 深度学习发展史&#xff08;1943-2024 编年体&#xff09;&#xff08;The History of Deep Learning&#xff09; Hefin_H 已于 2024-05-23 15:54:45 修改 …

Qt开发:nativeEvent事件的使用

文章目录 一、概述二、nativeEvent 的定义三、Windows 平台示例三、使用nativeEvent监测设备变化 一、概述 Qt 的 nativeEvent 是一个特殊的事件处理机制&#xff0c;允许开发者处理操作系统级别的原生事件。通常&#xff0c;Qt 通过 QEvent 机制来管理事件&#xff0c;但有时…

宠物医院台账怎么做,兽医电子处方单模板打印样式,佳易王兽医兽药开方宠物病历填写打印操作教程

一、概述 本实例以佳易王兽医宠物电子处方开单系统版本为例说明&#xff0c;其他版本可参考本实例。试用版软件资源可到文章最后了解&#xff0c;下载的文件为压缩包文件&#xff0c;请使用免费版的解压工具解压即可试用。 软件特点&#xff1a; 多场景处方兼容性针对宠物医…

RuleOS:区块链开发的“新引擎”,点燃Web3创新之火

RuleOS&#xff1a;区块链开发的“新引擎”&#xff0c;点燃Web3创新之火 在区块链技术的浪潮中&#xff0c;RuleOS宛如一台强劲的“新引擎”&#xff0c;为个人和企业开发去中心化应用&#xff08;DApp&#xff09;注入了前所未有的动力。它以独特的设计理念和强大的功能特性&…

Leetcode 刷题记录 04 —— 子串

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 和为 K 的子数组 方法一&#xff1a;枚举 方法二&#xff1a;前缀和 哈希表优化 0…

3D数字化:家居行业转型升级的关键驱动力

在科技日新月异的今天&#xff0c;家居行业正经历着一场前所未有的变革。从传统的线下实体店铺到线上电商平台的兴起&#xff0c;再到如今3D数字化营销的广泛应用&#xff0c;消费者的购物体验正在发生翻天覆地的变化。3D数字化营销不仅让购物变得更加智能和便捷&#xff0c;还…

开启Ollama的GPU加速

Ollama 开启 GPU 加速可显著提升大语言模型运行效率与性能&#xff0c;通过利用 NVIDIA CUDA 等 GPU 并行计算能力优化矩阵运算&#xff0c;推理速度可实现数倍至数十倍的提升&#xff0c;有效降低用户交互延迟。 1.验证WSL内是否已正确启用CUDA支持&#xff0c;需在两个不同环…

Linux 指定命令行前后添加echo打印内容

目录 一. 前提条件二. 通过sh脚本进行批量修改三. 通过Excel和文本编辑器进行批量转换四. 实际执行效果 一. 前提条件 ⏹项目中有批量检索文件的需求&#xff0c;如下所示需要同时执行500多个find命令 find ./work -type f -name *.java find ./work -type f -name *.html fi…

力扣HOT100之哈希:128. 最长连续序列

这道题我想的比较简单&#xff0c;先遍历一遍输入的数组&#xff0c;然后将读取到的数字存入一个map容器中&#xff08;注意&#xff0c;不是unordered_map&#xff09;&#xff0c;数字作为键&#xff0c;布尔变量为值&#xff0c;然后再遍历一遍map&#xff0c;用一个变量tem…

在VMware上部署【Rocky Linux】保姆级

镜像下载 国内各镜像站点均可下载rocky Linux镜像&#xff0c;下面例举阿里云网站 阿里云镜像站点&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 具体下载步骤如下&#xff1a; 创建虚拟机 准备&#xff1a;在其他空间大的盘中创建存储虚拟机的目录&#xf…

vue3 遇到babel问题(exports is not defined) 解决方案

由于我在引用ant-design-vue插件&#xff0c;于是产生了下图的问题。 1.问题分析 Babel 是一个 JavaScript 编译器&#xff0c;主要用于&#xff1a;将 ES6 代码转译为 ES5 代码&#xff0c;以兼容旧版浏览器。处理模块化语法&#xff08;如 import/export&#xff09;。 2.解…

2025年网络安全决议

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Keeper Security公司首席执行官兼联合创始人Darren Guccione分享了他认为企业领导人在2025年应该优先考虑的事情。 Keeper Security公司首席执行官兼联合创始人Da…

java通用自研接口限流组件

某业务中需要对后端接口进行限流&#xff0c;我们可以直接引入阿里巴巴的Sentinel快速实现&#xff0c;但是某企业中出于安全考虑&#xff0c;需要部门自己研发一套&#xff0c;可以采用RedisLua脚本AOP反射自定义注解来实现 思路来源于链接 项目结构&#xff1a; 启动类&…

苹果笔记本换电池攻略

苹果笔记本换电池攻略 笔记本型号 MacBook Pro A1708 难点或容易出问题的点 1、开后盖 开后盖是个技巧活&#xff0c;差点因为打不开后盖直接放弃自己换电池。主要是掌握不好力度&#xff0c;太用力怕掰坏了&#xff0c;不用力又打不开。 2、撕电池接口保护膜 有胶&#x…

【笔记】STM32L4系列使用RT-Thread Studio电源管理组件(PM框架)实现低功耗

硬件平台&#xff1a;STM32L431RCT6 RT-Thread版本&#xff1a;4.1.0 目录 一.新建工程 二.配置工程 ​编辑 三.移植pm驱动 四.配置cubeMX 五.修改驱动文件&#xff0c;干掉报错 六.增加用户低功耗逻辑 1.设置唤醒方式 2.设置睡眠时以及唤醒后动作 ​编辑 3.增加测试命…

【计网】应用层

应用层 6.1 应用层概述6.2 客户/服务器&#xff08;C/S&#xff09;方式和对等&#xff08;P2P&#xff09;方式6.3 动态主机配置协议DHCP6.4 域名系统DNS6.5 文件传送协议FTP6.6 电子邮件6.7 万维网WWW 6.1 应用层概述 6.2 客户/服务器&#xff08;C/S&#xff09;方式和对等&…