当前位置: 首页 > news >正文

Vue3实现折叠面板

Vue3 实现一个折叠面板组件

折叠面板(Accordion)是一种常见的 UI 组件,通常用于展示内容列表,用户可以点击标题展开或折叠内容。


一、需求分析

实现一个 Vue3 的折叠面板组件,具备以下功能:

  1. 折叠和展开:点击标题可以展开内容,再次点击可以折叠内容。
  2. 支持多个面板:可以同时展开多个面板。
  3. 支持单个面板展开:可以设置为“手风琴模式”,即每次只能展开一个面板。

二、实现步骤

1. 创建折叠面板组件

src/components 文件夹下创建一个名为 Accordion.vue 的组件。

Accordion.vue
<template><div class="accordion"><divv-for="(item, index) in items":key="index"class="accordion-item"><!-- 标题 --><divclass="accordion-header"@click="togglePanel(index)"><span>{{ item.title }}</span><span>{{ isOpen(index) ? '▲' : '▼' }}</span></div><!-- 内容 --><divv-show="isOpen(index)"class="accordion-content"><p>{{ item.content }}</p></div></div></div>
</template><script>
import { ref } from 'vue';export default {name: 'Accordion',props: {items: {type: Array,required: true,},singleOpen: {type: Boolean,default: false, // 是否为手风琴模式},},setup(props) {// 当前打开的面板索引const openPanels = ref([]);// 切换面板状态const togglePanel = (index) => {if (props.singleOpen) {// 手风琴模式:只允许一个面板打开  openPanels是否包含?包含则清空数组,不包含则加上openPanels.value = openPanels.value.includes(index) ? [] : [index];} else {// 普通模式:允许多个面板同时打开//使用 includes 方法检查索引是否在 openPanels 中,如果在则移除,否则添加。if (openPanels.value.includes(index)) {openPanels.value = openPanels.value.filter((i) => i !== index);} else {openPanels.value.push(index);}}};// 判断面板是否打开const isOpen = (index) => {return openPanels.value.includes(index);};return {togglePanel,isOpen,};},
};
</script><style scoped>
.accordion {border: 1px solid #ccc;border-radius: 5px;overflow: hidden;
}.accordion-item {border-bottom: 1px solid #ddd;
}.accordion-header {display: flex;justify-content: space-between;align-items: center;padding: 10px;background-color: #f5f5f5;cursor: pointer;
}.accordion-header:hover {background-color: #eaeaea;
}.accordion-content {padding: 10px;background-color: #fff;border-top: 1px solid #ddd;
}
</style>

2. 使用组件

src/App.vue 中引入并使用这个组件:

<template><div><h1>Vue3 折叠面板组件</h1><!-- 普通模式:允许多个面板同时打开 --><Accordion :items="accordionItems" /><h2 style="margin-top: 20px;">手风琴模式</h2><!-- 手风琴模式:每次只能打开一个面板 --><Accordion :items="accordionItems" :singleOpen="true" /></div>
</template><script>
import Accordion from './components/Accordion.vue';export default {components: {Accordion,},data() {return {accordionItems: [{ title: '面板 1', content: '这是面板 1 的内容' },{ title: '面板 2', content: '这是面板 2 的内容' },{ title: '面板 3', content: '这是面板 3 的内容' },],};},
};
</script>

三、功能解析

1. 折叠和展开

  • 核心逻辑
    • 使用 openPanels 数组记录当前打开的面板索引。
    • 点击标题时,检查索引是否在 openPanels 中,如果在则移除,否则添加。
  • 手风琴模式
    • 如果 singleOpentrue,每次点击时只允许一个面板打开。

2. 动态内容

  • 支持动态传入数据
    • 使用 props 接收 items 数据,数据格式为数组,每个元素包含 titlecontent

3. 样式和交互

  • 样式
    • 使用 v-show 控制内容的显示和隐藏。
    • 添加鼠标悬停效果,让标题在鼠标经过时有背景变化。
  • 交互
    • 在标题右侧显示箭头图标,指示当前面板的状态(展开或折叠)。

四、效果展示

运行项目后,你会看到两个折叠面板:

  1. 普通模式:允许同时展开多个面板。
  2. 手风琴模式:每次只能展开一个面板。

点击标题可以展开或折叠内容,右侧的箭头会根据状态变化。


五、总结

文章实现了一个简单的 Vue3 折叠面板组件,支持普通模式和手风琴模式。这个组件的核心逻辑非常简单,主要依赖数组操作和条件判断。可以根据自己的需求进一步扩展,比如:

  • 添加动画效果,让展开和折叠更流畅。
  • 支持嵌套面板,实现更复杂的结构。

相关文章:

  • 如何更好的理解云计算和云原生?
  • 自动驾驶与智能交通:构建未来出行的智能引擎
  • 【Linux】网络--传输层--深入理解TCP协议
  • 微服务各个部分的作用
  • 自动驾驶中的路径跟踪:Python实现与技术解析
  • Free2AI:企业智能化转型的加速器
  • C++通用日志模块
  • 【Linux篇】叩响新世界的大门:线程
  • 在VirtualBox中打造高效开发环境:CentOS虚拟机安装与优化指南
  • vue3 导出excel
  • 第一章 Linux的例行性工作(计划任务)
  • vite配置一个css插件
  • 【NATURE氮化镓】GaN超晶格多沟道场效应晶体管的“闩锁效应”
  • R3GAN训练自己的数据集
  • 【深度剖析】义齿定制行业数字化转型模式创新研究(上篇2:痛点和难点分析)
  • 架构设计之慢SQL监控
  • 【Redis】string 类型
  • 第5讲、Odoo 18 CLI 模块源码全解读
  • 大数据学习(124)-spark数据倾斜
  • Java中的设计模式实战:单例、工厂、策略模式的最佳实践
  • 平凉网站设计/哈尔滨优化网站公司
  • 怎么做网站搜索引擎/怎么做公司网页
  • 怎样用网站做淘宝推广/网站关键词怎么添加
  • 微型购物网站建设模板/网络营销公司做什么
  • 做网站需要买ip地址吗/免费线上培训平台
  • 徐州vi设计公司/seo项目是什么