vxeTable 与 element-ui完成表格地区筛选

文章讲述了如何在项目中使用vxe-table和el-cascader插件实现表格地区筛选功能,包括自定义插槽的使用、前端筛选函数的编写、后端筛选参数传递以及多选选项的配置。

背景

项目中要实现表格地区筛选的功能,一开始使用element-plus 的el-table + el-cascader做,但是没多久就放弃了。因为el-table没有表头筛选的自定义内容的插槽。也就是说,要实现这个功能得原创不少代码,得不偿失,问题的关键就是寻找有筛选插槽的表格插件

vxe-table

当然这类的插槽有很多,这里我们选用的是vxe-table 表格控件

插槽示例:

  <vxe-column field="age" title="Age" :filters="ageOptions" :filter-method="filterAgeMethod">
    <template #filter="{ $panel, column }">
      <input type="type" v-for="(option, index) in column.filters" :key="index" v-model="option.data" @input="$panel.changeOption($event, !!option.data, option)">
    </template>
  </vxe-column>

如上图所示,template 里面的input就是自定义内容,这里的传参比较奇特,由于是自定义插槽,并不需要列表,需要ageOptions的一个data属性进行传参

const ageOptions = ref([
  { data: '' }
])

data 属性承载着选中的数据,根据vxe提供的示例,结合el-cascader 级联选择器对地区选择的支持,可以完成表格地区筛选的功能

结合el-cascader

把示例里面的input,换成el-cascader即可

  <vxe-column
    title="地区"
    align="center"
    field="monitorArea"
    :filters="areaNameFilter"
    :filter-method="filterMethod"
    trigger="click" 
  >
    <template #filter="{ $panel, column }">
      <el-cascader-panel
        v-for="(option, index) in column.filters"
        v-model="option.data"
        :props="cascaderProps"
        :options="areaTree"
        @change="panel.changeOption($event, !!option.data, option)"
      />
    </template>
  </vxe-column>

areaTree 是级联数据,示例如下:

  [
    {
      label: '内蒙古',
      value: '1',
      children: [
        {
          label: '包头',
          value: '13'
        }
      ]
    }
  ]

筛选

前端筛选

实现vxe-table前端筛选,配置filter-method属性,接收的是一个函数例如::filter-method="filterMethod" 那么函数就可以这样写

const filterMethod = ({ option, row }) => {
  return row.areaId === option.data
}

areaId表示表格列表中表示地区的字段,这段函数会遍历所有数据,找到所含有相应areaId的数据,当然,支持多选的话就要这样设置

const filterMethod = ({ option, row }) => {
  return option.data.includes(row.areaId)
}

后端筛选

对于后端分页的表格来讲,前端展示的只是一部分数据,这样的话筛选就要传入后台参数,让后台去数据库中查找复合条件的数据进行返回,于是我们需要对vxe-table进行一些配置

首先,filter-method不需要配置了,取而代之的是,vxe-table根节点需要配置:filter-config="{ remote: true }",然后需要监听表格中的筛选确定操作,@filter-change="filterChange", 将我们在filter属性传入列表中的data取出来,添加到接口搜索的参数中,这样就得到我们想要的结果。

以vue3的代码为例

  const filterChange = (value) => {
    value.filterList.map((item) => {
      if (item.field == 'areaId') {
        queryParams.value.areaId = transformArea(item.datas).join(', ')
      }
    })
    // 执行查询操作
    getList(queryParams.value)
  }

多选

el-cascader 组件支持多选,在标签中添加 :props=“props” 并设置 props = { multiple: true } 来开启多选模式。

  <template>
    <el-cascader :props="props" />
  </template>
  <script lang="ts">
    export default {
      setup() {
        return {
          props: {
            // props.
            multiple: true,
          },
        }
      },
    }
  </script>

效果展示

效果展示

### 实现自定义 Element-UI 表格表头筛选方法 在 Element-UI 中,可以通过多种方式实现表格表头的自定义筛选功能。以下是实现自定义表头筛选的主要方法。 #### 使用插槽自定义表头内容 Element-UI 允许通过插槽来自定义表头内容,这样可以添加下拉菜单或其他筛选控件。以下是一个使用 `el-dropdown` 实现表头筛选的示例: ```html <el-table-column prop="mount" label="交易量区间" align="left"> <template slot="header" slot-scope="scope"> <el-dropdown trigger="click" size="medium" @command="handleCommand"> <span style="color:#909399"> {{ menuText }} <i class="el-icon-arrow-down el-icon--right"></i> </span> <el-dropdown-menu slot="dropdown"> <el-dropdown-item v-for="(item, index) in section" :key="index" :command="item"> {{ item }} </el-dropdown-item> </el-dropdown-menu> </el-dropdown> </template> </el-table-column> ``` 在上面的代码中,`el-dropdown` 组件用于创建一个下拉菜单,用户可以通过点击触发筛选操作。`handleCommand` 方法用于处理用户选择的筛选条件 [^3]。 #### 自定义表头筛选逻辑 如果需要更复杂的筛选逻辑,可以在 `data` 中定义筛选条件,并在 `methods` 中实现筛选方法。以下是一个使用 `el-date-picker` 实现日期筛选的示例: ```html <el-table-column label="日期选择"> <template slot="header" slot-scope="scope"> <el-date-picker v-model="selectTime" type="date" placeholder="请选择排班时间" value-format="yyyy-MM-dd" :picker-options="pickerOptions" @change="changeTime" ></el-date-picker> </template> </el-table-column> ``` 在 `data` 中定义 `selectTime`,并在 `methods` 中实现 `changeTime` 方法: ```javascript data() { return { selectTime: '', pickerOptions: {} }; }, methods: { changeTime(val) { this.selectTime = val; this.table.loadData(); } } ``` 当用户选择日期后,`changeTime` 方法会触发数据加载,从而实现自定义筛选 [^2]。 #### 使用 `filter-method` 实现自定义筛选逻辑 Element-UI 提供了 `filter-method` 属性,允许开发者实现自定义的筛选逻辑。以下是一个示例: ```html <el-table ref="table" :data="tableData" @filter-change="filterChange"> <el-table-column label="医生类别" :filter-multiple="false" column-key="type" filter-placement="bottom-end" :filters="typeOption" :filter-method="customFilter" > <template slot-scope="{row}"> {{ row.type }} </template> </el-table-column> </el-table> <script> export default { methods: { customFilter(value, row, column) { // 自定义筛选逻辑 return row.type === value; }, filterChange(filters) { console.log(filters); if (Object.keys(filters)[0] == "type") { this.params.type = filters.type[0]; } this.list(); } } }; </script> ``` 在上面的代码中,`customFilter` 方法用于实现自定义的筛选逻辑。`filterChange` 方法用于处理筛选结果并更新数据 [^4]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值