当前位置:首页 > VUE

vue实现伸缩列表

2026-02-18 12:02:47VUE

实现伸缩列表的基本思路

在Vue中实现伸缩列表可以通过控制数据的展开与收起来完成。通常使用v-for指令渲染列表项,结合v-show或v-if控制子项的显示隐藏。

使用v-show控制显示

通过v-show可以简单地切换元素的显示状态,适合频繁切换的场景。定义一个布尔值来控制子项的展开与收起。

vue实现伸缩列表

<template>
  <div>
    <div v-for="item in list" :key="item.id">
      <div @click="toggleExpand(item.id)">
        {{ item.title }}
      </div>
      <div v-show="expandedItems.includes(item.id)">
        {{ item.content }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, title: 'Item 1', content: 'Content 1' },
        { id: 2, title: 'Item 2', content: 'Content 2' }
      ],
      expandedItems: []
    }
  },
  methods: {
    toggleExpand(id) {
      if (this.expandedItems.includes(id)) {
        this.expandedItems = this.expandedItems.filter(item => item !== id);
      } else {
        this.expandedItems.push(id);
      }
    }
  }
}
</script>

使用v-if控制渲染

v-if会完全销毁或重建元素,适合不频繁切换的场景。性能开销比v-show大,但初始渲染更快。

<template>
  <div>
    <div v-for="item in list" :key="item.id">
      <div @click="item.expanded = !item.expanded">
        {{ item.title }}
      </div>
      <div v-if="item.expanded">
        {{ item.content }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, title: 'Item 1', content: 'Content 1', expanded: false },
        { id: 2, title: 'Item 2', content: 'Content 2', expanded: false }
      ]
    }
  }
}
</script>

使用动态组件

对于复杂的子项内容,可以使用动态组件来切换不同的子组件,提供更灵活的控制。

vue实现伸缩列表

<template>
  <div>
    <div v-for="item in list" :key="item.id">
      <div @click="toggleComponent(item.id)">
        {{ item.title }}
      </div>
      <component :is="currentComponent[item.id]" v-if="expandedItems.includes(item.id)" />
    </div>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      list: [
        { id: 1, title: 'Item 1' },
        { id: 2, title: 'Item 2' }
      ],
      expandedItems: [],
      currentComponent: {
        1: 'ChildComponent',
        2: 'ChildComponent'
      }
    }
  },
  methods: {
    toggleComponent(id) {
      if (this.expandedItems.includes(id)) {
        this.expandedItems = this.expandedItems.filter(item => item !== id);
      } else {
        this.expandedItems.push(id);
      }
    }
  }
}
</script>

添加动画效果

通过Vue的transition组件可以为伸缩列表添加平滑的动画效果,提升用户体验。

<template>
  <div>
    <div v-for="item in list" :key="item.id">
      <div @click="item.expanded = !item.expanded">
        {{ item.title }}
      </div>
      <transition name="fade">
        <div v-if="item.expanded">
          {{ item.content }}
        </div>
      </transition>
    </div>
  </div>
</template>

<style>
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

使用第三方库

对于更复杂的需求,可以考虑使用第三方库如vue-accordion或手动实现类似功能。

<template>
  <div>
    <vue-accordion>
      <vue-accordion-item v-for="item in list" :key="item.id">
        <template v-slot:title>
          {{ item.title }}
        </template>
        <template v-slot:content>
          {{ item.content }}
        </template>
      </vue-accordion-item>
    </vue-accordion>
  </div>
</template>

<script>
import { VueAccordion, VueAccordionItem } from 'vue-accordion';

export default {
  components: {
    VueAccordion,
    VueAccordionItem
  },
  data() {
    return {
      list: [
        { id: 1, title: 'Item 1', content: 'Content 1' },
        { id: 2, title: 'Item 2', content: 'Content 2' }
      ]
    }
  }
}
</script>

通过以上方法,可以灵活地在Vue中实现伸缩列表功能,根据需求选择适合的方案。

标签: 伸缩列表
分享给朋友:

相关文章

uniapp商品列表

uniapp商品列表

商品列表实现方法 在uniapp中实现商品列表功能,可以通过多种方式完成,以下是几种常见的方法: 使用scroll-view组件实现滚动列表 <scroll-view scroll-y="t…

h5 实现列表

h5 实现列表

列表实现方法 在HTML5中,可以通过多种方式实现列表,包括无序列表、有序列表和自定义列表。以下是具体的实现方法。 无序列表 无序列表使用<ul>标签,列表项使用<li>标签…

vue实现虚拟列表

vue实现虚拟列表

虚拟列表的概念 虚拟列表(Virtual List)是一种优化长列表渲染性能的技术,通过仅渲染可视区域内的元素,减少DOM节点数量,从而提升页面性能。适用于数据量大的场景(如表格、下拉选择器等)。…

vue实现卡片列表

vue实现卡片列表

Vue 实现卡片列表 使用 v-for 动态渲染卡片列表 通过 Vue 的 v-for 指令可以动态渲染卡片列表,数据通常存储在组件的 data 或通过 API 获取。 <template&g…

vue视频列表实现

vue视频列表实现

Vue 视频列表实现 数据准备 定义一个数组存储视频信息,每个视频对象包含标题、封面图、播放地址等属性。 data() { return { videos: [ {…

vue实现多级列表

vue实现多级列表

实现多级列表的两种常见方法 递归组件法 通过组件递归调用自身实现嵌套渲染,适合动态层级数据。 定义组件时通过name属性使其可递归调用。 模板中使用v-for遍历数据,嵌套部分通过条件渲染递…