细谈Vue中插槽Slots

2023-10-29


浅谈Vue中插槽Slots

  • <slot> 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。
  • Vue 组件的插槽机制是受原生 Web Component <slot> 元素的启发而诞生,同时还做了一些功能拓展
  • vue的slot主要分三种,默认插槽,具名插槽,作用域插槽;使用插槽是在存在父子关系的组件中使用,我们可以在子组件中决定插槽的位置,同时子组件也可以给这些插槽的默认信息,当父组件中没有需要给子组件插槽插入信息时,显示的是子组件插槽定义的默认信息
  • 插槽 Slots | Vue.js (vuejs.org)

1、默认插槽

  • 作用:让组件内部的一些结构支持自定义
  • 场景:将需要多次显示的对话框,封装成一个组件;组件的内容不希望写死,需要自定义。此时可以使用slot占位封装

在这里插入图片描述

  • 插槽基本使用:

    • 组件内需要定制的结构部分,改用<slot></slot>占位
    <template>
    	<slot></slot>
    </template>
    
    • 使用组件时,<MyDialog></MyDialog>标签内部,传入结构替换slot
    <MyDialog>success</MyDialog>
    
  • 插槽内可以包含任何模板代码,包括HTML、组件

  • 父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的


2、后备内容

  • 场景:通过插槽完成了内容的定制,传什么显示什么,但是如果不传,则是空白,此时可以给插槽设置默认显示内容

在这里插入图片描述

  • 插槽后备内容(默认值)基本使用:

    • <slot></slot>标签内放置内容,作为默认显示内容
    <template>
    	<slot>默认文本</slot>
    </template>
    
    • 外部使用组件时,不传东西,则slot会显示后备内容
    • 外部使用组件时,传东西了,则slot整体会被换掉

3、具名插槽

  • 场景:一个组件内有多处结构,需要外部传入标签,进行定制

在这里插入图片描述

  • vue 2.6.0 版本使用具名插槽和作用域插槽有了新的统一语法,使用v-slot替换了之前的slot和slot-scope

  • 具名插槽基本使用:

    • 多个slot使用name属性区分名字
    <slot name="head"></slot>
    
    • template配合v-slot:名字来分发对应标签
    <template v-slot:head>
    	文本
    </template>
    
    //动态插槽名
    <template v-slot:[dynamicSlotName]>
    	文本
    </template>
    
    //简化写法
    <template #head>
    	文本
    </template>
    
  • 如果一个<slot>不带name属性的话,那么它的name默认为default

  • 一般情况下,v-slot只能添加在一个<template>


