解决 Vue3+ElementPlus 使用table 展开行type=“expand“ 时,遇到行展开后又自动关闭的问题

原因:数据更新导致的组件重新渲染。(项目需求和element组件设计逻辑冲突,展开行默认初始化时已获取到tableData的所有数据,点击展开行时直接展示即可,项目需求为点击展开行时再获取数据动态渲染展开行)


Element Plus table 的行展开状态是由数据驱动的,如果在展开行的过程中数据发生变化,即使是非关联数据的变化,都可能触发组件的重新渲染,从而导致已展开的行被自动关闭。


解决方案:
在<el-table>增加 :expand-row-keys="expandedRowKeys"
  :row-key="row => row.id",
expandChange方法获取数据后,用 :expand-row-keys="expandedRowKeys"来控制哪些行是展开的

<el-table
  :data="tableData"
  style="width: 100%"
  stripe
  border
  @expand-change="expandChange"
  :expand-row-keys="expandedRowKeys"
  :row-key="row => row.id"
  v-loading="tableLoading"
>
  <el-table-column type="selection" width="50" />
  <el-table-column type="expand">
    <template #default="props">
      <el-table :data="props.row.temp">
        <el-table-column label="Name" prop="name" />
        <el-table-column label="State" prop="state" />
        <el-table-column label="City" prop="city" />
        <el-table-column label="Address" prop="address" />
        <el-table-column label="Zip" prop="zip" />
      </el-table>
    </template>
  </el-table-column>
</el-table>
const expandedRowKeys = ref([])
const expandChange = async (val: any, expandedRows: any) => {
  // 该处是用于判断是展开还是收起行,只有展开的时候做请求
  if (expandedRows.length > 0) {
    params.test = val.test
    let temp = await getRequest(params)
    val.temp = temp
    // 控制展开行
    expandedRowKeys.value = expandedRows.map(val => val.id);
  }
}

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值