(三十八)Vue之插槽Slots

文章目录

  • 插槽介绍
  • 插槽分类
    • 默认插槽
    • 具名插槽
      • 条件插槽
      • 动态插槽名
    • 作用域插槽
      • 默认作用域插槽
      • 具名作用域插槽

上一篇:(三十七)vue 项目中常用的2个Ajax库

插槽介绍

在之前的文章中,我们已经了解到组件能够接收任意类型的值作为 props,在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段,由此就有了插槽。

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

分类:默认插槽、具名插槽、作用域插槽

插槽分类

默认插槽

在外部没有提供任何内容的情况下,可以为插槽指定默认内容。

使用方式:当父组件没有传递内容的时候就会显示子组件slot的内容,有传递内容时则显示<html结构>的内容。

       父组件中:
               <MyComponent >
                  <html结构>
               </MyComponent >
       子组件中:
               <template>
                      <!-- 定义插槽 -->
                      <slot>插槽默认内容...</slot>
               </template>

demo:做一个简单的分类显示

父组件

<div class="container">
	<Category title="美食">
      <img src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg">
    </Category>
    <Category title="游戏">
      <ul>
        <li v-for="(item,index) in games" :key="index">{{item}}</li>
      </ul>
    </Category>
    <Category title="电影"> </Category>
 </div>
export default {
  name: "App",
  components: {Category},
  data() {
    return {
      foods:['火锅','烧烤','小龙虾','牛排'],
      games:['QQ飞车','穿越火线','王者荣耀','英雄联盟'],
      films:['《教父》','《拆弹专家》','《你好,李焕英》','《泰坦尼克号》']
    }
  },
}

子组件

<div class="category">
	<h3>{{title}}分类</h3>
	<slot>没有具体结构,我就会出现</slot>
</div>

效果:
在这里插入图片描述

具名插槽

具名插槽,顾名思义,就是带有名字的插槽,具有 name 属性,实际上默认插槽也是一个不带 name 的具名插槽, 会带有默认的名字 default 。

使用方式:父组件使用slot或v-slot给插槽命名,子组件使用slot标签的name方法定义某个名字插槽,v-slot 有对应的简写 #,因此可以简写为 #name。其意思就是将这部分模板片段传入子组件的 name名的插槽中。

		父组件中:
               <MyComponent >
                   <template slot="name1">
                     <div>html结构1</div>
                   </template>
       
                   <template v-slot:name2>
                      <div>html结构2</div>
                   </template>

                   <template #name3>
                   	  <div>html结构3</div>
                   </template>
               </MyComponent >
       子组件中:
               <template>
                      <!-- 定义插槽 -->
                      <slot name="name1">插槽默认内容...</slot>
                      <slot name="name2">插槽默认内容...</slot>
                      <slot name="name3">插槽默认内容...</slot>
               </template>

demo:
父组件:

<template>
  <div class="container">
    <Category title="美食">
      <img slot="center" src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg">
      <a slot="footer" href="http://www.baidu.com">更多美食</a>
    </Category>

    <Category title="游戏">
      <ul slot="center">
        <li v-for="(item,index) in games" :key="index">{{item}}</li>
      </ul>
    </Category>

    <Category title="电影">
      <template v-slot:footer>
        <div class="foot">
          <a href="http://www.baidu.com">经典</a>
          <a href="http://www.baidu.com">热门</a>
          <a href="http://www.baidu.com">推荐</a>
        </div>
        <h4 slot="footer">欢迎前来观影</h4>
      </template>
    </Category>
  </div>
</template>

子组件:
下面展示一些 内联代码片

<template>
<div class="category">
  <h3>{{title}}分类</h3>
  <slot name="center">没有具体结构,我就会出现1</slot>
  <slot name="footer">没有具体结构,我就会出现2</slot>
</div>
</template>

效果:
在这里插入图片描述

条件插槽

有时需要根据插槽是否存在来渲染某些内容。可以结合使用 $slots 属性与 v-if 来实现。

