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...


相关推荐
崔庆才丨静觅8 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60619 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅9 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅9 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅9 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment10 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅10 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊10 小时前
jwt介绍
前端
爱敲代码的小鱼10 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax