当前位置:首页 > VUE

vue实现列表展开收缩

2026-02-22 03:44:29VUE

Vue 列表展开/收缩实现方法

基础实现(v-show/v-if + 状态控制)

通过v-showv-if控制子元素的显示隐藏,配合点击事件切换状态:

<template>
  <div>
    <button @click="isExpanded = !isExpanded">
      {{ isExpanded ? '收起' : '展开' }}
    </button>
    <div v-show="isExpanded">
      <!-- 列表内容 -->
      <ul>
        <li v-for="item in items" :key="item.id">{{ item.text }}</li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isExpanded: false,
      items: [
        { id: 1, text: '项目1' },
        { id: 2, text: '项目2' }
      ]
    }
  }
}
</script>

动画效果实现(Transition)

添加展开/收缩的动画过渡效果:

vue实现列表展开收缩

<template>
  <div>
    <button @click="toggle">切换</button>
    <transition name="slide">
      <ul v-show="isExpanded">
        <li v-for="item in items" :key="item.id">{{ item.text }}</li>
      </ul>
    </transition>
  </div>
</template>

<style>
.slide-enter-active, .slide-leave-active {
  transition: max-height 0.5s ease;
  max-height: 500px;
  overflow: hidden;
}
.slide-enter, .slide-leave-to {
  max-height: 0;
}
</style>

多级嵌套列表实现

递归组件实现多级展开/收缩:

<template>
  <ul>
    <li v-for="item in treeData" :key="item.id">
      <div @click="toggle(item)">
        {{ item.name }}
        <span v-if="item.children">
          [{{ item.expanded ? '-' : '+' }}]
        </span>
      </div>
      <tree-list
        v-if="item.children && item.expanded"
        :tree-data="item.children"
      />
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeList',
  props: ['treeData'],
  methods: {
    toggle(item) {
      if (item.children) {
        this.$set(item, 'expanded', !item.expanded)
      }
    }
  }
}
</script>

性能优化建议

vue实现列表展开收缩

对于大型列表,使用虚拟滚动技术(如vue-virtual-scroller)避免渲染所有元素:

import { RecycleScroller } from 'vue-virtual-scroller'

export default {
  components: { RecycleScroller },
  // ...其他配置
}

常见问题解决方案

动态内容高度不确定时,使用max-height替代固定高度实现平滑动画。通过计算属性处理异步加载数据后的展开状态:

computed: {
  visibleItems() {
    return this.isExpanded ? this.allItems : this.allItems.slice(0, 3)
  }
}

标签: 列表vue
分享给朋友:

相关文章

vue 实现toast

vue 实现toast

vue 实现 toast 的方法 在 Vue 中实现 Toast 提示功能可以通过多种方式,以下是几种常见的实现方法: 使用第三方库 Vue 生态中有许多成熟的 Toast 库,例如 vue-to…

vue实现拖放

vue实现拖放

Vue 实现拖放功能 Vue 中实现拖放功能通常可以通过 HTML5 的原生拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种方法的详细说明。 使用 HTML5 原生拖放 A…

vue实现过程

vue实现过程

Vue 的实现过程 Vue 的实现过程可以分为多个核心模块,包括响应式系统、虚拟 DOM、模板编译等。以下是 Vue 的主要实现过程分析。 响应式系统 Vue 的响应式系统基于 Object.def…

vue实现级联

vue实现级联

Vue 实现级联选择器的方法 级联选择器(Cascader)是常见的表单组件,用于处理多层级联动数据选择(如省市区选择)。以下是几种实现方式: 基于 Element UI 的 el-cascade…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现异步

vue实现异步

Vue 实现异步操作的常见方法 Vue 提供了多种方式来处理异步操作,包括数据获取、事件处理等场景。 使用 async/await 在 Vue 方法中可以直接使用 async/await 语法处理…