当前位置:首页 > VUE

vue 实现口风琴

2026-02-17 02:33:40VUE

实现口风琴效果的方法

使用Vue实现口风琴(Accordion)效果可以通过动态绑定v-forv-showv-if来控制内容的展开与折叠。以下是两种常见的实现方式:

vue 实现口风琴

基础实现(使用v-show)

通过v-show控制每个项目的展开状态,点击时切换当前项的isOpen属性。

vue 实现口风琴

<template>
  <div class="accordion">
    <div 
      v-for="(item, index) in items" 
      :key="index" 
      class="accordion-item"
    >
      <div 
        class="accordion-header" 
        @click="toggleItem(index)"
      >
        {{ item.title }}
      </div>
      <div 
        class="accordion-content" 
        v-show="item.isOpen"
      >
        {{ item.content }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { title: '标题1', content: '内容1', isOpen: false },
        { title: '标题2', content: '内容2', isOpen: false },
        { title: '标题3', content: '内容3', isOpen: false }
      ]
    };
  },
  methods: {
    toggleItem(index) {
      this.items[index].isOpen = !this.items[index].isOpen;
    }
  }
};
</script>

<style>
.accordion-item {
  border: 1px solid #ddd;
  margin-bottom: 5px;
}
.accordion-header {
  padding: 10px;
  background: #f5f5f5;
  cursor: pointer;
}
.accordion-content {
  padding: 10px;
}
</style>

进阶实现(仅展开一项)

通过维护一个activeIndex变量,确保每次仅有一项展开,其他项自动折叠。

<template>
  <div class="accordion">
    <div 
      v-for="(item, index) in items" 
      :key="index" 
      class="accordion-item"
    >
      <div 
        class="accordion-header" 
        @click="setActiveIndex(index)"
      >
        {{ item.title }}
      </div>
      <div 
        class="accordion-content" 
        v-show="activeIndex === index"
      >
        {{ item.content }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeIndex: null,
      items: [
        { title: '标题1', content: '内容1' },
        { title: '标题2', content: '内容2' },
        { title: '标题3', content: '内容3' }
      ]
    };
  },
  methods: {
    setActiveIndex(index) {
      this.activeIndex = this.activeIndex === index ? null : index;
    }
  }
};
</script>

使用过渡动画

通过Vue的<transition>组件为展开/折叠添加平滑动画效果。

<template>
  <div class="accordion">
    <div 
      v-for="(item, index) in items" 
      :key="index" 
      class="accordion-item"
    >
      <div 
        class="accordion-header" 
        @click="setActiveIndex(index)"
      >
        {{ item.title }}
      </div>
      <transition name="fade">
        <div 
          class="accordion-content" 
          v-show="activeIndex === index"
        >
          {{ item.content }}
        </div>
      </transition>
    </div>
  </div>
</template>

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

关键点说明

  • 数据驱动:通过修改isOpenactiveIndex触发视图更新。
  • 性能优化v-show通过CSS控制显示/隐藏,适合频繁切换的场景;v-if会销毁/重建DOM,适合初始渲染成本高的内容。
  • 扩展性:可通过插槽(Slot)支持自定义标题和内容模板。

标签: 口风vue
分享给朋友:

相关文章

vue循环数组实现

vue循环数组实现

vue循环数组的实现方法 在Vue中循环数组主要通过v-for指令实现,以下是几种常见用法: 基本数组循环 使用v-for指令遍历数组,可以通过(item, index)的语法获取当前项和索引值:…

vue表单实现搜索

vue表单实现搜索

实现Vue表单搜索功能 在Vue中实现表单搜索功能通常涉及表单绑定、事件处理和搜索逻辑。以下是具体实现方法: 数据绑定与表单结构 使用v-model实现表单与Vue数据的双向绑定: <t…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-for…

vue公共列表的实现

vue公共列表的实现

实现 Vue 公共列表组件 公共列表组件通常用于展示重复结构的数据,例如商品列表、用户列表等。以下是一个典型的实现方式: 基础实现 创建可复用的列表组件 List.vue: <templ…

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…