闭坑-- `a-auto-complete` 组件中的 `options` 数据存在重复
当 ant-design 的 a-auto-complete 组件中的 options 数据存在重复时,可能会导致以下问题:

1. 交互问题
- 键盘导航失效:
使用键盘上下键选择时,可能会在重复项之间跳转,无法正常移动到下一个选项。 - 选择结果不准确:
选择重复项时,可能无法正确触发@select事件,或返回错误的值。 
2. 数据绑定问题
- 表单值混乱:
如果重复的value绑定到表单字段(如v-model),可能导致表单提交错误的数据。 - 选项匹配错误:
组件内部通过value匹配选项时,可能选中第一个匹配项而非用户实际选择的项。 
3. 性能问题
- 冗余渲染:
重复数据会导致不必要的 DOM 渲染,降低性能(尤其在长列表中)。 
4. 用户体验问题
- 视觉干扰:
重复选项会让用户困惑,降低信任感。 - 搜索建议无效:
输入时弹出的建议列表出现重复项,干扰用户决策。 
问题复现场景
假设接口返回以下重复数据:
options.value = [{ label: '123', value: '公司A' }, { label: '123', value: '公司A' } // 重复项
];
 
用户操作时:
- 输入关键词搜索,下拉列表显示两个相同的“公司A”。
 - 用键盘选择第二个“公司A”时,可能实际选中第一个。
 - 提交表单时,可能传递错误的数据(如 
label重复导致税号错误)。 
解决方案
1. 数据去重
在赋值 options 前,对接口返回的数据去重:
// 方法1: 使用 Set 去重 (根据唯一键如 label+value)
const uniqueData = Array.from(new Set(data.map(item => JSON.stringify({ label: item.comCode, value: item.comName })))
).map(str => JSON.parse(str));// 方法2: 使用 lodash 的 uniqBy (按特定字段去重)
import { uniqBy } from 'lodash';
options.value = uniqBy(data, 'comCode');
 
2. 防抖优化请求
避免频繁触发接口导致数据重复加载:
import { debounce } from 'lodash';const getOptions = debounce(async (value) => {if (!value) return;const { data } = await queryOptions({ searchName: value });options.value = uniqBy(data, 'comCode');
}, 300); // 300ms防抖
 
3. 检查组件配置
- 确保 
a-auto-complete的filterOption逻辑正确:<a-auto-complete:filterOption="(inputValue, option) => option.value.toLowerCase().includes(inputValue.toLowerCase())" /> - 如果使用远程搜索 (
@search),避免在@change中重复触发请求。 
4. 后端配合
确保接口返回的数据本身去重,减少前端处理成本。
总结
| 问题类型 | 后果 | 解决方案 | 
|---|---|---|
| 交互异常 | 键盘导航/选择失效 | 数据去重 + 防抖 | 
| 数据绑定错误 | 表单提交错误值 | 确保 value 唯一性 | 
| 性能下降 | 渲染卡顿 | 减少重复数据 | 
| 用户体验差 | 用户困惑/不信任 | 显示唯一且清晰的选项 | 
通过数据去重和优化请求逻辑,可以彻底解决重复项问题。
