vue实现展开与收起
Vue实现展开与收起功能
基础实现:使用v-show或v-if
通过Vue的指令v-show或v-if控制元素的显示与隐藏,配合按钮切换状态。

<template>
<div>
<button @click="toggle">{{ isExpanded ? '收起' : '展开' }}</button>
<div v-show="isExpanded">这里是需要展开/收起的内容</div>
</div>
</template>
<script>
export default {
data() {
return {
isExpanded: false
};
},
methods: {
toggle() {
this.isExpanded = !this.isExpanded;
}
}
};
</script>
动态高度过渡效果
结合CSS过渡实现平滑的展开/收起动画,适用于高度不确定的内容。

<template>
<div>
<button @click="toggle">{{ isExpanded ? '收起' : '展开' }}</button>
<div
class="expandable"
:style="{ maxHeight: isExpanded ? maxHeight + 'px' : '0' }"
>
这里是需要展开/收起的内容
</div>
</div>
</template>
<script>
export default {
data() {
return {
isExpanded: false,
maxHeight: 0
};
},
mounted() {
this.maxHeight = this.$refs.content.scrollHeight;
},
methods: {
toggle() {
this.isExpanded = !this.isExpanded;
}
}
};
</script>
<style>
.expandable {
overflow: hidden;
transition: max-height 0.3s ease;
}
</style>
使用第三方库(如Vue Transition)
利用Vue的<transition>组件实现更复杂的动画效果。
<template>
<div>
<button @click="toggle">{{ isExpanded ? '收起' : '展开' }}</button>
<transition name="slide">
<div v-show="isExpanded" class="content">这里是需要展开/收起的内容</div>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
isExpanded: false
};
},
methods: {
toggle() {
this.isExpanded = !this.isExpanded;
}
}
};
</script>
<style>
.slide-enter-active, .slide-leave-active {
transition: max-height 0.5s ease;
max-height: 500px;
}
.slide-enter, .slide-leave-to {
max-height: 0;
}
.content {
overflow: hidden;
}
</style>
多级展开与收起
适用于嵌套内容的展开/收起场景,通过递归组件或动态渲染实现。
<template>
<div>
<div v-for="(item, index) in items" :key="index">
<button @click="toggle(index)">{{ item.expanded ? '收起' : '展开' }}</button>
<div v-show="item.expanded">{{ item.content }}</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ content: '内容1', expanded: false },
{ content: '内容2', expanded: false }
]
};
},
methods: {
toggle(index) {
this.items[index].expanded = !this.items[index].expanded;
}
}
};
</script>
性能优化
对于大量内容的展开/收起,使用v-show替代v-if可以减少DOM操作的开销。同时,避免在频繁切换的组件中使用复杂的计算属性或侦听器。






