下面为你详细介绍这三种实现方式的使用方法和组件封装方法:
Accordion.vue文件<template>
<div>
<Accordion />
</div>
</template>
<script>
import Accordion from './components/Accordion.vue'
export default {
components: {
Accordion
}
}
</script>items数组中的数据即可展示不同内容<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><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**<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中)import Vue from 'vue'
Vue.directive('accordion', {
inserted(el, binding) {
// 指令逻辑...
}
})<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**<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><slot>允许自定义内容vue-virtual-scrollerrequestAnimationFrame代替CSS过渡根据你的具体需求,可以选择最适合的实现方式进行组件封装。需要进一步的代码优化或有特定场景需求,可以告诉我具体情况。
Vue, 手风琴组件,实现方式,使用方法,封装技巧,Vue 组件开发,前端开发,JavaScript,Vue.js, 组件封装,前端组件,热门技术,Web 开发,Vue 实战,前端框架
资源地址:
https://pan.quark.cn/s/d27d3039978f
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。