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


相关推荐
Mintopia5 分钟前
一个月速成 AI 工程师:从代码小白到智能工匠的修炼手册
前端·javascript·aigc
Mintopia8 分钟前
Next.js 全栈:接收和处理请求
前端·javascript·next.js
袁煦丞42 分钟前
2025.8.18实验室【代码跑酷指南】Jupyter Notebook程序员的魔法本:cpolar内网穿透实验室第622个成功挑战
前端·程序员·远程工作
Joker Zxc1 小时前
【前端基础】flex布局中使用`justify-content`后,最后一行的布局问题
前端·css
无奈何杨1 小时前
风控系统事件分析中心,关联关系、排行、时间分布
前端·后端
Moment1 小时前
nginx 如何配置防止慢速攻击 🤔🤔🤔
前端·后端·nginx
晓得迷路了1 小时前
栗子前端技术周刊第 94 期 - React Native 0.81、jQuery 4.0.0 RC1、Bun v1.2.20...
前端·javascript·react.js
江城开朗的豌豆1 小时前
React Native 实战心得
javascript
前端小巷子1 小时前
Vue 自定义指令
前端·vue.js·面试