【前端9】手风琴v1.0版本:使用插槽实现动态内容插入的Vue组件

news2024/12/26 23:51:54

【前端9】手风琴:使用插槽实现动态内容插入的Vue组件

  • 写在最前面
  • 一、插槽的基本概念
    • 1.默认插槽
    • 2.具名插槽
  • 二、实现一个折叠面板组件
    • 0.关键点和注意事项
    • 1.父组件 `App.vue`
    • 2.子组件 `Collapse.vue`
      • 总结
    • 3.详细解读(可以略过)
      • 父组件
      • 子组件
  • 三、小结


请添加图片描述

🌈你好呀!我是 是Yu欸
🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

写在最前面

在开发Vue.js应用时,插槽(slot)是一个非常强大的工具,它允许我们在组件中插入动态内容。插槽提供了一种灵活的方式来组合组件,使组件变得更加可复用和模块化。

在这篇博客中,我们将介绍插槽的基本概念,并展示如何通过插槽实现一个折叠面板组件。

在这里插入图片描述

一、插槽的基本概念

插槽是Vue.js提供的一种机制,用于在组件内部定义占位符,并在使用组件时插入自定义内容。插槽主要有两种类型:

  1. 默认插槽:这是最简单的插槽形式,用于插入默认内容。
  2. 具名插槽:允许在组件中定义多个插槽,每个插槽都有一个独特的名字。

1.默认插槽

默认插槽是在组件模板中不指定名称的插槽。在使用组件时,可以将内容直接插入到默认插槽中。

<!-- ParentComponent.vue -->
<template>
  <ChildComponent>
    <p>This is some default content</p>
  </ChildComponent>
</template>

<!-- ChildComponent.vue -->
<template>
  <div>
    <slot></slot>
  </div>
</template>

2.具名插槽

具名插槽允许在组件中定义多个插槽,并在使用组件时通过插槽名称来插入内容。

<!-- ParentComponent.vue -->
<template>
  <ChildComponent>
    <template v-slot:header>
      <h1>Header Content</h1>
    </template>
    <template v-slot:footer>
      <p>Footer Content</p>
    </template>
  </ChildComponent>
</template>

<!-- ChildComponent.vue -->
<template>
  <div>
    <header>
      <slot name="header"></slot>
    </header>
    <footer>
      <slot name="footer"></slot>
    </footer>
  </div>
</template>

二、实现一个折叠面板组件

接下来,我们将通过插槽实现一个折叠面板组件,这个组件允许用户动态插入标题和内容。我们会将代码拆分为父组件和子组件,以便更好地展示插槽的使用。

在这里插入图片描述

0.关键点和注意事项

  1. 使用插槽传递动态内容:在父组件中通过 v-slot 指令插入动态内容,这使得子组件可以在不修改其内部结构的情况下展示不同的内容。
  2. 具名插槽:在子组件中使用具名插槽(如 headercontent),以便在不同的位置插入不同的内容。
  3. 作用域插槽:在使用插槽时,通过 v-slot 指令传递参数,使得插槽内部的内容可以访问和使用子组件中的数据和方法。

1.父组件 App.vue

父组件将包含折叠面板组件,并使用插槽插入自定义内容。

<!-- 父组件把items的data传值给子组件 -->
<eiCollapse :items="items">
  <!-- 子组件传值,父组件解构出来 -->
  <template v-slot:header="{ item }">
  • eiCollapse 组件中,传递一个 items 属性。
  • 使用具名插槽 header 来定义每个 item 的标题显示方式。
  • 在插槽模板中,通过 item.title 来显示每个 item 的标题。

这样可以使 eiCollapse 组件更加灵活,允许父组件自定义每个 item 的标题显示内容。

<template>
  <div id="app">
    <eiCollapse :items="items">
      <template v-slot:header="{ item }">
        {{ item.title }}
      </template>
      <template v-slot:content="{ item }">
        <div v-for="content in item.contents" :key="content">{{ content }}</div>
      </template>
    </eiCollapse>
  </div>
</template>

<script>
import eiCollapse from './components/eiCollapse.vue';

