当前位置:首页 > 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)

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

<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-virtual-scroller)避免渲染所有元素:

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

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

常见问题解决方案

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

vue实现列表展开收缩

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

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

相关文章

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue实现效果

vue实现效果

以下是Vue实现常见效果的几种典型方法,分为不同场景说明: 数据绑定与响应式更新 使用v-model实现表单双向绑定: <template> <input v-model="…

vue实现setinterval

vue实现setinterval

在 Vue 中使用 setInterval Vue 中可以通过生命周期钩子和方法结合 setInterval 实现定时任务。以下是一个完整的实现示例: <template> <…

vue能实现

vue能实现

Vue.js 是一个流行的前端框架,能够实现多种功能。以下是 Vue 能够实现的主要功能和特性: 响应式数据绑定 Vue 的核心特性之一是响应式数据绑定。通过数据驱动视图,当数据发生变化时,视图会自…

vue实现vnc

vue实现vnc

Vue 实现 VNC 客户端 在 Vue 项目中实现 VNC 客户端功能,可以通过集成现有的 VNC 客户端库或组件完成。以下是具体实现方法: 安装依赖库 使用 noVNC 或其他 VNC 客户端…

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…