当前位置:首页 > VUE

vue列表收缩展开实现

2026-02-25 08:33:49VUE

使用 v-show 指令实现展开/收缩

通过 v-show 控制元素的显示与隐藏,适合频繁切换的场景。
在 Vue 模板中绑定布尔值,点击按钮切换状态:

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

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

使用 v-if 指令实现条件渲染

v-if 会完全销毁或重建 DOM 元素,适合不频繁切换的场景:

<template>
  <div>
    <button @click="toggleList">
      {{ showList ? '收起' : '展开' }}
    </button>
    <ul v-if="showList">
      <li v-for="item in items" :key="item">{{ item }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      showList: false,
      items: ['苹果', '香蕉', '橙子']
    }
  },
  methods: {
    toggleList() {
      this.showList = !this.showList
    }
  }
}
</script>

动态高度过渡动画

通过 CSS 过渡实现平滑的展开/收缩效果:

<template>
  <div>
    <button @click="toggle">切换</button>
    <div class="expandable" :style="{ height: expanded ? 'auto' : '0' }">
      <div class="content">
        <p>这里是可展开的内容</p>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      expanded: false
    }
  },
  methods: {
    toggle() {
      this.expanded = !this.expanded
    }
  }
}
</script>

<style>
.expandable {
  overflow: hidden;
  transition: height 0.3s ease;
}
.content {
  padding: 10px;
}
</style>

使用 Vue Transition 组件

利用 Vue 内置的 <transition> 实现更复杂的动画效果:

<template>
  <div>
    <button @click="show = !show">切换</button>
    <transition name="slide">
      <ul v-if="show" class="list">
        <li v-for="n in 5" :key="n">项目 {{ n }}</li>
      </ul>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: false
    }
  }
}
</script>

<style>
.slide-enter-active, .slide-leave-active {
  transition: all 0.5s ease;
}
.slide-enter, .slide-leave-to {
  opacity: 0;
  transform: translateY(-20px);
}
.list {
  margin-top: 10px;
}
</style>

多级嵌套列表展开

处理嵌套列表的展开/收缩功能:

vue列表收缩展开实现

<template>
  <div>
    <ul>
      <li v-for="category in categories" :key="category.id">
        <div @click="toggleCategory(category)">
          {{ category.name }}
          <span>[{{ category.expanded ? '-' : '+' }}]</span>
        </div>
        <ul v-show="category.expanded">
          <li v-for="item in category.items" :key="item">
            {{ item }}
          </li>
        </ul>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      categories: [
        {
          id: 1,
          name: '水果',
          expanded: false,
          items: ['苹果', '香蕉']
        },
        {
          id: 2,
          name: '蔬菜',
          expanded: false,
          items: ['胡萝卜', '西红柿']
        }
      ]
    }
  },
  methods: {
    toggleCategory(category) {
      category.expanded = !category.expanded
    }
  }
}
</script>

以上方法可根据实际需求选择或组合使用,v-show 适合频繁切换,v-if 适合条件渲染,过渡动画可提升用户体验。

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

相关文章

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 meth…

vue实现换行

vue实现换行

Vue 中实现换行的几种方法 在 Vue 中实现换行可以通过多种方式,具体取决于使用场景和需求。以下是常见的几种方法: 使用 HTML 的 <br> 标签 在模板中直接使用 <br…

vue拼图实现

vue拼图实现

实现 Vue 拼图游戏的方法 使用 Vue 组件和动态数据绑定 创建一个 Vue 组件来管理拼图的状态和逻辑。通过 v-for 动态渲染拼图块,利用 v-bind 绑定样式和位置。拼图块的数据可以存储…

vue遮罩实现

vue遮罩实现

实现 Vue 遮罩的常见方法 使用 CSS 定位和透明度 创建一个全屏遮罩层,通过 CSS 固定定位覆盖整个视口,并设置半透明背景色。 <template> <div cl…

vue实现单击

vue实现单击

Vue 实现单击事件的方法 在 Vue 中实现单击事件可以通过 v-on 指令或简写的 @ 符号绑定事件处理器。以下是几种常见的实现方式: 基础用法 通过 v-on:click 或 @click 绑…

vue实现spa

vue实现spa

Vue 实现 SPA(单页应用)的步骤 创建 Vue 项目 使用 Vue CLI 快速初始化一个 Vue 项目,确保安装了 Vue Router 作为路由管理工具。运行以下命令创建项目: vue c…