export default {
  components: {
    eiCollapse
  },
  data() {
    return {
      items: [
        {
          title: "一致性 Consistency",
          name: "1",
          contents: [
            "与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;",
            "在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。"
          ]
        },
        {
          title: "反馈 Feedback",
          name: "2",
          contents: [
            "控制反馈:通过界面样式和交互动效让用户可以清晰的感知自己的操作;",
            "页面反馈:操作后,通过页面元素的变化清晰地展现当前状态。"
          ]
        },
        {
          title: "效率 Efficiency",
          name: "3",
          contents: [
            "简化流程:设计简洁直观的操作流程;",
            "清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策;",
            "帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。"
          ]
        },
        {
          title: "可控 Controllability",
          name: "4",
          contents: [
            "用户决策:根据场景可给予用户操作建议或安全提示,但不能代替用户进行决策;",
            "结果可控:用户可以自由的进行操作,包括撤销、回退和终止当前操作等。"
          ]
        }
      ]
    };
  }
};
</script>

2.子组件 Collapse.vue

子组件定义了折叠面板的结构,并使用插槽来插入标题和内容。

每个折叠项包括一个标题和内容部分。通过具名插槽 headercontent,父组件可以自定义每个折叠项的标题和内容。点击标题时,会调用 toggle 方法切换折叠项的显示状态。

其中,JavaScript 表达式:

this.activeName = this.activeName === name ? '' : name;

用于在 Vue 组件中切换 [activeName]的值。具体来说,它实现了折叠面板的展开和收起功能。

  1. this.activeName

    • this 指向当前 Vue 组件实例。
    • activeName 是组件实例中的一个数据属性,用于存储当前激活(展开)的折叠项的名称。
  2. 三元运算符 ? :

    • 这是一个条件(三元)运算符,语法为 condition ? expr1 : expr2
    • 如果 condition 为真,返回 expr1;否则返回 expr2
  3. 条件判断 this.activeName === name

    • 判断当前激活的折叠项名称是否等于传入的 name
    • 如果相等,表示当前折叠项已经是展开状态。
  4. 结果赋值

    • 如果 this.activeName === name 为真,表示当前折叠项已经展开,此时将 activeName 设为空字符串 '',即收起折叠项。
    • 如果 this.activeName !== name 为假,表示当前折叠项未展开,此时将 activeName 设为 name,即展开折叠项。

总结

这行代码的作用是切换折叠项的展开和收起状态。如果当前折叠项已经展开,则收起它;如果当前折叠项未展开,则展开它。通过这种方式,可以实现折叠面板的交互效果。

<template>
  <div>
    <div class="collapse" v-for="item in items" :key="item.name">
      <div class="collapse-header" @click="toggle(item.name)">
        <slot name="header" :item="item" :toggle="toggle"></slot>
      </div>
      <div v-show="activeName === item.name" class="collapse-content">
        <slot name="content" :item="item"></slot>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      required: true
    }
  },
  data() {
    return {
      activeName: ''
    };
  },
  methods: {
    toggle(name) {
      console.log(name);
      this.activeName = this.activeName === name ? '' : name;
    }
  }
};
</script>

<style>
.collapse {
  border: 1px solid #dcdfe6;
  margin-bottom: 10px;
  border-radius: 4px;
}

.collapse-header {
  background-color: #f5f7fa;
  padding: 10px 16px;
  font-weight: 500;
  cursor: pointer;
}

.collapse-content {
  padding: 10px 16px;
  border-top: 1px solid #dcdfe6;
}
</style>

3.详细解读(可以略过)

父组件

  1. eiCollapse 组件

    • 这是一个自定义组件,名称为 eiCollapse
    • 通过 :items="items" 绑定了一个名为 items 的属性,items 是父组件中的一个数据属性。
  2. 具名插槽 header

    • 使用了 Vue 的 v-slot 指令来定义一个具名插槽 header
    • 插槽的内容是一个 <template> 元素,表示插槽的内容模板。
  3. 插槽作用域

    • { item } 是插槽的作用域对象,表示 eiCollapse 组件会传递一个 item 对象到插槽中。
    • 在插槽模板中,可以使用 item 对象的属性。
  4. 插槽内容

    • {{ item.title }} 是插槽内容,使用了 Vue 的插值语法来显示 item 对象的 title 属性。

