VUE3下拉框筛选filter-method方法使用

需求:通过筛选,下拉框显示与筛选符合的值。

本来可以使用 filterable 就可以了,但是这个我先加上之后没有匹配到合适的,百度后了解这个属性只能为简单的字段进行筛选,我的下拉框值全是中文,筛选就不精准 找不到人

    <el-form-item :label="$t('邮件通知人:')" prop="changeUser" style="width: 100%">
            <el-select v-model="ruleForm.changeUser" filterable multiple placeholder="请选择邮件通知人" :filter-method="customFilterMethod">
              <el-option v-for="item in dialogInfo.options" :key="item.emp_name" :label="item.emp_name" :value="item.email" />
            </el-select>

我这里是选多个,所以我绑定的ruleForm.changeUser是数组,dialogInfo. 是从接口获取的原始数据。

//筛选方法
const customFilterMethod = (query) => {
  const normalizedQuery = query ? query.trim().toLowerCase() : ''

  if (normalizedQuery) {
    dialogInfo.options = dialogInfo.filterOption.filter((item) => item.emp_name.trim().toLowerCase().includes(normalizedQuery))
  } else {
    dialogInfo.options = dialogInfo.filterOption
  }
}

### vxe-table 中实现自定义筛选下拉框 为了满足复杂业务逻辑的需求,在 `vxe-table` 表格中可以利用插槽 (slot) 和事件来创建高度定制化的筛选功能。对于希望集成类似 Excel 的筛选体验或是开发更为复杂的过滤机制来说,这显得尤为重要[^1]。 #### 使用 slot-scope 创建自定义筛选器 通过 `header-slot` 或者 `filter-method` 属性配合插槽作用域 (`slot-scope`) 可以轻松地为表头添加自定义的筛选控件。下面是一个简单的例子展示如何构建一个带有自定义下拉菜单作为筛选条件的选择框: ```html <template> <vxe-table :data="tableData"> <!-- 定义列 --> <vxe-column field="name" title="Name"></vxe-column> <!-- 带有自定义筛选器的一列 --> <vxe-column field="type" title="Type" :filters="[{text: &#39;Option A&#39;, value: &#39;A&#39;}, {text: &#39;Option B&#39;, value: &#39;B&#39;}]" :filter-render="{name: &#39;CustomFilterDropdown&#39;}"/> </vxe-table> <!-- 自定义筛选模板 --> <template #customFilterDropdown="{ column, $event }"> <div class="custom-filter-dropdown"> <input type="search" placeholder="Search..." @keyup="$event.stopPropagation()" /> <button @click="handleClear(column)">清除</button> <ul> <li v-for="(option, index) in filterOptions" :key="index" :class="{ active: option.value === selectedValue }" @mousedown.prevent.stop="onSelect(option)"> {{ option.text }} </li> </ul> </div> </template> </template> <script setup lang="ts"> import { ref } from &#39;vue&#39;; const tableData = [ // 初始化数据... ]; // 这里假设我们有两个选项用于筛选 const filterOptions = [{ text: "Option A", value: "A" }, { text: "Option B", value: "B" }]; let selectedValue = ref(null); function handleClear(col:any){ col.filters.forEach((item:any)=>{ item.checked=false; }); } function onSelect(option:{value:string}){ selectedValue.value=option.value; } </script> <style scoped> .custom-filter-dropdown { position: absolute; background-color: white; border: 1px solid #ccc; padding: 8px; width: 200px; box-shadow: 0 4px 8px rgba(0,0,0,.1); z-index: 9997 !important; /* 确保下拉层叠顺序正确 */ } .active{ color:red; } </style> ``` 上述代码片段展示了怎样在一个特定字段上应用自定义的筛选界面,并且确保该界面能够响应用户的交互操作,如点击选择项或清空当前选择等动作。同时注意到样式部分设置了 `.custom-filter-dropdown` 类的 `z-index` 来保证其显示层次高于其他页面元素[^2]。 此外,如果遇到需要处理键盘导航的情况,则可能还需要额外绑定相应的按键监听事件以便支持上下箭头浏览以及 Enter 键确认等功能[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值