[element-ui] el-table @selection-change自定义传参

### Vue 中多表环境下 `selection-change` 事件处理 在 Vue 应用程序中,当涉及多个表格并希望统一管理这些表格的选择变化时,可以采用集中化的方式处理 `@selection-change` 事件。为了确保不同表格之间的选择状态互不干扰,并能有效响应选择的变化,建议采取如下策略: 对于每一个 `<el-table>` 组件实例,通过自定义属性或者组件的唯一标识符来区分各个表格。这可以通过向每个表格传递唯一的键值实现,例如使用 `Math.random()` 方法生成随机数作为 key 属性[^3]。 ```html <template> <div v-for="(tableData, index) in tables" :key="index"> <el-table :data="tableData.items" @selection-change="handleSelectionChange($event, tableData.id)" :ref="'table' + tableData.id" > <!-- 表格列配置 --> </el-table> </div> </template> <script> export default { data() { return { selectedItems: {}, tables: [ { id: 'table1', items: [...] }, { id: 'table2', items: [...] } ] }; }, methods: { handleSelectionChange(selection, tableId) { const deepCopy = JSON.parse(JSON.stringify(selection)); this.$set(this.selectedItems, tableId, deepCopy); console.log(`Table ${tableId} Selection Changed`, selection); } } }; </script> ``` 上述代码展示了如何为不同的表格分配独立的身份识别码(id),并通过 `$event` 和额外参数 `tableId` 将其传入到公共的方法 `handleSelectionChange` 中去处理。这样做的好处是可以轻松追踪哪个表格触发了该事件以及获取当前被选中的行数据列表。值得注意的是,在存储或操作接收到的选择项之前应该先对其进行深拷贝以避免意外更改原始数据结构[^4]。 为了避免可能存在的事件冒泡问题,可以在监听器内部阻止默认行为和停止传播,特别是如果存在其他交互逻辑如点击行 (`@row-click`) 的情况下[^2]。 ```javascript methods: { handleRowClick(row, column, event){ event.cancelBubble = true; // Your row click logic here... }, handleSelectionChange(selection, tableId) { let e = window.event || arguments.callee.caller.arguments[0]; if (e && e.stopPropagation) { e.stopPropagation(); } else if(window.event){ window.event.cancelBubble=true; } const deepCopy = JSON.parse(JSON.stringify(selection)); this.$set(this.selectedItems, tableId, deepCopy); console.log(`Table ${tableId} Selection Changed`, selection); } } ``` 这种方法不仅解决了多表格环境下的选择变更通知机制,还兼顾到了潜在的性能优化措施,比如利用 `v-if` 控制显示隐藏从而减少不必要的 DOM 更新开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值