子组件

  1. v-for 指令

    • v-for="item in items" 表示循环遍历 items 数组,为每个 item 渲染一个 div 元素。
    • :key="item.name" 为每个 div 元素设置唯一的 key,以便 Vue 能够高效地更新渲染。
  2. 折叠标题部分

    • <div class="collapse-header" @click="toggle(item.name)"> 定义了折叠项的标题部分。
    • @click="toggle(item.name)" 表示点击标题时调用 toggle 方法,并传递 item.name 作为参数。
  3. 具名插槽 header

    • <slot name="header" :item="item" :toggle="toggle"></slot> 定义了一个具名插槽 header
    • 插槽传递了两个属性:itemtoggle,父组件可以通过这些属性自定义插槽内容。
  4. 折叠内容部分

    • <div v-show="activeName === item.name" class="collapse-content"> 定义了折叠项的内容部分。
    • v-show="activeName === item.name" 控制内容的显示和隐藏,只有当 activeName 等于 item.name 时,内容才会显示。
  5. 具名插槽 content

    • <slot name="content" :item="item"></slot> 定义了一个具名插槽 content
    • 插槽传递了 item 属性,父组件可以通过这个属性自定义插槽内容。

三、小结

通过插槽,我们可以实现灵活和可复用的Vue组件。插槽不仅允许我们在组件中插入动态内容,还使得组件间的通信变得更加简洁和高效。

希望通过这篇博客,您对插槽有了更深入的理解,并能够在实际项目中灵活运用。


hello,我是 是Yu欸 。如果你喜欢我的文章,欢迎三连给我鼓励和支持:👍点赞 📁 关注 💬评论,我会给大家带来更多有用有趣的文章。
原文链接 👉 ,⚡️更新更及时。

欢迎大家添加好友交流。

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

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

相关文章

通用后台管理系统实战演示(Vue3 + element-plus)汇总篇三

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Python任务编排和工作流管理库之prefect使用详解

概要 在数据工程和科学的世界中,任务编排和工作流管理变得越来越重要。随着数据处理任务的复杂性增加,开发人员需要一种可靠且易于使用的工具来设计、监控和管理这些任务。Prefect 是一个用于构建、监控和管理数据管道的 Python 库,它简化了工作流的创建和执行,同时提供了…

028、架构_高可用_主从原理

