解决element plus组件库,el-table嵌入el-switch更新表格数据自动触发el-switch组件change事件的方案

问题背景

项目列表页面,el-table组件中利用插槽嵌入了el-switch组件,当更新列表数据后会自动触发开关组件的chang事件。问题示例代码如下

# table-com 为自定义组件不用在意
<table-com
    ref="nodeTableCom"
    v-loading="loading"
    :tableColumns="tableConfig"
    :tableData="tableData"
    @tableBtn="handleTableRow"
 >
    <template #status="{ row }">
      <el-switch
        @change="statusHandle(row)"
        :active-value="true"
        :inactive-value="false"
        v-model="row.status"
       />
    </template>
 </table-com>

分析问题

查看了element plus官方文档,该组件提供的API只有change事件,找了很多贴字说可以将change事件替换为before-change事件,但是并没有解决我的问题,想了解更多组件内容点击这里https://element-plus.org/zh-CN/component/switch.html#apiicon-default.png?t=O83Ahttps://element-plus.org/zh-CN/component/switch.html#api

解决方案

自己决定使用原生事件去解决这个问题,不使用组件提供的changeAPI,给组件绑定click事件,这样就能完美的解决这个问题。

<template #status="{ row }">
    <el-switch
        @click="statusHandle(row)"
        :active-value="true"
        :inactive-value="false"
        v-model="row.status"
    />
</template>
<script setup>
const statusHandle = (row) => {
    const { status } = row
    // 改变状态接口
    const payload = {
        ...入参
    }
    statusApi(payload).then(res => {

    }).catch(err => {
        // 状态更新失败恢复列表状态
        row.status = !status
    })
}
</script>

 小提醒

注意:

  1. 如果el-switch组件是使用v-model绑定的表格数据,那么你回调函数中的参数其实是改变完的状态值,所以如果改变状态失败后还需手动恢复列表数据,否则视图层会被改变。
  2. 如果使用model-value绑定则回调函数中的参数是未改变的状态值,状态失败后也不需要去恢复列表数据。

总结

开发问题小记录,希望能够帮助到遇到同样问题的小伙伴,如果有更好的解决方案欢迎评论留言,有问题欢迎指正。

要在 Element Plus 的 el-table 组件中实现表头合并,可以使用 el-table-column 组件的属性:`colspan` 和 `rowspan`。其中,`colspan` 表示列合并数,`rowspan` 表示行合并数。 具体实现步骤如下: 1. 在 el-table 中定义表头,使用 el-table-column 定义每一列的表头,需要合并的单元格设置 `colspan` 和 `rowspan` 属性。 2. 在表格数据中,需要将需要合并的单元格的值设置为 null。 下面是一个示例代码,用来展示如何在 Element Plus 中实现表头合并: ```html <el-table :data="tableData"> <el-table-column prop="name" label="姓名" rowspan="2"></el-table-column> <el-table-column prop="age" label="年龄" colspan="2"></el-table-column> <el-table-column prop="address" label="地址" rowspan="2"></el-table-column> <el-table-column prop="date" label="日期" rowspan="2"></el-table-column> <el-table-column prop="status" label="状态" rowspan="2"></el-table-column> <el-table-column prop="score" label="分数" colspan="3"></el-table-column> </el-table> ``` ```js tableData: [ { name: '张三', age: 18, address: '北京市', date: '2021-06-01', status: '通过', score: [80, 90, 85] }, { name: '李四', age: 20, address: '上海市', date: '2021-06-02', status: '未通过', score: [70, 65, 80] }, { name: null, age: '平均值', address: null, date: null, status: null, score: [75, 77.5, 82.5] }, ], ``` 在上面的代码中,第一列的表头“姓名”需要合并两行,使用 `rowspan="2"` 实现。第二列的表头“年龄”需要合并两列,使用 `colspan="2"` 实现。最后一列的表头“分数”需要合并三列,使用 `colspan="3"` 实现。在表格数据中,第一个数据行的第一列和第三列需要合并,将其值设置为 null。 注意:`rowspan` 和 `colspan` 的值必须是正整数,不能为 0 或负数。同时,合并单元格时需要保证数据的正确性,否则可能会出现显示错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值