使用方式:在子组件中使用

<template>
    <div v-if="$slots.name1">
      <slot name="name1" />
    </div>
    
    <div v-if="$slots.default">
      <slot />
    </div>
    
    <div v-if="$slots.name2">
      <slot name="name2" />
    </div>
</template>

动态插槽名

在vue2.6.0引入的动态指令参数,在 v-slot 上也是有效的,即可以定义下面这样的动态插槽名:

<base-layout>
  <template v-slot:[name1]>
    ...
  </template>

  <!-- 缩写为 -->
  <template #[name2]>
    ...
  </template>
</base-layout>

作用域插槽

由于插槽的内容无法访问到子组件的状态,然而在某些场景下插槽的内容可能想要同时使用父组件域内和子组件域内的数据。要做到这一点,我们需要一种方法来让子组件在渲染时将一部分数据提供给插槽。

使用方式:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(数据在子组件中,但使用数据所遍历出来的结构由父组件决定)

默认作用域插槽

           父组件中:
                   <MyComponent >
                       <template scope="scopeData">
                           <!-- 生成的是ul列表 -->
                           <ul>
                               <li v-for="g in scopeData.text" :key="g">{{g}}</li>
                           </ul>
                       </template>
                   </MyComponent >
           
                   <MyComponent >
                       <template slot-scope="scopeData">
                           <h4 v-for="g in scopeData.text" :key="g">{{g}}</h4>
                       </template>
                   </MyComponent >
					 <!-- v-slot用法-->
				<MyComponent v-slot="{ text, test2}">
				 	 {{ text }} {{ test2}}
				</MyComponent>
           子组件中:
                   <template>
                       <div>
                           <slot :text="text"  :test2="test2"></slot>
                       </div>
                   </template>
                   
                   <script>
                       export default {
                           name:'MyComponent ',
                           props:['title'],
                           //数据在子组件自身
                           data() {
                               return {
                                   text:['1','2','3','4'],
                                   test2: "test2"
                               }
                           },
                       }
                   </script>

具名作用域插槽

具名作用域插槽的工作方式也是类似的,插槽 props 可以作为 v-slot 指令的值被访问到:v-slot:name=“slotProps”。也可以进行缩写:

父组件:
<MyComponent>
  <template v-slot:test1="slotProps">
    {{ slotProps}}
  </template>

  <template #default="slotProps">
    {{ slotProps}}
  </template>
 
 <template #test2="slotProps">
    {{ slotProps}}
  </template>
</MyComponent>

子组件:
<slot  slotProps="hello"></slot>

注意:如果你同时使用了具名插槽与默认插槽,则需要为默认插槽使用显式的 <template>标签。尝试直接为组件添加 v-slot 指令将导致编译错误。这是为了避免因默认插槽的 props 的作用域而困惑。

例如:

<!-- 该模板无法编译 -->
<template>
  <MyComponent v-slot="{ slotProps}">
    <p>{{ slotProps }}</p>
    <template #test>
      <!-- slotProps 属于默认插槽,此处不可用 -->
      <p>{{ slotProps }}</p>
    </template>
  </MyComponent>
</template>

为默认插槽使用显式的<template>标签有助于更清晰地指出 message 属性在其他插槽中不可用:

<template>
  <MyComponent>
    <!-- 使用显式的默认插槽 -->
    <template #default="{ slotProps}">
      <p>{{ slotProps }}</p>
    </template>

    <template #test>
   		 xxx
    </template>
  </MyComponent>
</template>

demo:
父组件:

	<Category title="游戏">

        <!-- 使用显式的默认插槽 -->
        <template #default="{ slotProps}">
          <p>{{ slotProps }}</p>
        </template>

      <template #test="test">
        <p>Here's some contact info</p>
        <p>{{ test }}</p>
      </template>
    </Category>

子组件:

	<h3>{{title}}分类</h3>
  <slot :slotProps="games" test="hello">默认内容</slot>
  <slot name="test" :slotProps="games" test="hello">默认内容</slot>

