细谈Vue中插槽Slots

news2024/12/23 4:31:02

细谈Vue中插槽Slots

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


浅谈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'" 判断是否展示该内容。如果满足条件,则会显示对应元素。
  • 这样,根据表格数据和表头数据的不同,插槽内容会根据条件进行展示,可以自定义每个单元格的内容和交互行为。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

冠达管理:迎政策利好,数据要素概念爆发,卓创资讯、三维天地等涨停

数据要素概念22日盘中强势拉升&#xff0c;截至发稿&#xff0c;卓创资讯、三维六合“20cm”涨停&#xff0c;深圳瑞捷涨超15%&#xff0c;世纪恒通涨超13%&#xff0c;新炬网络、生意宝亦涨停&#xff0c;中富通涨超8%。值得注意的是&#xff0c;新炬网络已连续两个买卖日涨停…

冠达管理:央行降息是什么意思?央行降息利好什么股票?

为了顺应和刺激经济的发展&#xff0c;央行有时会通过上升和下降利息来平衡。一般降息是在经济不景气的时分调控。那么央行降息是什么意思&#xff1f;央行降息利好什么股票&#xff1f;下面就由冠达管理为我们分析&#xff1a; 央行降息是什么意思&#xff1f; 降息的意思便是…

〔015〕Stable Diffusion 之 模型管理和信息管理插件 篇

✨ 目录 &#x1f388; 模型管理&#x1f388; 添加预览图&#x1f388; 添加详细描述&#x1f388; 模型分组&#x1f388; 下载 Civitai Helper 插件&#x1f388; 插件 Civitai Helper 使用方法 &#x1f388; 模型管理 点击生成按钮下的 显示/隐藏扩展模型 Show/hide extr…

【Terraform学习】使用 Terraform 托管 S3 静态网站(Terraform-AWS最佳实战学习)

使用 Terraform 托管 S3 静态网站 实验步骤 前提条件 安装 Terraform&#xff1a; 地址 下载仓库代码模版 本实验代码位于 task_s3 文件夹中。 变量文件 variables.tf 在上面的代码中&#xff0c;您将声明&#xff0c;aws_access_key&#xff0c;aws_secret_key和区域变量…

人工智能的螺旋式发展历程

人工智能的螺旋式发展历程 人工智能的历史自1956年开始至今&#xff0c;已经有66年的历史。世界人工智能历史可分为三个阶段&#xff0c;从1956年至1976年是人工智能的第一个发展阶段&#xff0c;1976年至2006年是第二个发展阶段&#xff0c;而2006年至今则是人工智能的第三个发…

Spring Boot系统之高可用限流实现解决方案

1.什么是限流 限流是对某一时间窗口内的请求数进行限制&#xff0c;保持系统的可用性和稳定性&#xff0c;防止因流量暴增而导致的系统运行缓慢或宕机。 为什么需要限流 其实限流思想在生活中随处可见&#xff0c;例如景区限流&#xff0c;防止人满为患。热门餐饮需要排队就…

3.Trunc截断函数用法

TRUNC函数用于对值进行截断 用法有两种&#xff1a;TRUNC&#xff08;NUMBER&#xff09;表示截断数字&#xff0c;TRUNC&#xff08;date&#xff09;表示截断日期 (1)截断数字 格式&#xff1a;TRUNC&#xff08;n1,n2&#xff09;&#xff0c;n1表示被截断的数字&#xf…

【LeetCode】买卖股票的最佳时机之k天

