当前位置:首页 > 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 表格实现方法 使用原生HTML表格 在Vue模板中直接使用HTML的<table>标签,结合v-for动态渲染数据: <template> <table&g…

vue实现3d宇宙

vue实现3d宇宙

Vue实现3D宇宙效果 使用Three.js库 Three.js是一个强大的JavaScript 3D库,可以轻松集成到Vue项目中。安装Three.js依赖: npm install three…

vue 实现pdf

vue 实现pdf

在Vue中实现PDF功能 在Vue项目中实现PDF功能通常涉及PDF生成、预览或下载。以下是几种常见实现方式: 使用vue-pdf库预览PDF 安装依赖: npm install vue-pdf…

vue实现route

vue实现route

Vue 路由实现方法 Vue 中实现路由通常使用 vue-router 库,这是 Vue 官方推荐的路由管理器。以下是具体实现步骤: 安装 vue-router 通过 npm 或 yarn 安装…

vue实现通讯

vue实现通讯

Vue 组件通讯方法 父子组件通讯 父组件向子组件传递数据通过 props,子组件向父组件传递数据通过 $emit 事件。 父组件模板: <child-component :message=…

vue 实现跳转

vue 实现跳转

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式实现,具体选择取决于项目需求和技术栈(如是否使用 Vue Router)。 使用 Vue Router 进行编程式导航…