MySQL半同步复制概览 MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。主从复制的基本过程如下图所示: 主从复制的完成通过以下三个进程实现的主库 binary log dump 线程:当从库连接主库时,…

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes1. [官网](https://kubernetes.io/zh-cn/)--------------------------------------------------------------------------------------------------------一. 章节简介 二. DevOps 1. 简介 2. CICD

【科研新手必备】如何高效、高质量、科学的科研?

文献下载网站—英文写作小工具—SCI选刊 1、文献下载网站 中国知网 sci-hub 大木虫学术导航 学术资源搜索 2、英文写作小工具 DeepL 学术短语库 SCI写作辅导材料 赛特新思 3、SCI选刊 Journal Finder SPRINGER NATURE

除了黑神话,探索3A游戏大作:不可错过的经典与录屏软件推荐

在游戏的天地里&#xff0c;3A 大作凭借其美轮美奂的画面、丰富多彩的内容以及意蕴深邃的剧情&#xff0c;俘获了无数玩家的倾心。除了广受瞩目的《黑神话&#xff1a;悟空》&#xff0c;还有诸多其他的 3A 游戏大作值得您去尝试。此类游戏不但在视觉与技术方面臻至行业的巅峰水…

Linux中如何查看一个进程?如何杀死一个进程?如何查看某个端口有没有被占用?

在Linux中 如何查看一个进程&#xff1f; 使用 ps 命令 ps aux这会显示所有正在运行的进程&#xff0c;可以使用 grep 来过滤特定的进程 ps aux | grep process_name使用 top 命令 top这个命令会实时的显示系统重正在运行的进程 如何杀死一个进程&#xff1f; 使用 kill …

C++ | 泛型编程:模板初阶与函数模板深度解析

文章目录 C 泛型编程&#xff1a;模板初阶与函数模板深度解析1. 泛型编程&#xff1a;实现代码的通用性2. 函数模板&#xff1a;代码的模具2.1 什么是函数模板&#xff1f;2.2 函数模板的格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板&#xff…

【maven】阿里云和apache仓库配置

阿里云公共仓库的配置看起来有多种类型的仓库: 配置指南 我的maven是idea 自带的:D:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\plugins\maven\lib\maven3\</

校园跑腿系统小程序开发需求分析

校园跑腿系统小程序的开发需求分析是一个综合性的过程&#xff0c;旨在确保系统能够满足校园内用户的实际需求&#xff0c;并具备良好的用户体验。以下是对校园跑腿系统小程序开发需求分析的详细阐述&#xff1a; 一、功能需求分析 注册与登录&#xff1a;支持多种注册方式&am…

WebSphereMQ中间件监控指标解读

监控易是一款功能全面的IT监控系统&#xff0c;能够实时监控各种IT设施的性能和状态&#xff0c;帮助企业及时发现并解决潜在问题。在本次解读中&#xff0c;我们将聚焦于WebSphereMQ&#xff08;现更名为IBM MQ&#xff09;中间件的监控指标&#xff0c;深入剖析其含义和作用。…

[Linux] 权限

标题&#xff1a;[Linux] 权限 水墨不写bug 目录 一、Linux下对用户的分类 二、Linux的文件访问者的分类 三、修改文件的属性 1.修改文件的权限 &#xff08;只有拥有者和root可以修改某一个文件的权限&#xff09; 2.修改文件的拥有者 3.修改文件的所属组 四、文件创建…

Pytorch中不同的Norm归一化详细讲解

在做项目或者看论文时&#xff0c;总是能看到Norm这个关键的Layer&#xff0c;但是不同的Norm Layer具有不同的作用&#xff0c;准备好接招了吗&#xff1f;&#xff08;本文结论全部根据pytorch官方文档得出&#xff0c;请放心食用&#xff09; 一. LayerNorm LayerNorm的公…

统计学第5天

要观察性别和在线上买不买生鲜食品有没有关系&#xff0c;在现实生活中&#xff0c;女性通常去菜市场买菜的比较多&#xff0c;那么在线下是不是也是这样呢&#xff1f; 卡方统计量 如果研究的是两个类别变量&#xff0c;每个变量有多个类别&#xff0c;通常将两个变量多个类别…

ant design vue+vue3+ts+xlsx实现表格导出问excel文件(带自定义表头)~

1、首先默认你已安装ant design vue、xlsx 库、及file-saver。 2、导入&#xff1a; import * as XLSX from xlsx; import { saveAs } from file-saver; 注&#xff1a;这里的xlsx导入不能这么写&#xff0c;否则会报错&#xff0c;原因是版本不一致&#xff0c;语法向上兼容…

【多线程】线程间通信 之虚假唤醒和中断

两个线程&#xff0c;可以操作初始值为0的一个变量&#xff0c;实现一个线程对该变量1&#xff0c;一个线程对该变量-1&#xff0c;实现交替&#xff0c;来10轮&#xff0c;变量初始值为0&#xff0c;以实现此问题作为引入&#xff0c;简化我们的理解 文章目录 一、两个线程syn…

EasyExcel实现复杂Excel的导入

最近项目中遇到一个复杂的Excel的导入&#xff0c;并且数据量较大。因为数据不规则&#xff0c;所以只能使用POI进行自定义读取&#xff0c;但是发现数据量大之后&#xff0c;读取数据非常耗时。后面换成EasyExcel&#xff0c;性能起飞。 1. Excel样板 如上图&#xff0c;需要…

leetcode 12. 整数转罗马数字

解题思路 1.首先&#xff0c;将值与对应字符用字典来表示&#xff0c;然后将符号对应的值按有序顺序存储至列表中sums 2.将要转换的整数转换成列表形式&#xff0c;遍历列表&#xff0c;每次遍历&#xff1a; 将值取出来算出对应所在位置的实际值 如 32 对应列表 [3,2] 则 3实…

【二叉搜索树】K型与KV型二叉搜索树简单实现

关于我&#xff1a; 睡觉待开机&#xff1a;个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想&#xff0c;就是为了理想的生活! 作者留言 PDF版免费提供&#xff1a;倘若有需要&#xff0c;想拿我写的博客进行学习和交流&#xff0c;可以私信我将免费提供PDF版。…

中国电子学会Python3级等级考试202403客观题解析1

一、单项选择题 1、在 Python 中&#xff0c;hex(2023)的功能是&#xff1f;&#xff08; &#xff09; A 将十进制数 2023 转化为十六进制数 B 将十进制数 2023 转化为八进制数 C 将十六进制数 2023 转化为十进制数 D 将八进制数 2023 转化为十进制数 答案&#xff1a;A…