Vue 手风琴组件三种实现方式的使用步骤与封装技巧详解

下面为你详细介绍这三种实现方式的使用方法和组件封装方法:

一、原生Vue实现方式

使用方法

  1. 创建组件文件 :将完整示例代码保存为Accordion.vue文件
  2. 在父组件中引入
javascript 复制代码
<template>
  <div>
    <Accordion />
  </div>
</template>

<script>
import Accordion from './components/Accordion.vue'

export default {
  components: {
    Accordion
  }
}
</script>
  1. 自定义内容 :修改items数组中的数据即可展示不同内容

组件封装方法

  1. 提取可配置参数
javascript 复制代码
<template>
  <div class="accordion">
    <div class="accordion-item" v-for="(item, index) in items" :key="item.id || index">
      <div class="accordion-header" @click="toggleAccordion(index)">
        {{ item.title }}
        <i :class="isActive(index) ? 'fa fa-chevron-down' : 'fa fa-chevron-right'" />
      </div>
      <div class="accordion-content" :style="{ maxHeight: isActive(index) ? contentHeight + 'px' : '0' }">
        <slot :item="item" :index="index">{{ item.content }}</slot>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'CustomAccordion',
  props: {
    items: {
      type: Array,
      default: () => []
    },
    multiple: {
      type: Boolean,
      default: false
    },
    contentHeight: {
      type: Number,
      default: 300
    }
  },
  data() {
    return {
      activeIndexes: []
    }
  },
  methods: {
    toggleAccordion(index) {
      if (this.multiple) {
        const isActive = this.activeIndexes.includes(index)
        this.activeIndexes = isActive
          ? this.activeIndexes.filter(i => i !== index)
          : [...this.activeIndexes, index]
      } else {
        this.activeIndexes = this.activeIndexes[0] === index ? [] : [index]
      }
    },
    isActive(index) {
      return this.activeIndexes.includes(index)
    }
  }
}
</script>

二、Element-UI组件使用方法

使用方法

  1. 全局引入Element-UI(参考上文安装步骤)
  2. 在模板中直接使用
javascript 复制代码
<template>
  <el-collapse v-model="activeNames" accordion>
    <el-collapse-item name="1">
      <template #title>
        <span>标题1</span>
        <i class="el-icon-info"></i>
      </template>
      <div>内容1</div>
    </el-collapse-item>
    <el-collapse-item name="2">
      <template #title>标题2</template>
      <div>内容2</div>
    </el-collapse-item>
  </el-collapse>
</template>

<script>
export default {
  data() {
    return {
      activeNames: ['1']
    }
  }
}
</script>

组件封装方法

  1. 创建封装组件ElementAccordion.vue
javascript 复制代码
<template>
  <el-collapse :accordion="!multiple" v-model="activeNames">
    <el-collapse-item 
      v-for="item in items" 
      :key="item.name" 
      :name="item.name"
    >
      <template #title>
        {{ item.title }}
        <span v-if="item.badge" class="el-badge__content is-fixed is-dot"></span>
      </template>
      <div>{{ item.content }}</div>
    </el-collapse-item>
  </el-collapse>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      required: true
    },
    multiple: {
      type: Boolean,
      default: false
    },
    activeNames: {
      type: Array,
      default: () => []
    }
  }
}
</script>

三、自定义指令实现方式

使用方法

  1. 注册全局指令 (在main.js中)
javascript 复制代码
import Vue from 'vue'

Vue.directive('accordion', {
  inserted(el, binding) {
    // 指令逻辑...
  }
})
  1. 在模板中使用
javascript 复制代码
<template>
  <div v-accordion class="custom-accordion">
    <div class="accordion-item" v-for="item in faqList" :key="item.id">
      <div class="accordion-header">{{ item.question }}</div>
      <div class="accordion-content">{{ item.answer }}</div>
    </div>
  </div>
</template>

组件封装方法

  1. 创建指令组件DirectiveAccordion.vue
javascript 复制代码
<template>
  <div v-accordion class="directive-accordion">
    <div class="accordion-item" v-for="item in items" :key="item.id">
      <div class="accordion-header">
        {{ item.title }}
        <i class="fa fa-plus-circle" />
      </div>
      <div class="accordion-content">
        <slot :item="item">{{ item.content }}</slot>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      default: () => []
    }
  }
}
</script>

<style scoped>
.directive-accordion {
  border-radius: 4px;
  overflow: hidden;
}

.accordion-header {
  padding: 12px 16px;
  background-color: #f5f7fa;
  cursor: pointer;
  transition: background-color 0.2s;
}

.accordion-header:hover {
  background-color: #e4e7ed;
}

.accordion-content {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease-out;
  background-color: #fff;
  padding: 0 16px;
  border-top: 1px solid #ebeef5;
}
</style>

封装注意事项

  1. 可配置性:通过props传递数据和配置项
  2. 事件监听:添加事件回调函数(如展开/折叠时触发)
  3. 样式定制:使用scoped样式或CSS变量
  4. 内容插槽 :使用<slot>允许自定义内容
  5. 无障碍支持:添加aria属性提升可访问性

性能优化建议

  1. 虚拟滚动 :对于大量数据使用vue-virtual-scroller
  2. 动画优化 :使用requestAnimationFrame代替CSS过渡
  3. 状态管理:复杂场景下使用Vuex管理展开状态
  4. 懒加载内容:对折叠内容使用异步加载

根据你的具体需求,可以选择最适合的实现方式进行组件封装。需要进一步的代码优化或有特定场景需求,可以告诉我具体情况。


Vue, 手风琴组件,实现方式,使用步骤,封装技巧,组件封装,前端开发,JavaScript,Vue 组件开发,前端组件,动态效果,响应式设计,Web 开发,前端框架,用户界面设计



资源地址: pan.quark.cn/s/d27d30399...


相关推荐
溪语流沙4 分钟前
【每天一个CSS | Day19】流光文字与一笔写成的手写签名
前端·javascript·css
逐光者93310 分钟前
STM32——SPI 屏 · Flash · 高速
java·前端·stm32
To_OC18 分钟前
同样是让 AI 写全栈,为什么别人一句话就够了
前端·前端框架·next.js
CDwenhuohuo31 分钟前
electron pc项目打包成桌面端
前端·javascript·electron
前端大斗师34 分钟前
「大于 1000」把 1000 元那单也算进去了:我在 Vue3 订单页对了 10 句话
前端·人工智能·typescript·大模型·原力计划
Jmyd01231 小时前
用 Web VR 引擎搭建 3D 虚拟展厅:从素材上云到多端实时渲染的完整数据链路
前端·3d·vr·三维数字化
刘天远2 小时前
Agent成本核算实现:事件表、状态分布与Python归集
前端·数据库·人工智能·python
欣欣之王来了2 小时前
开发环境准备:Node.js、npm、VS Code安装配置
前端·学习·架构·项目·vue3教程
xiaolinudao1232 小时前
将多个 Excel 表格中的数据合并到单个表中|6 种实现方案全解析
java·前端·excel
LRL_3 小时前
跨平台 Node 模块安装指南:如何利用 pnpm/npm 配置`supportedArchitectures` 锁定平台依赖
前端·npm·node.js