软件教程 2025年08月6日
0 收藏 0 点赞 185 浏览 2859 个字
摘要 :

最近在被安排去做前端开发,由于下拉框中的数据可能太多,滚动一个个翻着来查找影响效率,因此需要实现下拉框带有根据输入进行筛选的功能,由于本项目是用ant design开发……

最近在被安排去做前端开发,由于下拉框中的数据可能太多,滚动一个个翻着来查找影响效率,因此需要实现下拉框带有根据输入进行筛选的功能,由于本项目是用ant design开发的,而antd官网上针对下拉框Select组件也有此功能的实现,具体代码案例如下:

<template>
  <a-select
    show-search
    placeholder="Select a person"
    option-filter-prop="children"
    style="width: 200px"
    :filter-option="filterOption"
    @focus="handleFocus"
    @blur="handleBlur"
    @change="handleChange"
  >
    <a-select-option value="jack">
      Jack
    </a-select-option>
    <a-select-option value="lucy">
      Lucy
    </a-select-option>
    <a-select-option value="tom">
      Tom
    </a-select-option>
  </a-select>
</template>
<script>
export default {
  methods: {
    handleChange(value) {
      console.log(`selected ${value}`);
    },
    handleBlur() {
      console.log('blur');
    },
    handleFocus() {
      console.log('focus');
    },
    filterOption(input, option) {
      return (
        option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
      );
    },
  },
};
</script>

以上代码的重点就在于第3、5、7行和第35~39行,第3、5、7行使下拉框支持搜索功能,第35~39行通过filterOption指定一个方法来实现筛选的规则,具体的效果实现也可直接去官网案例去体验下:访问官网案例

虽说官网上有案例,但在我们项目中使用却没有那么顺利,首先我们项目中的原先项目代码如下:

<a-select placeholder="全部" v-model:value="formState.llcsSysType" :getPopupContainer="(triggerNode) => triggerNode.parentNode">
    <a-select-option v-model:value="item.roleCode" v-for="(item, index) in roleArr" :key="index">
        {{ item.roleName }}
    </a-select-option>
</a-select>

当我参考官网案例直接在a-select标签上新增show-searchoption-filter-prop=\"children\"filterOption,具体如下(按理来说和官网一样应该没问题,但也可能会有问题,比如我这里就出了问题):

// 标签上新增showSearch、option-filter-prop="children"和filterOption
<a-select placeholder="全部" v-model:value="formState.llcsSysType" :getPopupContainer="(triggerNode) => triggerNode.parentNode" show-search option-filter-prop="children" :filterOption="filterOption">
    <a-select-option v-model:value="item.roleCode" v-for="(item, index) in roleArr" :key="index">
        {{ item.roleName }}
    </a-select-option>
</a-select>
// filterOption定义成一个方法单独拿出来方便复用
methods: {
    filterOption(input, option) => {
        return  option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
    };
}

操作时发现始终提示Uncaught (in promise) TypeError: Cannot read property \'children\' of undefine
antd实现select下拉框带有搜索筛选功能报错option.children.toLowerCase is not a function
经过调试发现,我打印了下option发现它根本没有componentOptions属性并展开看了一下,这时我猜想可能是antd版本的问题,而我想要的数据竟然还在children数组的第一个元素的children属性中:
antd实现select下拉框带有搜索筛选功能报错option.children.toLowerCase is not a function
那么问题就清晰了,根据实际结构,我此处完整的修改如下:

// 标签上新增showSearch和filterOption
<a-select placeholder="全部" v-model:value="formState.llcsSysType" :getPopupContainer="(triggerNode) => triggerNode.parentNode" show-search  option-filter-prop="children" :filterOption="filterOption">
    <a-select-option v-model:value="item.roleCode" v-for="(item, index) in roleArr" :key="index">
        {{ item.roleName }}
    </a-select-option>
</a-select>
// filterOption定义成一个方法单独拿出来方便复用
methods: {
    filterOption(input, option) => {
        // 重点在这
        return  option.children[0].children.toLowerCase().indexOf(input.toLowerCase()) >= 0
    };
}

提示:option-filter-prop=”children”也可以去掉,不影响搜索

到此,问题解决,能实现和官方案例一样的效果,但是这也暴露出来一个问题,就是我们项目中的filterOption中的参数option和官网案例中的option不是一个东西,从结构上看官网案例中的option应该是我们项目里的option.children[0],这也可能是我们项目引用的时候和官网的有所差异导致的,也有网上说是因为我们option中的内容前后带有空格导致其变成了数组,但潘老师也未能证实,不过好在最终还是解决了,完美!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6048.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

269
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

107
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

683
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

338
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

371
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

843
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号