当前位置: 首页 > article >正文

vue3 + element-plus + el-table 实现三层嵌套表格(含分页)

概述

项目需求 表格嵌套表格,一共三层表格,第二层基于第一层数据显示(流加载),第三层基于第二层数据(分页加载)。一下实现效果ui图! 日常需求小记录!佛系记录!
在这里插入图片描述
首先我这里使用的是 element-plus 的表格去实现的(含有扩展行 expand配置项),这个图没什么难得,就是逻辑交互可能稍微复杂一点!

先看第一层代码:

// row-key="" 绑定唯一性id值      
// expand-row-keys 这个配置展开得行     
// @expand-change扩展行变化 可在官网查看
// 控制第二层得展开 和获取
<el-table
        :data="state.deptListData"
        stripe
        border
        class="flex1"
        height="100%"
        row-key="deptId"
        :header-cell-style="{ 'text-align': 'center' }"
        v-loading="state.deptLoading"
        :expand-row-keys="policeState.deptExpands"
        @expand-change="deptExpandsChange"
      >

		<el-table-column type="expand">
          <!--第二层嵌套 民警-->
          <template #default="{ row }">
          	<!--流加载配置   loadPoliceList 滚动条拉到底部触发 请求第二页数据-->
          	<!--通过 police-box css设置固定高度,因为要用流加载   ofa:overflow: auto;  dn-scroll:隐藏滚动条-->
            <div
              class="police-box ofa dn-scroll"
              v-infinite-scroll="loadPoliceList"
              :infinite-scroll-distance="15"
              :infinite-scroll-delay="300"
              :infinite-scroll-immediate="false"
            >
			<!--这里跟第一层是一样得 控制第三层得展开和获取-->
              <el-table
                v-if="policeState.policeChildren.length"
                :data="policeState.policeChildren"
                :show-header="false"
                class="police-table"
                row-key="investigatorBadgeNum"
                :expand-row-keys="suspectState.policeExpands"
                @expand-change="policeExpandsChange"
              >
                <el-table-column type="expand">
                  <!--第三层嵌套 嫌疑人-->
                  <template #default="{ row }">
                    <el-table
                      :data="suspectState.suspectChildren"
                      :cell-style="{ 'text-align': 'center' }"
                      :header-cell-style="{ 'text-align': 'center' }"
                    >
                      <!--第三层的列   这里并没有设置暂无数据,因为在全局表格中已经通过css 设置过了,你这里如果没设置,可以加上-->
                    </el-table>

					<!--封装的分页 没有数据就不显示分页-->
                    <Pagination
                      v-show="suspectState.suspectChildren.length"
                      :pageSizes="[10, 20, 30]"
                      :pageData="suspectState.suspectPageData"
                      @filter="getSuspectList"
                    ></Pagination>
                  </template>
                </el-table-column>

                <!--第二层其余列数据-->
              </el-table>
              <div v-else class="h100 w100 flex flex-center">暂无数据</div>
            </div>
          </template>
        </el-table-column>


	<!--这里就是第一层其他列内容-->
</el-table>

// 流加载触发函数
const loadPoliceList = () => {
  if (policeState.policeChildren.length >= policeState.policePageData.total)
    return
  policeState.policePageData.pageNum += 1
  // 这里请求第二层数据
}


// 点击第一层 展开 收缩事件   第三层也照例就ok了
const deptExpandsChange = async (row: any, expandedRows: any) => {
// 重置查询条件  因为每个第二层都是公用的同一个分页
  policeState.policeChildren = []
  policeState.policePageData = {
    pageNum: 1,
    pageSize: 10,
    total: 0,
  }
  // 需关闭其他扩展行 保持一个扩展行的使用  子扩展行也要收缩
  suspectState.policeExpands = []
  policeState.deptExpands = []
  if (expandedRows.length) {
    if (row) {
      policeState.deptExpands.push(row.deptId)
      policeState.deptExpandCode = row.deptCode // 第二层所需参数
      // 这里去请求 第二层数据
      ...
    }
  }
}

// 第三层
const policeExpandsChange = async (row: any, expandedRows: any) => {
  // 不管折叠 还是展开,必须重置当前分页 及 数据列表
  suspectState.suspectChildren = []
  suspectState.suspectPageData = {
    pageNum: 1,
    pageSize: 10,
    total: 0,
  }
  suspectState.policeExpands = []
  // 展开
  if (expandedRows.length) {
    if (row) {
      suspectState.policeExpands.push(row.investigatorBadgeNum)
      suspectState.policeDeptId = row.deptId // 入参
      suspectState.policeEnterAreaIds = row.enterAreaIds // 入参
      // 这里去请求 嫌疑人数据
    }
  }
}

这个简单的小需求就实现啦!

那个第二层数据 流加载,要确保有一定的高度哈!

注意点: 确保只能张开当前分级 的一个扩展行(因为公用的同一个分页及页码,)。确保每次展开收起 都要将子级收缩起来,并且要把数据及入参清空! 当然如果你想要多个行并列展开的话,有一个思路就是将分页 及 相关参数存到每条数据里,要将数据初始化好!这样及可以展开多行切不互相影响!

如果有什么不足的地方,欢迎指出,谢谢!欢迎评论区留言!


http://www.kler.cn/a/504355.html

相关文章:

  • 游戏市场成果及趋势
  • 【MySQL学习笔记】MySQL视图View
  • 详情页 路由传值
  • 如何独立SDK模块到源码目录?
  • 学习笔记-Kotlin
  • 基于微信小程序的汽车销售系统的设计与实现springboot+论文源码调试讲解
  • Golang学习笔记_24——泛型
  • 多态(2)
  • 闲谭SpringBoot--ShardingSphere分布式事务探究
  • 使用中间件自动化部署java应用
  • Oracle 学习指南与资料分享
  • React 实战详细讲解:setState 是什么、如何更新及批量处理
  • Java IDEA中Gutter Icons图标的含义
  • 实现一个VSCode插件(从创建到发布)
  • android 内存泄露实战分析
  • 台湾省村里边界2018年4月更新arcgis数据shp格式内容分析测评
  • Unity ShaderGraph中Lit转换成URP的LitShader
  • 【数学】概率论与数理统计(四)
  • docker run一个镜像如何指定最大可使用的内存大小、cpu大小
  • 一.项目课题 <基于TCP的文件传输协议实现>
  • Linux下杂项设备驱动的编写
  • Elasticsearch技术标准解析与实践案例
  • 软路由如何实现电脑手机一机一IP
  • springboot 根据UUID生成唯一的短链接
  • 如何学好数据结构?
  • 大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建二