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


相关推荐
仟濹2 小时前
【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】
大数据·前端·爬虫·数据挖掘·数据分析·html
小小小小宇3 小时前
前端WebWorker笔记总结
前端
小小小小宇3 小时前
前端监控用户停留时长
前端
小小小小宇4 小时前
前端性能监控笔记
前端
烛阴4 小时前
Date-fns教程:现代JavaScript日期处理从入门到精通
前端·javascript
全栈小54 小时前
【前端】Vue3+elementui+ts,TypeScript Promise<string>转string错误解析,习惯性请出DeepSeek来解答
前端·elementui·typescript·vue3·同步异步
穗余4 小时前
NodeJS全栈开发面试题讲解——P6安全与鉴权
前端·sql·xss
小蜜蜂嗡嗡5 小时前
flutter项目迁移空安全
javascript·安全·flutter
穗余6 小时前
NodeJS全栈开发面试题讲解——P2Express / Nest 后端开发
前端·node.js
航Hang*6 小时前
WEBSTORM前端 —— 第3章:移动 Web —— 第4节:移动适配-VM
前端·笔记·edge·less·css3·html5·webstorm