当前位置:首页 > VUE

vue实现表格收缩展开

2026-02-22 10:15:47VUE

Vue 实现表格展开/收缩功能

核心思路
通过动态控制行数据的渲染或样式切换实现展开/收缩效果,常见方案包括:

  • 使用 v-if/v-show 控制子行显隐
  • 利用 CSS 过渡动画增强交互
  • 结合 Vue 的响应式数据管理展开状态

基础实现(v-show 方案)

模板部分

<template>
  <table>
    <tr v-for="item in tableData" :key="item.id">
      <td>
        <button @click="toggleExpand(item.id)">
          {{ expandedRows.includes(item.id) ? '−' : '+' }}
        </button>
        {{ item.name }}
      </td>
    </tr>
    <!-- 展开内容行 -->
    <tr v-for="item in tableData" 
        v-show="expandedRows.includes(item.id)"
        :key="`detail-${item.id}`">
      <td colspan="2">{{ item.detail }}</td>
    </tr>
  </table>
</template>

脚本部分

<script>
export default {
  data() {
    return {
      tableData: [
        { id: 1, name: '项目A', detail: '详细内容...' },
        { id: 2, name: '项目B', detail: '详细内容...' }
      ],
      expandedRows: []
    }
  },
  methods: {
    toggleExpand(id) {
      const index = this.expandedRows.indexOf(id);
      index === -1 
        ? this.expandedRows.push(id) 
        : this.expandedRows.splice(index, 1);
    }
  }
}
</script>

进阶方案(组件化封装)

可复用组件结构

<!-- ExpandableTable.vue -->
<template>
  <table>
    <tbody>
      <tr v-for="row in data" :key="row.id">
        <td>
          <span @click="toggleRow(row)" class="toggle-icon">
            {{ isExpanded(row) ? '▼' : '▶' }}
          </span>
          {{ row.name }}
        </td>
      </tr>
      <tr v-if="isExpanded(row)" v-for="row in data" :key="`exp-${row.id}`">
        <td class="expanded-content">
          <slot name="detail" :row="row"></slot>
        </td>
      </tr>
    </tbody>
  </table>
</template>

逻辑封装

props: ['data'],
data() {
  return { expandedIds: new Set() }
},
methods: {
  toggleRow(row) {
    this.expandedIds.has(row.id)
      ? this.expandedIds.delete(row.id)
      : this.expandedIds.add(row.id);
  },
  isExpanded(row) {
    return this.expandedIds.has(row.id);
  }
}

样式优化技巧

CSS 过渡效果

.expanded-content {
  transition: all 0.3s ease;
  max-height: 0;
  overflow: hidden;
}
tr.expanded .expanded-content {
  max-height: 500px; /* 根据实际内容调整 */
}

表头缩进对齐

.toggle-icon {
  display: inline-block;
  width: 20px;
  text-align: center;
  cursor: pointer;
}
td {
  padding-left: 10px;
  border-bottom: 1px solid #eee;
}

性能优化建议

对于大数据量表格:

  • 使用虚拟滚动(如 vue-virtual-scroller
  • 避免深层响应式数据嵌套
  • 考虑分页加载展开内容
  • 使用 Object.freeze() 冻结静态数据

第三方库推荐

  1. Element UI

    <el-table :data="tableData">
      <el-table-column type="expand">
        <template #default="props">
          {{ props.row.detail }}
        </template>
      </el-table-column>
    </el-table>
  2. VxeTable
    提供 expand-config 配置项和 toggleRowExpansion 方法

  3. BootstrapVue
    使用 b-tableshowDetails 字段控制展开状态

vue实现表格收缩展开

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

相关文章

vue播放倍速怎么实现

vue播放倍速怎么实现

实现Vue播放倍速的方法 在Vue中实现播放倍速功能通常涉及HTML5的<video>元素或第三方播放器库。以下是几种常见实现方式: 使用原生HTML5 video元素 通过ref获取v…

vue实现签约合作弹窗

vue实现签约合作弹窗

实现签约合作弹窗的步骤 使用Vue实现签约合作弹窗可以通过组件化方式完成,结合模态框和表单交互逻辑。以下是具体实现方法: 1. 创建弹窗组件 新建一个Vue组件文件(如SignContractDi…

vue实现倒计时抢券

vue实现倒计时抢券

Vue 实现倒计时抢券功能 核心逻辑 倒计时抢券功能需要结合时间计算、状态管理和界面交互。通过 Vue 的响应式特性和生命周期钩子,可以高效实现这一需求。 实现步骤 1. 数据准备 在 Vue 组…

vue  实现tab

vue 实现tab

实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过动态组件或条件渲染完成。以下是两种常见方法: 使用 v-if 或 v-show 实现条件渲染 通过绑定 currentTab 变…

vue computed实现

vue computed实现

计算属性的基本用法 在Vue中,计算属性通过computed选项定义,用于声明依赖于其他属性的动态值。计算属性基于它们的依赖进行缓存,只有依赖发生变化时才会重新计算。 new Vue({ da…

vue实现curd

vue实现curd

Vue实现CRUD操作 初始化Vue项目 使用Vue CLI创建新项目,安装必要依赖如axios用于HTTP请求 vue create crud-demo cd crud-demo npm inst…