pro-components icon indicating copy to clipboard operation
pro-components copied to clipboard

🐛[BUG] ProFormSelect + request 模糊搜索无法根据 value 匹配的问题

Open chenyajun-create opened this issue 5 months ago • 3 comments

🐛 bug 描述

在使用ProFormSelect 组件配合 request 属性进行模糊搜索时,搜索功能只能根据 label 进行匹配,无法根据 value进行匹配。这导致当用户输入的是数据的实际值(value)而非显示标签(label)时,无法正确搜索到对应的选项。

📷 复现步骤

创建一个 ProFormSelect 组件,配置 request 属性进行异步数据加载 设置 showSearch={true} 启用搜索功能 3.返回的数据格式为 [{label: '张三', value:'zhangsan'}, {label: '李四', value: 'lisi'}] 在搜索框中输入 'zhangsan'(value值) 观察搜索结果

🏞 期望结果

期望:能搜索到 "张三" 这个选项 实际:无搜索结果,只有输入 "张三"(label值)才能搜索到

💻 复现代码

import { ProForm, ProFormSelect } from '@ant-design/pro-components';

const Demo = () => {
  const requestOptions = async (params) => {
    // 模拟异步请求
    const mockData = [
      { label: '张三', value: 'zhangsan' },
      { label: '李四', value: 'lisi' },
      { label: '王五', value: 'wangwu' },
    ];
    
    // 当前只能根据 label 进行过滤
    const filteredData = mockData.filter(item => 
      item.label.includes(params.keyWords || '')
    );return {
      data: filteredData,
      success: true,
    };
  };

  return (
    <ProForm>
      <ProFormSelect
        name="user"
        label="用户选择"
        showSearch
        request={requestOptions}placeholder="请选择用户(尝试输入 'zhangsan' 或 '张三')"
      />
    </ProForm>);
};

export default Demo;

© 版本信息

  • ProComponents 版本: [2.8.10]

chenyajun-create avatar Aug 08 '25 07:08 chenyajun-create

Hi @chenyajun-create! I'm Dosu and I’m helping the pro-components team.

你的反馈是对的:ProFormSelect 配合 request 时,模糊搜索默认只会匹配 label,不会匹配 value,这确实是历史遗留问题。近期已经有 PR 修复了这个问题(#9162,2025-07-17 合并),现在 showSearch 下会同时匹配 label 和 value,且支持通过 optionFilterProp 配置匹配字段,相关代码已合入新版本详情见此 PR

如果你用的 2.8.10 版本是在 2025-07-17 之后发布的,理论上已经支持 value 匹配。如果你的版本还没包含这个修复,可以用如下方式临时解决:

  1. 在 request 里自定义过滤逻辑,让 label 和 value 都能被匹配:
const requestOptions = async (params) => {
  const mockData = [
    { label: '张三', value: 'zhangsan' },
    { label: '李四', value: 'lisi' },
    { label: '王五', value: 'wangwu' },
  ];
  const key = params.keyWords || '';
  const filteredData = mockData.filter(
    item => item.label.includes(key) || item.value.includes(key)
  );
  return { data: filteredData, success: true };
};
  1. 加上 fieldProps={{ filterOption: false }},让 request 结果不再被前端二次过滤,完全由你自定义过滤逻辑控制。相关讨论

升级到包含 #9162 修复的版本后,直接用 showSearch 即可支持 label 和 value 同时模糊匹配,无需额外处理。

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other  Chat with Dosu Join Discord Share on X

dosubot[bot] avatar Aug 08 '25 07:08 dosubot[bot]

我们是2025-07-24,仍存在这个问题,最后的解决办法是增加这个配置 fieldProps={{ filterOption: (input, option) => { return (option?.label ?? '').toString().includes(input) || (option?.value ?? '').toString().includes(input); }, }}

chenyajun-create avatar Aug 08 '25 08:08 chenyajun-create

我们之前使用2.8.7在线上运行一直没有问题,上次发布更新了2.8.10之后才出现这个问题的。

chenyajun-create avatar Aug 08 '25 08:08 chenyajun-create