解决 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);
  }
}

### 关于 Element Plus 中实现表格展开功能 在 Vue3Element Plus 组件库中,`el-table` 支持通过 `type="expand"` 属性来创建可展开。每一可以有一个额外的内容区域,在用户点击左侧的小箭头显示或隐藏该部分内容。 #### 基本配置与属性设置 为了使某一能够被展开,需为 `<el-table-column>` 设置 `type="expand"` 并定义其作用域插槽(scoped slot)。此插槽用于自定义当展开所展示的具体内容[^2]。 ```html <template> <div id="app"> <el-table :data="tableData" style="width: 100%"> <!-- 定义 expand--> <el-table-column type="expand"> <template #default="{ row }"> <p>{{ row.description }}</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> </div> </template> <script setup lang="ts"> import { ref, onMounted } from &#39;vue&#39;; const tableData = ref([ { date: "2016-05-03", name: "Tom", description: "描述信息..." }, // 更多的数据... ]); </script> ``` 上述代码展示了如何利用 `el-table-column` 的 `type="expand"` 来构建具有展开能力的表格,并且可以通过模板中的 scoped slot 自由设计每列出的信息详情。 对于更高级的需求,比如树状结构下的子节点懒加载以及批量操作如一次性展开/折叠所有等功能,则涉及到更为复杂的逻辑处理和 API 调用,这通常会结合 Vuex 或者 Composition API 来管理状态变化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值