解决Vue3+ElementPlus中table展开行,自动关闭且异步加载的问题

在Vue3项目中使用ElementPlusUI时,遇到一个挑战:需要在外层表格展开时动态加载内嵌子表格的数据。由于官方数据结构不匹配,作者通过监听展开事件,在展开时异步获取并赋值子表格数据。然而,这导致了展开行的快速关闭。解决方案是为外层表格添加`row-key`属性,确保每一项都有唯一标识,从而正确地显示和处理子表格数据。
摘要由CSDN通过智能技术生成

问题描述

最近在做项目中遇到一个比较诡异的问题:采用Vue3+Element Plus UI框架,其中有个需求是:table表格展开行中内嵌一个子table,需要在展开的时候异步加载子table数据,而然官方的数据是外层数据和子数据是直接嵌套在一起的。这明显不符合我们的需求。

想法

首先自然想到的是,在展开事件触发的时候,请求子table数据,然后将其塞到当前展开的外层table中。项目代码如下:

// 展开事件触发
function onExpand(row, expandedRows){
  // 判断当前展开行
  if(expandedRows.find(ele => ele == row)){
    cload.value = true
    // 获取子table数据
    getNoteDetialByid(row.deliveryId).then(res=>{
      // 当前行的子数据赋值
      row.children = res.data
      cload.value = false
    }).catch(err=>cload.value = false)
  }
}

遇到的问题

其实这样是没问题的,诡异的是:展开的时候,展开行又快速关闭了,非常脑壳疼,摸索尝试了几个小时终于找到了解决的办法。

解决方法

给外层table表格添加row-key="id"属性,“id”为区分外层table数据唯一性的key,有可能唯一属性叫“rowid”或者其他什么,只要能区分外层table数据中的每一项即可。例如我的外层table格式如下:

const tableData = [
	{
		id:"131323131",
		name:"张三"
	},
	{
		id:"343243242",
		name:"李四"
	},
]
// id就为唯一性key
<!-- 外部table -->
		<el-table :data="tableData1" border style="width: 100%" @expand-change="onExpand" v-loading="pload" stripe row-key="children">
      <el-table-column type="expand">
        <template #default="props">
          <!-- 内部table -->
          <el-table :data="props.row.children" border  style="width: 100%" v-loading="cload"></el-table>
        </template>
      </el-table-column>
      <!-- 外部table -->
      <el-table-column v-for="(item,index) in Pcolumns" :key="index" :label="item.label" :prop="item.prop" :min-width="item.min_width?item.min_width:0">
      </el-table-column>
    </el-table>
芋道框架是一个开源的管理系统前端框架,Vue.js 是一个构建用户界面的渐进式JavaScript框架,Element Plus 是基于 Vue 3 的一个组件库。在使用这些技术时,如果你在页面使用了 Element Plus 的 table 组件,并且希望通过多选框选择数据,可能会遇到翻页或进其他查询操作后选状态丢失的问题。 要解决这个问题,可以使用 Element Plus 提供的 `default-sort` 属性来保持表格的排序状态,但要保持多选框的选状态,则需要维护一个状态管理对象来跟踪哪些是被选的。通常,可以在全局状态管理(如 Vuex)维护一个数组,用来存储选的 ID 或其他唯一标识符。 以下是实现步骤的简化版本: 1. 在组件的 data 函数定义一个数组来跟踪选。 2. 在每个数据上绑定多选框的 v-model,将选状态与该数组关联。 3. 在翻页或查询操作发生时,使用计算属性或方法来过滤并保留原选状态。 4. 如果是在 Element Plus 的 table 组件实现,可以通过 `row-key` 属性指定的唯一标识符,然后在翻页或查询后,根据键值匹配并更新选的状态。 示例代码片段可能如下所示: ```javascript data() { return { tableData: [], // 表格数据 selectedRows: [], // 已选数据 }; }, watch: { tableData(newVal) { // 翻页或查询后,更新选状态 this.selectedRows = this.tableData.filter(row => this.isSelected(row)); } }, methods: { isSelected(row) { // 检查某是否被选 return this.selectedRows.some(selectedRow => selectedRow.id === row.id); }, selectRow(row) { // 处理选操作 const index = this.selectedRows.findIndex(selectedRow => selectedRow.id === row.id); if (index !== -1) { // 如果已经选,则取消选 this.selectedRows.splice(index, 1); } else { // 如果未选,则添加到选列表 this.selectedRows.push(row); } } } ``` 在使用表格组件时,将 `v-model` 绑定到 `selectedRows` 上,并在每一的多选框上触发 `selectRow` 方法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值