Element Table表格组件实现多选并获取选择的行内容

本文介绍了如何在Vue中使用Element UI的el-table实现表格多选功能,包括如何设置多选列和监听`selection-change`事件来获取选中的行数据,以及如何筛选特定字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要想 table 出现多选操作列,只需要给 el-table 加一个 el-table-column ,并设 type 属性为 selection

<el-table>
	<el-table-column type="selection"></el-table-column>
</el-table>

多选示例

如果需要获取勾选了哪些行,需要给 el-table 加一个事件。

<el-table @selection-change="handleSelectionChange">
	<el-table-column type="selection"></el-table-column>
</el-table>
<script>
  export default {
    data() {
      return {
        multipleSelection: []
      }
    },
    methods: {
      handleSelectionChange(val) {
        this.multipleSelection = val;
      }
    }
  }
</script>

此时方法的 val 是选中的所有数据组成的数组,以下方法可以获取里面的某个字段。

methods: {
	handleSelectionChange(val) {
		// this.multipleSelection = val;
		this.multipleSelection = []
		// 假设取出 id 字段
		val.forEach(item => {
			const id = item.id
			// 判断数组中是否包含这个 id 
			if (this.multipleSelection.indexOf(id) == -1) {
				this.multipleSelection.push(id)
			}
		})
	}
}
<think>我们被要求回答关于ElementUI表格组件中filters筛实现的问题,需要提供示例代码或解决方案。根据提供的引用,特别是引用[1]和[2]都提到了`filter-change`事件,该事件在表格的筛条件变化时触发,参数是一个对象,其键是列的columnKey,值是对应列上用户选择的筛条件的数组(即filters数组)。引用[3]则展示了如何利用`formatter`属性来实现回显,但我们的需求是实现。在ElementUI中,表格的列可以通过设置`filters`和`filter-method`来实现功能。其中,`filters`是一个数组,定义了该列可供筛项(每个项包含text和value)。`filter-method`是一个函数,用于自定义筛逻辑。但是,默认情况下,ElementUI表格的筛是单(点击一个项,其他项会取消)。要实现,我们需要自定义筛逻辑,管理筛状态。思路:1.表格列上设置`filters`,定义项(的基础)。2.设置`filter-method`,但注意,默认的筛逻辑是单,所以我们需要自己管理每个列的状态(即当前选中了哪些项)。3.利用`filter-change`事件来监听筛条件的变化,更新我们管理的状态。4.在自定义的`filter-method`中,根据我们管理的状态来过滤表格数据。然而,ElementUI没有直接提供,因此我们需要自己实现。以下是一种实现方案:步骤:1.在data中定义一个对象(如`filtersStatus`)来存储每个列的当前选中值(数组形式)。2.在列定义中,将`filter-method`绑定到一个自定义的筛函数,在这个函数中,我们根据`filtersStatus`中该列对应的选中值来判断该是否显示。3.监听表格的`filter-change`事件,当筛条件变化时,更新`filtersStatus`,触发表格数据的重新过滤(可以通过改变`tableKey`来重新渲染表格,或者使用`this.$refs.table.clearFilter()`等方法,但更推荐使用数据驱动的方式)。注意:由于我们自定义了筛逻辑,所以需要自己控制表格的显示。我们可以使用一个计算属性来返回过滤后的表格数据,然后在表格中使用这个计算属性作为数据源。但是,ElementUI表格组件本身支持通过设置`data`属性来绑定数据,我们可以通过计算属性来动态计算表格数据,根据我们存储的状态进过滤。另一种做法(更符合ElementUI的方式):1.在列上设置`filters`和`filter-method`,但是`filter-method`函数中不直接使用传入的value(因为它是单的值),而是使用我们存储在data中的状态。2.当用户点击筛条件时,通过`filter-change`事件更新状态,然后手动触发整个表格的重新过滤(比如通过设置一个计算属性作为表格数据,或者使用`this.$refs.table.clearFilter()`然后重新设置筛状态)。然而,ElementUI表格在内部管理筛状态,我们自定义的`filter-method`会在每次筛条件变化时被调用,但是当我们更新外部状态(状态)后,如何触发重新筛呢?我们可以这样做:-在`filter-change`事件中,更新对应列的状态(数组),然后强制重新渲染表格(通过改变`key`)或者使用计算属性来动态计算表格数据。但是,改变`key`会导致整个表格重新渲染,可能会丢失当前状态(如展开选中等)。因此,我们更推荐使用计算属性来过滤数据。因此,我们调整思路:不使用ElementUI内置的筛(即不使用`filter-method`),而是完全自己控制表格数据的过滤。这样,我们就可以实现。具体步骤:1.表格的每一列定义筛项(`filters`数组),但不需要设置`filter-method`。2.监听表格的`filter-change`事件,在该事件中更新我们存储的各列筛状态(一个对象,键为列名,值为选中的筛值数组)。3.使用计算属性,根据各列的筛状态,对原始数据进过滤,得到表格显示的数据。4.将计算属性绑定到表格的`data`属性上。这样,我们就完全接管了筛功能,可以实现。示例代码:假设我们有一个表格,其中一列为`tag`,我们希望根据这一列进。```vue<template><div><el-table:data="filteredData"ref="table"@filter-change="handleFilterChange"><el-table-columnprop="tag"label="标签"column-key="tag":filters="[{text:'标签1',value:'标签1'},{text:'标签2',value:'标签2'},{text:'标签3',value:'标签3'},]":filter-multiple="true"<!--这里设置,但实际上ElementUI内置筛不支持,所以我们不用内置的,但设置这个可以显示UI-->><templateslot-scope="scope">{{scope.row.tag}}</template></el-table-column><!--其他列--></el-table></div></template><script>exportdefault{data(){return{tableData:[//原始数据{tag:'标签1',...},{tag:'标签2',...},{tag:'标签3',...},//...],//存储筛状态,键为columnKey,值为选中的value数组filtersStatus:{//初始化,比如tag列初始为空数组,表示不筛tag:[],//其他列...}};},computed:{filteredData(){//根据filtersStatus中的条件过滤数据letdata=this.tableData;//遍历每个有筛条件的列Object.keys(this.filtersStatus).forEach(columnKey=>{constselectedValues=this.filtersStatus[columnKey];if(selectedValues&&selectedValues.length>0){//根据列的不同,可能有不同的过滤逻辑,这里假设列key为'tag'if(columnKey==='tag'){data=data.filter(row=>selectedValues.includes(row.tag));}//其他列...}});returndata;}},methods:{handleFilterChange(filters){//filters是一个对象,键是columnKey,值是选中的筛条件的value数组//注意:由于我们设置filter-multiple为true,所以这里每个列对应的值都是数组//更新我们的filtersStatusthis.filtersStatus={...filters};//注意:这里我们不需要手动触发重新计算,因为filteredData是计算属性,会随着filtersStatus的变化而更新}}};</script>```说明:1.我们在列上设置了`column-key="tag"`,这样在`filter-change`事件中,就会以`tag`作为键来标识这一列。2.设置`filter-multiple="true"`,这样在筛面板中会显示框(而不是单框)。3.在`handleFilterChange`方法中,我们更新`filtersStatus`,它是一个对象,存储了每一列的筛值数组。4.`filteredData`计算属性根据`filtersStatus`中的条件对原始数据`tableData`进过滤。这里我们只处理了`tag`列,如果有其他列,需要添加相应的过滤逻辑。注意:这种实现方式中,我们完全自己控制数据过滤,因此可以灵活实现。但是,如果列很,过滤逻辑可能会比较复杂,需要为每一列编写过滤逻辑。另外,如果希望使用ElementUI内置的筛样式和交互(即点击筛按钮弹出框),同时又想实现功能,那么上面的方法是一个可的方案。但是,需要注意的是,ElementUI在触发`filter-change`事件时,对于列,传递的已经是选中的值数组(例如,选中两个值,那么数组就有两个元素)。因此,我们直接使用这个数组来过滤即可。总结:通过自定义数据过滤(使用计算属性)和监听`filter-change`事件来更新筛条件,我们可以实现功能。以上便是实现ElementUI表格的示例代码和解决方案。根据要求,我们需要生成相关问题:1.ElementUI表格中如何实现自定义筛逻辑?2.ElementUI表格的`filter-change`事件如何使用?3.如何动态改变ElementUI表格的筛条件?</think>### Element UI 表格实现方案 在 Element UI 表格实现功能,核心是通过 `filter-change` 事件和自定义筛逻辑实现的。以下是完整解决方案和示例代码: #### 实现思路 1. 使用 `filter-change` 事件监听筛条件变化 2. 在列定义中设置 `filters` 数组定义可项 3. 使用 `filter-multiple` 启用模式 4. 通过 `scopedSlots` 自定义筛面板实现交互 5. 在 `filter-method` 中实现逻辑 #### 示例代码 ```vue <template> <el-table :data="filteredData" @filter-change="handleFilterChange" ref="filterTable" > <!-- 列 --> <el-table-column prop="status" label="状态" column-key="status" :filters="statusFilters" :filter-multiple="true" :filter-method="filterHandler" > <!-- 自定义筛面板 --> <template slot="filter" slot-scope="{ column }"> <el-checkbox-group v-model="selectedFilters"> <el-checkbox v-for="filter in column.filters" :key="filter.value" :label="filter.value" > {{ filter.text }} </el-checkbox> </el-checkbox-group> </template> </el-table-column> <!-- 其他列 --> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="date" label="日期"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { id: 1, name: '张三', status: 'active', date: '2023-01-01' }, { id: 2, name: '李四', status: 'inactive', date: '2023-01-02' }, { id: 3, name: '王五', status: 'pending', date: '2023-01-03' }, // 更数据... ], statusFilters: [ { text: '激活', value: 'active' }, { text: '未激活', value: 'inactive' }, { text: '待审核', value: 'pending' } ], selectedFilters: [], // 存储当前选中的筛值 filteredData: [] // 存储筛后的数据 } }, mounted() { // 初始化显示所有数据 this.filteredData = [...this.tableData]; }, methods: { // 处理筛变化 handleFilterChange(filters) { this.selectedFilters = filters.status || []; this.applyFilters(); }, // 应用筛逻辑 applyFilters() { if (this.selectedFilters.length === 0) { this.filteredData = [...this.tableData]; } else { this.filteredData = this.tableData.filter(item => this.selectedFilters.includes(item.status) ); } }, // 筛方法(Element UI要求) filterHandler(value, row, column) { const property = column.property; return this.selectedFilters.includes(row[property]); }, // 重置筛 resetFilters() { this.selectedFilters = []; this.$refs.filterTable.clearFilter(); } } } </script> ``` #### 关键实现点说明 1. **模式**:设置 `filter-multiple="true"` 启用 2. **自定义筛面板**:使用 `scopedSlots` 自定义带复框的筛面板 3. **筛状态管理**: - `selectedFilters` 数组存储当前选中的筛值 - `filter-change` 事件更新选中状态[^1][^2] 4. **筛逻辑**: - 当无选中时显示全部数据 - 有选中时使用 `array.includes()` 匹配条件 5. **重置功能**:通过 `clearFilter()` 方法可重置筛状态[^1] #### 注意事项 1. 必须设置 `column-key` 属性作为筛标识 2. `filter-method` 方法需返回布尔值判断是否显示该 3.面板中使用 `v-model` 绑定到 `selectedFilters` 实现双向同步 4. 大数据量时建议添加防抖处理筛操作 此方案实现了完全可定制的功能,通过自定义筛面板和控制筛逻辑,可以灵活适应各种复杂筛需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相逢不晚何必匆匆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值