下面为你详细介绍这三种实现方式的使用方法和组件封装方法:
一、原生Vue实现方式
使用方法
- 创建组件文件 :将完整示例代码保存为
Accordion.vue
文件 - 在父组件中引入
javascript
<template>
<div>
<Accordion />
</div>
</template>
<script>
import Accordion from './components/Accordion.vue'
export default {
components: {
Accordion
}
}
</script>
- 自定义内容 :修改
items
数组中的数据即可展示不同内容
组件封装方法
- 提取可配置参数
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组件使用方法
使用方法
- 全局引入Element-UI(参考上文安装步骤)
- 在模板中直接使用
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>
组件封装方法
- 创建封装组件
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>
三、自定义指令实现方式
使用方法
- 注册全局指令 (在
main.js
中)
javascript
import Vue from 'vue'
Vue.directive('accordion', {
inserted(el, binding) {
// 指令逻辑...
}
})
- 在模板中使用
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>
组件封装方法
- 创建指令组件
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>
封装注意事项
- 可配置性:通过props传递数据和配置项
- 事件监听:添加事件回调函数(如展开/折叠时触发)
- 样式定制:使用scoped样式或CSS变量
- 内容插槽 :使用
<slot>
允许自定义内容 - 无障碍支持:添加aria属性提升可访问性
性能优化建议
- 虚拟滚动 :对于大量数据使用
vue-virtual-scroller
- 动画优化 :使用
requestAnimationFrame
代替CSS过渡 - 状态管理:复杂场景下使用Vuex管理展开状态
- 懒加载内容:对折叠内容使用异步加载
根据你的具体需求,可以选择最适合的实现方式进行组件封装。需要进一步的代码优化或有特定场景需求,可以告诉我具体情况。
Vue, 手风琴组件,实现方式,使用步骤,封装技巧,组件封装,前端开发,JavaScript,Vue 组件开发,前端组件,动态效果,响应式设计,Web 开发,前端框架,用户界面设计
资源地址: pan.quark.cn/s/d27d30399...