效果:
在这里插入图片描述

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

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

相关文章

bmp转jpg怎么转?给你介绍几种将bmp转成jpg的方法

bmp转jpg怎么转&#xff1f;首先&#xff0c;了解BMP和JPG两种格式的特点对于转换过程非常重要。BMP格式以无损方式存储图像数据&#xff0c;这意味着它可以保留图像的每个像素信息&#xff0c;但文件大小较大。而JPG格式则使用有损压缩算法&#xff0c;可以将文件大小大大减小…

ARM32开发--PWM通道输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 内容 需求 通用定时器多通道 开发流程 多通道配置 占空比更新 完整代码 高级定时器通道输出 开发流程 通道配置 Break配置 完整代码 总结 前言 加强掌握…

【Python】Flask问答系统Demo项目

学习视频 我是跟着知了传课学的Flask&#xff0c;起初了解Flask还是GPT告诉我的&#xff0c;现在可以说用Flask做后端是真的方便&#xff01; https://www.bilibili.com/video/BV17r4y1y7jJ 项目结构与下载 FlaskOA&#xff08;项目文件夹&#xff09; │ app.py │ conf…

性能测试------LoadRunner 详解

性能测试------LoadRunner的使用 一、什么是LoadRunner LoadRunner是一款由Micro Focus&#xff08;以前是Hewlett-Packard或HP公司&#xff09;开发的性能测试工具。它用于测试和分析系统在负载下的行为和性能。具体来说&#xff0c;LoadRunner可以模拟数千名用户同时访问应…

r语言数据分析案例26-美元兑换欧元汇率分析与研究

一、研究背景&#xff1a; 汇率是国际贸易和金融中最重要的价格之一&#xff0c;它直接影响着各国的经济利益和国际竞争力。美元兑换欧元汇率是全球最重要的汇率之一&#xff0c;它的波动对全球经济和金融市场都有着深远的影响。因此&#xff0c;对美元兑换欧元汇率的分析和研…

树莓派4B_OpenCv学习笔记5:读取窗口鼠标状态坐标_TrackBar滑动条控件的使用

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习:读取窗口鼠标状态坐标_TrackBar滑动条控件的使…

华为机考入门python3--(35)牛客35-蛇形矩阵

分类&#xff1a;蛇形矩阵 知识点&#xff1a; 取出每行中非零的数字 row [str(num) for num in matrix[i] if num ! 0] 题目来自【牛客】 def generate_snake_matrix(n):# 初始化一个NN的矩阵matrix [[0] * n for _ in range(n)] start 1# i为行&#xff0c;&#xf…

国内著名的四个“大模型”

关于您提到的国内四大模型&#xff0c;这里为您详细介绍&#xff1a; 文心大模型&#xff1a;文心大模型是百度自主研发的产业级知识增强大模型。它以创新性的知识增强技术为核心&#xff0c;从单模态大模型发展到跨模态&#xff0c;从通用基础大模型到跨领域、跨行业&#xff…

Flutter打包网络问题解决办法

问题情况":app:compileReleaseJavaWithJavac" 报错的最主要问题其实在下一句 Failed to find Build Tools revision 30.0.3,请查看自己的Android sdk版本,比如我的就是’34.0.0’版本. 解决办法: 在app/build.gradle中的android下添加,即可 buildToolsVersion 3…

理解查准率P、查全率R及Fβ度量怎么得来的

如果得到的是一组样本在两个算法上的一次预测结果&#xff0c;其中每个样本都被赋予了一个为正样本的概率&#xff08;例如&#xff0c;通过逻辑回归或朴素贝叶斯分类器得到的概率估计&#xff09;&#xff0c;那么可以通过改变不同的阈值点来利用这些预测结果画出PR曲线。 如果…

SpringBoot基础配置文件

在SpringBoot当中, 所有的配置文件都将会被配置在application.preperties当中 一: 配置服务器端口 只需要在相应的properties当中输入, 修改我们的端口号即可 server.port80 二: 修改banner #设置 将我们的Banner不再进行显示, 或者是也可以让其在控制台当中显示, 或者是日…

