vue实现列表收缩展开
vue实现列表收缩展开的方法
使用v-show控制显示隐藏
通过v-show指令绑定布尔值控制元素的显示与隐藏,适合频繁切换的场景。v-show仅切换CSS的display属性,不会重新渲染DOM。
<template>
<div>
<button @click="toggleList">切换列表</button>
<ul v-show="isShow">
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
isShow: false,
items: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' }
]
}
},
methods: {
toggleList() {
this.isShow = !this.isShow
}
}
}
</script>
使用v-if条件渲染
v-if会根据条件销毁或重建DOM元素,适合不频繁切换的场景。可以结合transition实现动画效果。
<template>
<div>
<button @click="toggleList">切换列表</button>
<transition name="fade">
<ul v-if="isShow">
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</transition>
</div>
</template>
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity .5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
</style>
动态绑定class实现动画
通过动态切换class实现更复杂的展开/收缩动画效果,利用CSS的max-height属性平滑过渡。
<template>
<div>
<button @click="toggleList">切换列表</button>
<ul :class="{ 'collapsed': !isShow }">
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</div>
</template>
<style>
ul {
max-height: 500px;
overflow: hidden;
transition: max-height 0.3s ease-out;
}
ul.collapsed {
max-height: 0;
}
</style>
使用第三方动画库
引入Vue官方推荐的动画库如vue-animate或animate.css,可以快速实现丰富的动画效果。
<template>
<div>
<button @click="toggleList">切换列表</button>
<ul v-show="isShow" class="animate__animated animate__fadeIn">
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</div>
</template>
<script>
import 'animate.css'
export default {
data() {
return {
isShow: false,
items: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' }
]
}
},
methods: {
toggleList() {
this.isShow = !this.isShow
}
}
}
</script>
组件化实现可复用逻辑
将列表展开/收缩功能封装为可复用组件,通过插槽和props实现灵活配置。
<!-- ExpandableList.vue -->
<template>
<div>
<button @click="toggle">{{ buttonText }}</button>
<transition name="slide">
<ul v-show="isExpanded">
<slot></slot>
</ul>
</transition>
</div>
</template>
<script>
export default {
props: {
buttonText: {
type: String,
default: 'Toggle List'
}
},
data() {
return {
isExpanded: false
}
},
methods: {
toggle() {
this.isExpanded = !this.isExpanded
}
}
}
</script>