买卖股票的最佳时机之k天 题目描述算法描述编程代码 链接: 买卖股票的最佳时机之k天 题目描述 算法描述 编程代码 class Solution { public:int maxProfit(int k, vector<int>& prices) {int n prices.size();k min(k,n/2);vector<vector<int>> f(n,…

【中危】PowerJob 未授权访问漏洞 (CVE-2023-36106)

漏洞描述 PowerJob 是一款开源的分布式任务调度框架。 在 PowerJob 受影响版本中存在错误的访问控制漏洞。由于没有对/container/list接口做鉴权&#xff0c;未授权的攻击者可以构造 appId 参数访问 /container/list接口获取应用容器的标识、运行状态、日志等敏感信息。 漏洞…

packge.json中的browserlistrc配置有什么用?

theme: smartblue 前端开发中&#xff0c;需要考虑前端开发中&#xff0c;需要考虑CSS及JS的兼容性&#xff0c;browserlistrc指定了需要兼容的浏览器。 数据来源 Browserslist 的数据都是来自caniuse.com的。 使用方法 package.json {"browserslist": ["l…

OpenAI首席执行官谈马斯克退出的影响;关于 Stable Diffusion 扩展功能的内容总结

&#x1f989; AI新闻 &#x1f680; OpenAI首席执行官谈马斯克退出的影响 摘要&#xff1a;OpenAI首席执行官萨姆奥特曼在接受采访时表示&#xff0c;埃隆马斯克退出OpenAI给公司带来了巨大震惊&#xff0c;导致奥特曼不得不重新调整生活和时间安排以确保足够资金。OpenAI是…

MPU6050使用心得(简单分享一下)

前言 选用MPU6050做 倾斜检测 功能。 前期准备 开发板&#xff1a;正点原子STM32F103 精英版&#xff08;STM32F103ZET6&#xff09; 模块&#xff1a;GY-521 MPU6050 其他&#xff1a;杜邦线若干、烧录线、FlyMcu、Keil5、正点原子开发板配套的套件&#xff08;TFTLCD&…

智慧农场云养猪平台原来是这样的!

随着数字化和智能化的发展&#xff0c;农业行业也逐渐开始融入互联网技术&#xff0c;其中云养猪平台作为新兴的农业数字化解决方案之一&#xff0c;备受关注。本文将探讨如何开发一款具备专业、思考深度和逻辑性的云养猪平台。 一、前期准备阶段&#xff1a; 1.明确目…

通达信指标公式12:关于股票筹码集中度的分析弊端

筹码的集中度&#xff1a;指的是个股的流通筹码被庄家控制的程度&#xff0c;用来观察一支股票是否有大资金吸筹。如果某只股票流通筹码的30%被庄家所控制&#xff0c;就说明这只股票被轻度控盘了。而当大于50%以上的多数流通筹码被控制的时候&#xff0c;就是高度控盘了。利用…

Python实现SSA智能麻雀搜索算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…

38岁啦:说点什么好呢?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 1985年的8月21日&#xff0c;农历七月初六。正好今天也是2023年8月21日&#xff0c;农历七月初六。该说点什么好呢? 1985年&#xff0c;我就出生在这里&#xff0c;箭头所指的方向就是我出生的地…

Idea 设置实体类里面的serialVersionUID

private static final long serialVersionUID 8728382276986043874L;选中serialVersionUID &#xff0c;然后使用Altenter&#xff0c;选择随机更改serialVersionUID 的初始值

温故知新之:接口和抽象类有什么区别?

本文以下内容基于 JDK 8 版本。 1、接口介绍 接口是 Java 语言中的一个抽象类型&#xff0c;用于定义对象的公共行为。它的创建关键字是 interface&#xff0c;在接口的实现中可以定义方法和常量&#xff0c;其普通方法是不能有具体的代码实现的&#xff0c;而在 JDK 8 之后&…

南京医科大学采购ZJ-3精密压电测试仪和PZT-JH30/3型复合压电极化装置

南京医科大学采购ZJ-3精密压电测试仪和PZT-JH30/3型复合压电极化装置 南京医科大学&#xff08;Nanjing Medical University&#xff09;&#xff0c;位于江苏省南京市&#xff0c;是教育部、中华人民共和国国家卫生健康委员会、江苏省人民政府共建高校和江苏高水平大学建设高校…

长胜证券:怎么看k线图?

K线图是股票、期货、外汇等金融商场中常用的一种图表方式&#xff0c;用来展示必定时刻内的价格走势。关于投资者来说&#xff0c;学会怎么正确地剖析K线图是非常重要的。本文将从多个视点来剖析怎么看K线图&#xff0c;协助投资者更好地把握商场走势和做出正确的买卖决议计划。…