4、作用域插槽

  • 作用:定义 slot插槽的同时,是可以传值的。给插槽上可以绑定数据,将来使用组件时可以用

  • 场景:封装表格组件

    1. 父传子,动态渲染表格内容
    2. 利用默认插槽,定制操作列
    3. 删除或查看都需要用到当前项的id,属于组件内部的数据通过作用域插槽传值绑定,进而使用
  • 作用域插槽基本使用:

    • 给slot标签,以添加属性的方式传值
    <slot :id="item.id" msg=“测试文本"></slot>
    
    • 所有添加的属性,都会被收集到一个对象中
    { id: 3,msg:"测试文本’}
    
    • 在template中,通过#插槽名= "obj"接收,默认插槽名为default
    <MyTable :list="list">
        <template v-slot:default="obj">
            <button @click="del(obj.id)">删除</button>		
        </template>
    </MyTable>
    
  • 解构插槽:

<MyTable :list="list">
    <template v-slot:default={id}>
        <button @click="del(id)">删除</button>				
    </template>
</MyTable>
  • prop重命名:
<MyTable :list="list">
    <template v-slot:default={id:messageId}>
        <button @click="del(messageId)">删除</button>				
    </template>
</MyTable>
  • prop赋值(定义后备内容):
<MyTable :list="list">
    <template v-slot:default="{id={messageId:1}}">
        <button @click="del(messageId)">删除</button>				
    </template>
</MyTable>

5、代码实践

  • 在实际项目中刚好有遇到使用slot的场景,这里结合实际项目进行具体分析,代码主体内容如下:
<!-- tableConfig.js -->
<template>
  <!-- 表格数据 -->
  <el-table :data="tableData">
    <!-- 表头数据 -->
    <el-table-column
      v-for="(item, index) in tableHeader"
      :label="item.text"
      :prop="item.prop"
      :key="index"
    >
      <template slot-scope="scope">
        <!-- 具名作用域插槽 命名为detail 传递单行表格数据 表头数据 类型(父组件传入)-->
        <slot name="detail" :data="scope.row" :item="item" :type="type">
          <div>
            <!-- 后置内容 展示表格文本数据 -->
            <span
              class="row-span"
              v-html="
                scope.row[item.prop] !== '' && scope.row[item.prop] !== null
                  ? scope.row[item.prop]
                  : '-'
              "
            ></span>
          </div>
        </slot>
      </template>
    </el-table-column>
  </el-table>
  <!-- 表格分页 -->
  <el-pagination></el-pagination>
</template>
  • 这段代码使用了 Element UI 的表格组件的模板,用于展示表格数据和表头数据
  • 首先,通过 :data="tableData" 将表格数据传递给 el-table 组件,其中 tableData 是一个包含实际数据的数组。
  • 然后,使用 v-for 循环遍历 tableHeader 数组生成表头列。在每个表头列中,使用 :label="item.text" 将表头文本显示出来,使用 :prop="item.prop" 绑定对应数据字段的值。
  • 接下来,使用 <template slot-scope="scope"> 定义一个插槽,命名为 detail。在这个插槽中,通过 :data="scope.row" 将单行的表格数据传递给插槽,通过 :item="item" 将表头数据传递给插槽,通过 :type="type" 将类型(在父组件中传入)传递给插槽。
  • 在插槽的内容中,首先展示了表头数据,通过 v-html 属性将 scope.row[item.prop] 的值渲染为 HTML。如果该值不为空或不为 null,则展示该值;否则展示 -
  • 这样,就可以在父组件中使用该模板,并利用插槽来自定义每个表格单元格的内容。具体的自定义内容可以在插槽的位置进行添加。
<!-- index.vue -->
<config-table :table-header="recordListHeader" :table-data="recordListData">
    <!-- 插槽内容 -->
    <template v-slot:detail="slotProps">
        <!-- 判断是否展示 -->
        <div v-if="slotProps.item.prop === 'OPERATE'">
            <!-- HTML -->
            <p v-if="slotProps.type !== 'master'" class="gameConfig_table_config_text"
                @click="handleEditDetail(slotProps.data, slotProps.data.$index)">
                切换所属游戏</p>
            <p class="gameConfig_table_config_text" @click="handleEditProperty(slotProps.data, slotProps.data.$index)">
                编辑游戏内容</p>
        </div>
        <!-- 判断是否展示 -->
        <div v-else-if="slotProps.item.prop === 'list'">
            <!-- 组件 -->
            <game-and-icon-column
                style="cursor: pointer;text-align: left;"
                :key="index"
                v-for="(item, index) in slotProps.data.list"
                :appData="item"
                @click.native="toDetail(item, slotProps.type)"
            />
        </div>
    </template>
</config-table>
  • 这段代码是在使用 <config-table> 组件时,在组件内部定义了一个名为 detail 的插槽,并提供了插槽内容。
  • 首先,通过 :table-header="recordListHeader":table-data="recordListData" 将表头数据和表格数据传递给 <config-table> 组件。
  • 然后,在 <config-table> 组件中,通过 <template v-slot:detail="slotProps"> 定义了一个名为 detail 的插槽,并将插槽的 props 绑定到 slotProps 对象上。
  • 在插槽的内容中,首先通过 v-if="slotProps.item.prop === 'OPERATE'" 判断是否展示该内容(根据表头列的属性 prop 来判断)。如果满足条件,则会显示对应元素。
  • 在插槽内容的其余部分,通过 v-else-if="slotProps.item.prop === 'list'" 判断是否展示该内容。如果满足条件,则会显示对应元素。
  • 这样,根据表格数据和表头数据的不同,插槽内容会根据条件进行展示,可以自定义每个单元格的内容和交互行为。
    先通过 v-if="slotProps.item.prop === 'OPERATE'" 判断是否展示该内容(根据表头列的属性 prop 来判断)。如果满足条件,则会显示对应元素。
  • 在插槽内容的其余部分,通过 v-else-if="slotProps.item.prop === 'list'" 判断是否展示该内容。如果满足条件,则会显示对应元素。
  • 这样,根据表格数据和表头数据的不同,插槽内容会根据条件进行展示,可以自定义每个单元格的内容和交互行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

细谈Vue中插槽Slots 的相关文章

随机推荐

  • Spring Boot 是什么,有什么用。

    见 http www csdn net article a 2016 05 12 15838098 maven Java web bootstrap dataTable app开发QQ群 566862629 希望更多人一起帮助我学习 首先
  • 计算机视觉二 局部图像描述子 SIFT算法

    目录 一 SIFT算法 1 基本介绍 SIFT算法可以解决的问题 2 相关概念 1 尺度空间理论 2 高斯模糊 3 高斯金字塔 4 关键点检测 DOG 5 关键点方向分配 6 关键点描述 7 关键点匹配 二 STFL算法的实现 1 SIFT
  • MATLAB算法实战应用案例精讲-【数据分析】时序异常检测(附实战应用案例)

    目录 前言 算法原理 算法思想 时序异常检测方法 1 统计方法 2 预测方法 机器学习 lt
  • scrapy的深入使用:

    1 区分正常的debug和scrapy中的debug 2 scrapy shell的使用 scrapy shell是scrapy提供的一个终端工具 能够通过它查看scrapy中对象的属性和方法 以及测试xpath 使用方法 scrapy s
  • Python爬虫理论

    目录 1 解析HTML格式 2 解析JSON格式 3 解析二进制格式 4 实战 1 解析HTML格式 解析HTML格式主要有以下几种方法 我们在之后的学习中重点关注前两种 1 lxml库 第三方库 支持HTML和XML格式解析 支持XPat
  • python matplotlib 使用总结

    1 绘制线图 import random import matplotlib pyplot as plt 构造x列表和y列表 x range 100 y random randint 1 10 for i in range 100 plt
  • 为什么晶振处加俩电容?

    晶振是晶体振荡器的简称 在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络 电工学上这个网络有两个谐振点 以频率的高低分其中较低的频率是串联谐振 较高的频率是并联谐振 由于晶体自身的特性致使这两个频率的距离相当的接近 在这个
  • GCC生成静态库.a和动态库.so

    目录 一 静态库和动态库 1 1静态库 1 2动态库 二 GCC生成静态库和动态库 2 1准备过程 2 2静态库的使用 2 3动态库的使用 2 4静态库与动态库的比较 三 库的使用实例 1 代码 2 生成静态库 3 生成动态库 一 静态库和
  • 使用淘宝镜像解决npm下载慢的问题

    由于使用npm下载包的速度会非常慢 所以我们可以使用淘宝镜像来下载 例如下载http server 在后面加上 registry https registry npm taobao org 就会通过淘宝镜像来下载 npm install h
  • Linux报错:OSError: [Errno 28] No space left on device

    Traceback most recent call last File D02 py line 852 in
  • mac 10.13.6 升级至10.14.6再升级至12.4

    mac 10 13 6 升级至10 14 6再升级至12 4 前几天一个月薪35k的兄弟 给我推了一个人工智能学习网站 看了一段时间挺有意思的 包括语音识别 机器翻译等从基础到实战都有 很详细 分享给大家 大家及时保存 说不定啥时候就没了
  • 查看Mysql版本的四种方法

    1 D MySql bin gt mysql V mysql Ver 14 12 Distrib 5 0 51b for Win32 ia32 2 mysql gt status mysql Ver 14 12 Distrib 5 0 51
  • 华为计算机单位换算在哪里,单位换算

    教学目标 1 使学生进一步理解人民币单位间的十进关系 初步掌握基本的单位换算方法 2 通过教学 初步培养学生的动手操作能力和推理能力 3 培养学生的合作意识和应用意识 体验数学的价值 教学重点 初步理解人民币单位之间的换算关系 教学难点 正
  • 关于jquery获取input的value问题

    刚开始接触jquery 很多东西不熟悉 在用 id 来获得页面的input元素的时候 发现 id value不能取到值 后来终于在伟大的百度帮助下 找到了问题的原因 是一个jquery对象 而不是一个dom element value是do
  • Python continue 语句

    Python continue 语句跳出本次循环 而break跳出整个循环 continue 语句用来告诉Python跳过当前循环的剩余语句 然后继续进行下一轮循环 continue语句用在while和for循环中 Python 语言 co
  • 全面解析文件操作~快来深入学习~

    目录 1 为什么使用文件 2 什么是文件 2 1 程序文件 2 2 数据文件 2 3 文件名 3 文件的打开和关闭 3 1 文件指针 3 2 文件的打开和关闭 4 文件的顺序读写 4 1 对比一组函数 5 文件的随机读写 5 1 fseek
  • linux 文件及目录的基本操作

    文件的操作命令 1 显示指定目录和文件 ls eg ls l etc d 2 显示当前目录的名称 pwd eg pwd 3 进入 退出目录 cd eg cd etc 进入根目录下的etc目录 cd 退回到上一级目录 cd 退回到根目录 4
  • Scrum Master 面试题 – 你必须知道的22个Scrum基础知识

    以下的22个问题基本上涵盖了Scrum所涉及的内容 如果你能够正确回答出所有问题 那么你已经具备了作为一名Scrum Master的基本素质 当然 作为一名合格的Scrum Master 更重要的是你的经验 因为Scrum Master更多
  • 尺取法--例题模板详解

    尺取法 一种神奇的技巧 在Codeforces中显示它的算法名称叫做 two pointers 直译成中文的话叫双指针法 尺取法 顾名思义 像尺子一样取一段 尺取法通常是对数组保存一对下标 即所选取的区间的左右端点 然后根据实际情况不断地推
  • 细谈Vue中插槽Slots

    细谈Vue中插槽Slots 浅谈Vue中插槽Slots 1 默认插槽 2 后备内容 3 具名插槽 4 作用域插槽 5 代码实践 浅谈Vue中插槽Slots