ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ant Design Select 多选模式下隐藏已选选项:受控数据过滤实现指南

Ant Design Select 多选模式下隐藏已选选项:受控数据过滤实现指南 Ant Design Select 多选模式下隐藏已选选项受控数据过滤实现指南【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design导读在 Ant Designantd的Select多选场景中当选项数量较多时已选中的条目继续停留在下拉列表中会造成视觉噪音也容易让用户误以为可以重复选择。本指南以 antd 官方演示hide-selected为骨架讲解如何通过受控 value options 动态过滤这一通用模式让下拉列表自动隐藏已选中的选项并深入组件源码与官方 API帮助你在真实项目中直接落地这一交互。一、这个功能要解决什么问题Ant Design 官方将该演示描述为zh-CN隐藏下拉列表中已选择的选项。en-USHide already selected options in the dropdown.对应源码位于 hide-selected.tsx官方文档索引见 hide-selected.md并在 Select 官方文档 的代码演示区以隐藏已选择选项命名对应code src./demo/hide-selected.tsx。它的适用场景非常典型选项数量较多用户已经选过的项无需再次出现避免重复选择交互上希望选一个、少一个让剩余可选范围一目了然需要完全掌握选中状态配合表单或业务逻辑做二次加工。二、完整实现数据驱动的边选边删整个演示的实现不依赖任何内置开关而是基于Select的受控多选模式与options 数据过滤。核心代码如下import React, { useState } from react; import { Select } from antd; const OPTIONS [Apples, Nails, Bananas, Helicopters]; const App: React.FC () { const [selectedItems, setSelectedItems] useStatestring[]([]); const filteredOptions OPTIONS.filter((o) !selectedItems.includes(o)); return ( Select modemultiple placeholderInserted are removed value{selectedItems} onChange{setSelectedItems} style{{ width: 100% }} options{filteredOptions.map((item) ({ value: item, label: item, }))} / ); }; export default App;逐步拆解静态选项源OPTIONS定义一份字符串数组作为全量候选集后续所有过滤都基于它进行。受控状态selectedItems通过useStatestring[]([])维护当前选中的值数组。value{selectedItems}将Select完全交给 React 状态驱动这是本模式成立的前提。过滤出剩余可选项OPTIONS.filter((o) !selectedItems.includes(o))每次渲染时剔除已被选中的项得到剩余候选。动态生成options将过滤结果映射为{ value, label }结构传给options属性下拉列表因此天然不包含已选项。状态回写onChange{setSelectedItems}直接把新选中值写回状态形成闭环选中 → 状态更新 → 选项重算 → 已选项消失。当用户选完所有选项后filteredOptions为空数组下拉列表将显示notFoundContent默认Not Found符合全部选完的预期。三、为什么用options而非Select.Option子元素在 5.11.0 版本之后Ant Design 推荐使用options属性以数据化方式配置选项内容官方说明指出相比 jsx 定义会获得更好的渲染性能开发者不再需要自行拼接 JSX。旧的写法Select.Option在 5.x 中仍可使用但会收到控制台警告并计划在 6.0 移除。本演示采用options{filteredOptions.map(...)}的新写法将过滤后的数组直接映射成{ value, label }正是官方推荐的数据驱动范式详见 Select 组件入口。四、源码层面的支撑多选模式与受控值从 Select 组件入口 的源码可以看到几个与本功能直接相关的实现细节多选判定const isMultiple mode multiple || mode tags;见 index.tsxmodemultiple会开启多选渲染、tag 展示与多值回调逻辑受控 valuevalue属性被透传给底层 rc-select多选时要求为数组类型。官方 API 文档特别提醒value 数组引用未变化时Select 不会更新见 index.zh-CN.md。这正是本演示必须每次重新filter生成新数组的原因——通过useState更新状态触发重渲染保证下拉选项与选中态始终同步onChange 回调官方定义为选中 option或 input 的 value 变化时调用此函数多选模式下首参即新的选中值数组因此onChange{setSelectedItems}可以直接作为 setState 使用。此外该演示已被纳入组件的快照测试renders components/select/demo/hide-selected.tsx correctly见 demo.test.tsx.snap渲染结果中可见ant-select-multiple类名与Inserted are removed占位符说明官方持续维护此示例的正确性。五、常用 API 参数速查隐藏已选方案相关围绕隐藏已选选项这一交互你通常会涉及以下Select属性均取自 Select 官方文档 的 API 表格参数说明类型默认值mode设置 Select 的模式为多选或标签multiple|tags-options数据化配置选项内容相比 jsx 定义会获得更好的渲染性能{ label, value }[]-value指定当前选中的条目多选时为一个数组string[]|number[]等-onChange选中 option 或 input 值变化时调用function(value, option)-placeholder选择框默认文本string-allowClear自定义清除按钮boolean |{ clearIcon? }falsemaxCount指定可选中的最多 items 数量仅multiple/tags生效number-5.13.0maxTagCount最多显示多少个 tagresponsive为响应式number |responsive-showSearch是否可搜索boolean多选默认 truenotFoundContent下拉列表为空时显示的内容ReactNodeNot Found需要特别说明的是hide-selected模式中移除已选项完全由业务侧通过过滤options实现Select本身没有hideSelected之类的开关属性同理modetags下新输入的标签也会自动进入选中值数组因此该过滤模式同样适用若希望限制选中数量可配合maxCount其在源码中仅在多选/标签模式下透传见 index.tsx。六、实战扩展在更多场景中复用同一模式1. 单选场景隐藏已选项将状态改为单一值过滤逻辑保持一致const [selected, setSelected] useStatestring | undefined(); const filteredOptions OPTIONS.filter((o) o ! selected); Select value{selected} onChange{setSelected} options{filteredOptions.map((item) ({ value: item, label: item }))} /2. 保留已选标签不消失默认实现中已选项从下拉列表移除但仍以 tag 形式显示在选择框中这也是Inserted are removed占位符的含义选中的项被移除出候选列表。若你希望已选项既不出现在下拉中、又不在选择框中显示 tag可以进一步结合tagRender或自定义展示组件来实现注意不要在过滤时把已选项从value中剔除否则会破坏受控回显。3. 关联多个 Select联动同一模式天然支持联动例如城市与区县两个 Select前者选中后后者的options即可通过filter排除被选中的城市实现已选即隐藏的多级联动效果这也是官方 联动 democoordinate 背后的通用思路。4. 与labelInValue配合若业务需要同时获取选中项的文本与值可开启labelInValue此时value与onChange首参均为{ value, label }结构过滤条件需相应改为按item.value比较const filtered OPTIONS.filter((o) !selectedItems.some((s) s.value o));七、注意事项保持 value 引用更新受控模式下每次状态变化都必须产生新的数组引用直接原地push再赋值不会触发Select更新空列表兜底全部选完后options为空可借助notFoundContent给出更友好的提示如已全部选择表单场景该模式与Form的namevaluePropName组合使用时注意value与onChange的受控传递方式避免表单值与本地 state 双重管理产生冲突性能选项规模极大时可先对OPTIONS建立索引如Map/Set再过滤避免includes的 O(n²) 开销。总结隐藏已选选项并不是Select的一个内置属性而是一个由官方演示沉淀下来的、基于受控组件 options 数据过滤的通用实现范式用useState持有选中值每次渲染时从全量候选中剔除已选项再交给options渲染。掌握了这一模式你可以轻松扩展到单选、标签模式、联动选择、labelInValue取值等各类业务场景配合 Select 官方文档 中的 API 参数即可灵活组合出符合产品需求的交互。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表