当前位置:首页 > VUE

vue table实现折叠

2026-03-29 06:36:30VUE

vue table 实现折叠

使用 el-tableexpand 功能结合 scoped slot 实现折叠展开效果。以下是一个完整示例:

<template>
  <el-table :data="tableData" style="width: 100%">
    <el-table-column type="expand">
      <template #default="props">
        <p>姓名: {{ props.row.name }}</p>
        <p>地址: {{ props.row.address }}</p>
      </template>
    </el-table-column>
    <el-table-column label="日期" prop="date"></el-table-column>
    <el-table-column label="姓名" prop="name"></el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        {
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        },
        {
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }
      ]
    }
  }
}
</script>

自定义折叠图标

通过 expand-change 事件和 row-key 属性控制折叠状态:

<template>
  <el-table 
    :data="tableData" 
    row-key="id"
    @expand-change="handleExpand"
  >
    <el-table-column type="expand">
      <template #default="props">
        <div v-if="props.row.expand">
          <p>详细信息: {{ props.row.detail }}</p>
        </div>
      </template>
    </el-table-column>
    <!-- 其他列 -->
  </el-table>
</template>

<script>
export default {
  methods: {
    handleExpand(row, expandedRows) {
      console.log(row, expandedRows)
    }
  }
}
</script>

手风琴效果折叠

只允许同时展开一行:

<template>
  <el-table 
    :data="tableData" 
    :row-key="row => row.id"
    @expand-change="handleExpand"
  >
    <!-- 列定义 -->
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      currentExpandRow: null
    }
  },
  methods: {
    handleExpand(row, expandedRows) {
      if (expandedRows.length > 1) {
        this.$refs.table.toggleRowExpansion(expandedRows[0])
      }
      this.currentExpandRow = row
    }
  }
}
</script>

动态加载折叠内容

展开时异步加载数据:

vue table实现折叠

<template>
  <el-table :data="tableData">
    <el-table-column type="expand">
      <template #default="props">
        <div v-if="props.row.loaded">
          <p>{{ props.row.detail }}</p>
        </div>
        <div v-else>加载中...</div>
      </template>
    </el-table-column>
    <!-- 其他列 -->
  </el-table>
</template>

<script>
export default {
  methods: {
    loadDetail(row) {
      // 模拟异步请求
      setTimeout(() => {
        row.detail = '这是动态加载的详细内容'
        row.loaded = true
        this.$forceUpdate()
      }, 1000)
    },
    handleExpand(row) {
      if (!row.loaded) {
        this.loadDetail(row)
      }
    }
  }
}
</script>

注意事项

  1. 使用 row-key 确保每行有唯一标识
  2. 动态数据更新后可能需要调用 $forceUpdate()
  3. 折叠内容样式可通过 CSS 自定义
  4. 大量数据时考虑性能优化

以上实现方式适用于 Element UI 的表格组件,其他 UI 库实现原理类似,具体 API 可能有所不同。

标签: vuetable
分享给朋友:

相关文章

vue手动实现弹窗

vue手动实现弹窗

实现弹窗组件的基本结构 在Vue中手动实现弹窗组件,需要创建一个独立的弹窗组件,并通过props控制其显示与隐藏。弹窗组件通常包含遮罩层、内容区域和关闭按钮。 <template>…

vue调用接口实现退出

vue调用接口实现退出

实现Vue退出功能的步骤 在Vue中调用接口实现退出功能通常需要与后端API交互,以下是实现方法: 前端实现 创建退出方法,调用后端API接口: methods: { logout() {…

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…

vue实现注册

vue实现注册

Vue 实现注册功能 注册功能通常涉及前端表单、数据验证、与后端 API 的交互等步骤。以下是一个完整的 Vue 实现注册功能的方案。 创建注册表单 使用 Vue 的模板语法创建注册表单,包含用户名…

vue底部实现

vue底部实现

Vue 底部实现方法 在 Vue 项目中实现底部布局可以通过多种方式完成,以下是一些常见的方法: 使用固定定位 将底部元素固定在页面底部,适用于单页应用或需要始终显示的底部栏。 <temp…

vue实现梯形

vue实现梯形

在Vue中实现梯形效果,可以通过CSS的transform属性或clip-path属性来实现。以下是几种常见的实现方法: 使用CSS transform实现梯形 通过CSS的transform: s…