02 DHCP原理与配置

目录 2.1 DHCP工作原理 1. 了解DHCP服务 2. 使用DHCP的好处 3. DHCP的分配方式 4. DHCP的租约过程 1. 客户机请求IP地址 2. 服务器响应 3. 客户机选择IP地址 4. 服务器确定租约 5. 重新登录 6. 更新租约 2.2 使用DHCP动态配置主机地址 2.2.1 配置DHCP服务器 1. 安装DHCP服务器…

ADS加不上路由的若干可能性与问题查找方法

文章目录 一.查询本机ip地址二. PIN ip地址 一.查询本机ip地址 用鼠标点击开始——运行&#xff08;或者快捷键winR&#xff09;、弹出【运行】对话框、在窗口中输入cmd&#xff0c;如下图所示&#xff1a; 输入ipconfig/all查找局域网当中的本机ip地址 在浏览器中打开百度…

Android Studio gradle下载失败

Android Studio下载Gradle插件总是出现网络超时问题。 解决办法&#xff1a; 替换为国内版本的镜像。 推荐使用国内腾讯的镜像&#xff1a; Index of /gradle/ 例如&#xff1a;gradle-8.0镜像&#xff1a; https://mirrors.cloud.tencent.com/gradle/gradle-8.0-bin.zip…

文案策划日常大公开:掌握这些技巧,让你工作效率翻倍

本周的工作和生活安排得满满当当&#xff0c;但这些看似繁重的任务&#xff0c;其实都是我利用碎片化时间高效完成的。 这里和大家分享一下&#xff0c;我是如何在这忙碌的一周中&#xff0c;既完成本职工作又享受生活的。 本周工作日常汇总&#xff1a; 1. 品牌小红薯笔记&…

观察 jvm 运行时数据区内存大小(native memory tracking)

jvm 运行时数据区 jvm 运行时数据区包括且不限于以下几个部分: 堆(heap): 用于存储对象实例和数组。堆内存的分配和释放由垃圾回收器进行管理。方法区(method area): 用于存储类的信息、静态变量、常量等。jdk 8 后方法区位于 metaspace。虚拟机栈(vm stack): 用于存储方法的…

石化加工vr中毒窒息事故培训系统开发降低了培训成本和风险。

化工行业是工伤预防工作的重点领域之一&#xff0c;工伤预防及安全生产整治工作任务艰巨、责任重大。为进一步强化红线意识、底线思维&#xff0c;深圳VR公司研发的化工VR事故警示教育系统&#xff0c;以其独特的沉浸式体验&#xff0c;为员工的安全教育开辟了新的道路。目前化…

【SWH】陆地生态系统蒸散模拟理论、蒸散估算、站点及区域尺度模拟

蒸散&#xff08;又称蒸散发&#xff09;估算是开展水资源管理、洪水预报、海绵城市成效评估、农业节水灌溉、水源涵养评估、生态需水评估等应用实践过程的关键环节&#xff0c;因此准确计算和模拟地表蒸散显得尤为重要。与此同时&#xff0c;蒸散也是陆地表层最重要的水循环过…

如何使用ai人工智能作诗?7个软件帮你快速作诗

如何使用ai人工智能作诗&#xff1f;7个软件帮你快速作诗 使用AI人工智能作诗是一种创新的写作方式&#xff0c;以下是一些可以帮助您快速作诗的AI人工智能软件&#xff1a; 1.AI创作云&#xff1a; 这是一个AI诗歌助手应用程序&#xff0c;可以根据您提供的主题或关键词生成…

Qt:QDialogButtonBox的使用

QDialogButtonBox是Qt自带的按钮箱&#xff0c;通过枚举QDialogButtonBox::ButtonRole可以添加Qt定义按钮&#xff0c;或者通过方法QDialogButtonBox::addButton添加自定义的按钮。 // 自定义按钮。 button_box_ new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonB…