当前位置:首页 > VUE

vue实现展开收起列表

2026-01-22 08:08:28VUE

Vue 实现展开收起列表

使用 v-ifv-show 控制显示

通过 v-ifv-show 动态控制列表项的显示与隐藏。v-if 会销毁和重建 DOM 元素,适合切换频率较低的场景;v-show 通过 CSS 的 display 属性控制,适合频繁切换的场景。

<template>
  <div>
    <button @click="toggleList">展开/收起</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: 'Item 1' },
        { id: 2, name: 'Item 2' },
      ],
    };
  },
  methods: {
    toggleList() {
      this.isExpanded = !this.isExpanded;
    },
  },
};
</script>

使用 CSS 过渡动画

通过 Vue 的 <transition> 组件实现平滑的展开/收起动画效果。

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

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

动态计算高度

对于高度不确定的列表,可以通过 JavaScript 动态计算高度并应用动画。

<template>
  <div>
    <button @click="toggleList">展开/收起</button>
    <div ref="listContainer" :style="{ height: listHeight }">
      <ul>
        <li v-for="item in list" :key="item.id">{{ item.name }}</li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isExpanded: false,
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
      ],
      listHeight: '0px',
    };
  },
  methods: {
    toggleList() {
      this.isExpanded = !this.isExpanded;
      if (this.isExpanded) {
        this.listHeight = `${this.$refs.listContainer.scrollHeight}px`;
      } else {
        this.listHeight = '0px';
      }
    },
  },
};
</script>

<style>
div {
  overflow: hidden;
  transition: height 0.3s ease;
}
</style>

使用第三方库

对于更复杂的动画效果,可以借助第三方库如 vue-animate-height

<template>
  <div>
    <button @click="toggleList">展开/收起</button>
    <vue-animate-height :duration="300" :height="height">
      <ul>
        <li v-for="item in list" :key="item.id">{{ item.name }}</li>
      </ul>
    </vue-animate-height>
  </div>
</template>

<script>
import VueAnimateHeight from 'vue-animate-height';
export default {
  components: { VueAnimateHeight },
  data() {
    return {
      isExpanded: false,
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
      ],
    };
  },
  computed: {
    height() {
      return this.isExpanded ? 'auto' : 0;
    },
  },
  methods: {
    toggleList() {
      this.isExpanded = !this.isExpanded;
    },
  },
};
</script>

以上方法可以根据实际需求选择,实现简单或复杂的展开收起效果。

vue实现展开收起列表

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

相关文章

vue实现下拉菜单

vue实现下拉菜单

实现下拉菜单的基本思路 使用Vue实现下拉菜单可以通过动态绑定v-show或v-if控制菜单显示隐藏,结合事件监听(如@click或@mouseenter)触发状态切换。以下是两种常见实现方式:…

vue 移动端实现签名

vue 移动端实现签名

Vue 移动端签名实现方法 在移动端实现签名功能,可以通过HTML5的Canvas结合触摸事件完成。以下是具体实现步骤: 使用Canvas绘制签名 安装vue-signature-pad插件或直接使…

vue怎么实现文件树

vue怎么实现文件树

Vue 实现文件树的方法 使用递归组件 递归组件是处理嵌套数据结构的理想方式。文件树通常包含文件夹和文件的嵌套结构,适合用递归组件实现。 <template> <ul>…

vue路由实现内部切换

vue路由实现内部切换

Vue 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-lin…

vue实现全局遮罩层

vue实现全局遮罩层

实现全局遮罩层的方法 在Vue中实现全局遮罩层可以通过多种方式完成,以下是几种常见的实现方法: 使用Vue组件创建遮罩层 创建一个遮罩层组件,通过全局注册或动态挂载的方式实现全局调用。以下是一个简…

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const BaseC…