实战指南:自由输入、自动分词与自定义标签渲染)
Ant Design Select 标签模式tags实战指南自由输入、自动分词与自定义标签渲染【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design导读Ant Design 的 Select 组件提供了modetags标签模式让用户既可以从预设的options中挑选也可以像输入框一样自由键入任意内容作为标签。本文以仓库中 tags 示例 为骨架结合源码与相邻示例系统讲解标签模式的核心配置、自动分词、自定义标签渲染、数量限制与常见坑位帮助你从会用进阶到用得精准。一、从示例认识标签模式仓库中的 tags.md 文档描述极其精简标签形式的多选框用户亦可自由输入。Allow user to select tags from list or input custom tag.它对应的可运行示例位于 components/select/demo/tags.tsx核心代码只有短短几行import React from react; import { Select } from antd; import type { SelectProps } from antd; const options: SelectProps[options] []; for (let i 10; i 36; i) { options.push({ value: i.toString(36) i, label: i.toString(36) i, }); } const handleChange (value: string) { console.log(selected ${value}); }; const App: React.FC () ( Select modetags style{{ width: 100% }} placeholderTags Mode onChange{handleChange} options{options} / ); export default App;这段代码演示了标签模式的两个核心特性可从下拉列表选择options通过i.toString(36) i生成了从aa到zz即十进制 10~35 对应的 36 进制表示的一组标签用户点击即可选中可自由输入输入框内键入任意文本并回车该文本会直接成为一个新的 tag即使它不在options中。onChange接收当前全部已选值数组示例中仅打印到控制台实际项目中通常用于同步表单状态。标签模式与多选模式的区别在 Select 组件入口源码 中mode的类型被定义为mode?: multiple | tags;multiple与tags的区别在于multiple只能选择options中已有的条目而tags允许输入options之外的新条目。源码中isMultiple mode multiple || mode tagsindex.tsx说明二者共享同一套多选渲染、图标与交互逻辑仅是否允许自定义条目这一点不同。因此 tags 文档 中标签形式的多选框用户亦可自由输入正是对二者差异最准确的概括。二、让输入更顺滑tokenSeparators 自动分词标签模式与输入框最大的差异在于粘贴。用户在标签模式下粘贴一段以逗号分隔的文本时如果每次只能形成一个 tag体验会非常割裂。仓库中的 automatic-tokenization 示例 专门演示了这一点试下复制露西,杰克并粘贴到输入框里。只在 tags 和 multiple 模式下可用。对应的实现见 automatic-tokenization.tsx关键差异只在tags.tsx基础上多了一行Select modetags style{{ width: 100% }} onChange{handleChange} tokenSeparators{[,]} options{options} /tokenSeparators的官方定义为自动分词的分隔符仅在modetags时生效类型为string[]见 index.zh-CN.md 中的 API 表格。行为如下用户在输入框中粘贴露西,杰克英文逗号分隔时会被自动拆分成露西与杰克两个独立 tag支持传入多个分隔符例如tokenSeparators{[,, , ;]}可同时兼容英文逗号、中文逗号和分号请注意其生效条件是粘贴输入逐个字符键入时并不触发分词。如果你希望连输入过程中键入分隔符也能即时切分而不是依赖粘贴可以使用onInputKeyDown或onKeyDown自行监听回车与分隔符键将当前输入值推入已选列表——这是tokenSeparators之外的常见进阶做法。三、自定义标签外观tagRender标签模式默认渲染为 Ant Design 内置的 tag 样式。当业务需要品牌化标签例如按值着色、带图标、圆角定制时可使用tagRender完全接管渲染。仓库中的 custom-tag-render 示例描述为允许自定义选择标签的样式 / Allows for custom rendering of tags给出了完整实现import React from react; import { Select, Tag } from antd; import type { SelectProps } from antd; type TagRender SelectProps[tagRender]; const options: SelectProps[options] [ { value: gold }, { value: lime }, { value: green }, { value: cyan }, ]; const tagRender: TagRender (props) { const { label, value, closable, onClose } props; const onPreventMouseDown (event: React.MouseEventHTMLSpanElement) { event.preventDefault(); event.stopPropagation(); }; return ( Tag color{value} onMouseDown{onPreventMouseDown} closable{closable} onClose{onClose} style{{ marginInlineEnd: 4 }} {label} /Tag ); }; const App: React.FC () ( Select modemultiple tagRender{tagRender} defaultValue{[gold, cyan]} style{{ width: 100% }} options{options} / ); export default App;要点拆解回调参数tagRender接收一个对象包含label标签文案、value标签值、closable是否可关闭、onClose关闭回调等字段。这里利用value直接作为Tag的color实现了标签颜色随值变化的效果onPreventMouseDown阻止mousedown事件冒泡避免点击标签时意外触发 Select 的展开/收起等默认行为这是自定义 tag 渲染时最容易遗漏的细节closable与onClose必须透传给自定义渲染内容否则标签将无法被用户删除适用范围根据 index.tsx 的源码tagRender仅在isMultiple即multiple或tags模式下才会传递给底层rc-select单选模式传入会被忽略。四、配套能力maxCount 与 maxTagCount标签模式在真实业务中最常见的两个配套需求是限制数量与限制展示官方 API 表格见 index.zh-CN.md给出如下定义参数说明类型默认值版本maxCount指定可选中的最多 items 数量仅在mode为multiple或tags时生效number-5.13.0maxTagCount最多显示多少个 tag响应式模式会对性能产生损耗number |responsive-responsive: 4.10maxTagPlaceholder隐藏 tag 时显示的内容ReactNode | function(omittedValues)--maxTagTextLength最大显示的 tag 文本长度number--maxCount是硬性上限一旦达到用户无法再新增任何 tag。源码中有对应的防御逻辑index.tsx 会在非多选/标签模式下使用maxCount时输出警告maxCountonly works with mode multiple or tags且该警告被 index.test.tsx 的测试用例所覆盖验证maxTagCount只是展示层折叠已选数量超过限制后多出的 tag 会被折叠为N形式或自定义的maxTagPlaceholder但值依然完整保留在value中不影响提交maxTagTextLength则用于截断单个超长 tag 的展示文本。五、标签模式的常见坑位官方文档 FAQindex.zh-CN.md记录了标签模式最典型的一个问题modetags模式下为何搜索有时会出现两个相同选项原因当options中某个条目的label与value不一致时搜索过滤默认基于value匹配而选中的 tag 展示基于label导致过滤结果中出现看起来相同的重复项。解决办法是设置optionFilterProplabel让过滤基于展示文本进行。除此之外还有两个常见注意事项标签值必须是字符串或数字value的类型被约束为string | number见 index.tsx 的RawValue定义对象等复杂值无法直接作为标签值使用多选值必须通过数组传递value在标签/多选模式下是一个数组官方 API 表格中明确value多选时为数组直接传字符串会导致受控状态异常。结语标签模式是 Ant Design Select 中输入与选择融合的代表性能力。通过modetags获得自由输入配合tokenSeparators提升粘贴效率、tagRender定制视觉、maxCount/maxTagCount控制数量与展示即可覆盖从轻量打标到复杂标签管理的大多数场景。想进一步研究底层实现可以阅读 Select 入口源码、组件 API 文档 以及 组件测试想查看更多实战组合Select 演示目录 下的 automatic-tokenization.tsx 与 custom-tag-render.tsx 都是可直接借鉴的范例。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考