前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载导读在 rsuite 中InputGroup用于将输入框与按钮、附加元素Addon组合成一个整体控件。本文围绕官方文档 InputGroup 与 Dropdown 组合示例完整拆解如何借助WhisperPopoverDropdown实现一个带货币下拉选择的输入框并对比inside内外两种形态的差异。读完本文你将掌握InputGroup的组件层级、Whisper自定义弹出面板的用法以及如何将下拉菜单无缝嵌入输入框组合中可直接复用到汇率换算、单位选择、搜索筛选等场景。示例总览货币选择输入框该示例实现了一个典型的下拉 输入 附加符号三段式组合左侧按钮显示当前货币代码如CNY并可点击弹出货币列表中间是金额输入框右侧 Addon 显示货币符号如¥。核心代码如下完整示例见 input-group-dropdown.mdimport { InputGroup, Dropdown, Whisper, Popover, Input, VStack, Box } from rsuite; const currencies [ { label: CNY - Chinese Yuan, value: CNY, symbol: ¥, flag: }, { label: USD - US Dollar, value: USD, symbol: $, flag: }, { label: EUR - Euro, value: EUR, symbol: €, flag: }, { label: GBP - British Pound, value: GBP, symbol: £, flag: }, { label: JPY - Japanese Yen, value: JPY, symbol: ¥, flag: } ]; function App() { const [currency, setCurrency] React.useState(currencies[0]); const renderMenu ({ onClose, left, top, className }, ref) { return ( Popover ref{ref} className{className} full Dropdown.Menu {currencies.map(currency ( Dropdown.Item key{currency.value} eventKey{currency.value} onSelect{() { setCurrency(currency); onClose(); }} Box asspan mr{8} {currency.flag} /Box {currency.label} /Dropdown.Item ))} /Dropdown.Menu /Popover ); }; return ( VStack w{300} InputGroup Whisper placementbottomStart triggerclick speaker{renderMenu} InputGroup.Button HStack {currency.value} ArrowDownIcon / /HStack /InputGroup.Button /Whisper Input / InputGroup.Addon{currency.symbol}/InputGroup.Addon /InputGroup InputGroup inside Whisper placementbottomStart triggerclick speaker{renderMenu} InputGroup.Button HStack {currency.value} ArrowDownIcon / /HStack /InputGroup.Button /Whisper Input / InputGroup.Addon{currency.symbol}/InputGroup.Addon /InputGroup /VStack ); } ReactDOM.render(App /, document.getElementById(root));示例同时渲染了两种形态默认带边框分段式与inside按钮内嵌于输入框内部两者共用同一个renderMenu弹出面板方便对比视觉效果。组合结构拆解InputGroup 的组件层级在深入细节前先明确InputGroup的组成。官方组件文档Input 组件页定义了以下三个可组合子组件Input单行文本输入框InputGroup输入框组合容器支持inside、disabled、size等属性InputGroup.Button与输入框组合的按钮继承Button的全部属性InputGroup.Addon自定义附加元素如单位、图标、货币符号。从源码看InputGroup是一个复合组件通过静态属性挂载子组件InputGroup.tsxconst Subcomponents { Addon: InputGroupAddon, Button: InputGroupButton };同时InputGroup通过InputGroupContextInputGroupContext.tsx向子元素下发size与焦点回调const contextValue useMemo( () ({ size, onFocus: handleFocus, onBlur: handleBlur }), [size, handleFocus, handleBlur] );并且InputGroup内部会监听focus/blur通过data-focus属性驱动整个组合的聚焦高亮样式styles/index.scss 中:focus-within规则。因此无论你往组合里塞入 Button、Addon 还是输入框整个组的尺寸、边框、聚焦态都会自动保持一致。在示例中InputGroup内依次排列了三个子节点Whisper包裹的InputGroup.Button货币选择按钮Input金额输入框InputGroup.Addon当前货币符号。InputGroup采用display: flex布局源码中position: relative; display: flex; overflow: hidden;内部 .rs-input会flex: 1 1 auto自动撑满剩余宽度所以三个子节点天然形成按钮 输入 符号的一体化排列无需手动布局。用 Whisper Popover 自定义下拉弹出层示例的核心技巧在于没有使用Dropdown的默认触发器而是用Whisper包裹InputGroup.Button并将Dropdown.Menu放进Popover作为自定义 speaker。Whisper的关键属性triggerclick点击按钮时弹出placementbottomStart面板从按钮左下角对齐展开speaker{renderMenu}渲染弹出内容。当传入函数时函数签名是({ onClose, left, top, className }, ref)即 Whisper 会把定位信息、关闭回调和样式类传给自定义面板相关实现见 Whisper.tsx 中placement、onClose的传递逻辑。const renderMenu ({ onClose, left, top, className }, ref) ( Popover ref{ref} className{className} full Dropdown.Menu {currencies.map(currency ( Dropdown.Item key{currency.value} eventKey{currency.value} onSelect{() { setCurrency(currency); onClose(); }} Box asspan mr{8}{currency.flag}/Box {currency.label} /Dropdown.Item ))} /Dropdown.Menu /Popover );这里有几处值得注意的细节Popover fullfull让 Popover 完全由内容撑开、不做宽度收缩适合菜单这种可变宽度内容className透传必须把 Whisper 传入的className挂到Popover上否则定位/动画相关样式无法生效Dropdown.Menu与Dropdown.Item复用 rsuite 的标准菜单结构与键盘交互eventKey标识选项Dropdown.Item的onSelect中先setCurrency(currency)更新选中值再调用onClose()关闭弹出层实现选择即关闭的下拉行为Box用于内联图标Box asspan mr{8}为国旗 emoji 提供间距等价于spanmargin-right: 8px。两种形态对比普通 InputGroup 与 inside示例下半部分将同样的三段结构放进InputGroup inside这是两种主流视觉形态对比项普通InputGroupinside内嵌按钮/Addon 位置与输入框并列形成分段式边框内嵌在输入框内部视觉上更紧凑样式依据默认分组样式data-insidetrue触发 styles/index.scss 中[data-insidetrue]规则适用场景传统 Bootstrap 风格的分段组合现代搜索框带按钮/单位风格例如搜索、筛选、货币输入从源码看inside模式下按钮和 Addon 会获得透明背景与内边距调整[data-insidetrue] { align-items: center; background-color: var(--rs-input-bg); .rs-input-group-btn { background-color: transparent; margin-inline: var(--rs-input-group-inside-btn-spacing); padding-inline: var(--rs-input-group-inside-btn-padding); } .rs-input-group-addon { background: none; border: none; } }同时inside模式会自动处理输入框两端的内边距当左右存在元素时消除输入框对应侧的 padding保证内容不与内嵌元素重叠源码中padding-inline-start: 0/padding-inline-end: 0规则。InputGroup的data-inside与data-size、data-disabled一样是组件内部用于样式分发的数据属性见 InputGroup.tsx 中的data-inside{inside}。关键 Props 速查表InputGroup属性类型默认值说明asElementType(div)自定义渲染的 HTML 元素classPrefixstring(input-group)CSS 类名前缀disabledboolean组合整体禁用会向子元素传递disabled见 InputGroup.tsx 中React.cloneElement逻辑insideboolean组合内容内嵌模式sizelg | md | sm | xs(md)组合尺寸与 Input 的size对应InputGroup.Button属性类型默认值说明classPrefixstring(input-group-btn)CSS 类名前缀...ButtonProps继承Button全部属性源码中InputGroupButton本质是套用input-group-btn类名的ButtonInputGroupButton.tsx因此appearance、size、onClick等按钮属性均可直接使用。InputGroup.Addon属性类型默认值说明asElementType(span)自定义渲染的 HTML 元素classPrefixstring(input-group-addon)CSS 类名前缀disabledbooleanAddon 单独禁用态InputGroupAddon.tsxWhisper 关键属性本示例用到属性值说明triggerclick触发方式点击弹出placementbottomStart弹出面板对齐位置speaker组件或({ onClose, left, top, className }, ref) ReactNode弹出内容函数形式可接收定位与关闭回调数据流与关闭逻辑整个示例的状态管理非常简单currency作为唯一状态保存在App中通过useState初始化第一个货币CNY。选择流程如下用户点击InputGroup.ButtonWhisper 触发speaker渲染PopoverDropdown.Menu用户点击某个Dropdown.Item触发onSelectsetCurrency(currency)更新按钮文本currency.value与右侧 Addon 符号currency.symbolonClose()关闭弹出层。由于按钮、输入框和 Addon 都在同一个InputGroup内状态更新后三段内容会同步刷新呈现货币代码 → 输入金额 → 货币符号的完整语义。测试与样式佐证仓库为InputGroup提供了组件级测试InputGroup.test.tsx、InputGroup.spec.tsx与样式级测试InputGroup.styles.spec.tsx测试中还演示了InputGroup.Addon通过aslabel与htmlFor配合原生input的用法说明 Addon 支持自定义元素类型可用于无障碍标签场景InputGroup InputGroup.Addon aslabel htmlForinput/InputGroup.Addon input idinput / /InputGroup样式层面styles/index.scss 定义了 xs/sm/md/lg 四档尺寸变量通过data-size选择、聚焦态focus-ring 边框高亮、禁用态data-disabledtrue时灰底 cursor: not-allowed以及子组件去边框规则.rs-input、.rs-input-group-btn、.rs-input-group-addon均移除自身边框与圆角这些保证了无论组合里放多少个元素整体始终呈现为一个圆角统一的控件。扩展思路基于该组合模式可以轻松演变出更多交互单位选择输入把货币列表换成kg / lb、px / rem等单位右侧 Addon 显示对应单位搜索筛选左侧用Dropdown切换搜索范围如全部 / 标题 / 作者中间输入关键词右侧 Addon 放搜索图标配合inside形态即为典型搜索框受控外部菜单如果希望菜单内容由父级动态控制可将Dropdown.Menu替换为自定义列表只要保留onClose与定位参数的传递即可多列/分组菜单利用Dropdown.Menu支持的分组与Dropdown.Item的disabled等属性可构建更复杂的选项面板。需要注意的是Dropdown的默认触发器DropdownToggle并不适合直接嵌入InputGroup官方示例选择的Whisper 手动触发 自定义 speaker方案正是为了让弹出层与输入组合共用定位与关闭机制这是本模式最值得复用的设计点。总结通过本文可以确认InputGroup是 rsuite 中一个组合即结构的容器组件其Button/Addon子组件与 Context 机制保证了多元素组合的尺寸与状态同步而Whisper Popover Dropdown.Menu的组合方案则为InputGroup注入了灵活的下拉能力。理解inside属性与data-*样式分发机制后你可以在 Input 文档 所列 Props 的基础上自由搭建出符合业务需求的分段式或内嵌式组合输入控件。赞分享前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载相关推荐RSUITE Dropdown 菜单项进阶icon、shortcut 与 description 的组合实战RSUITE Dropdown 菜单项进阶icon、shortcut 与 description 的组合实战 本篇技术指南围绕 rsuite 官方文档中的 D前端UI组件RSUITE AutoComplete 与 InputGroup 组合实战构建带搜索按钮与前后缀图标的自动补全输入框RSUITE AutoComplete 与 InputGroup 组合实战构建带搜索按钮与前后缀图标的自动补全输入框 AutoComplete 是 RSUIT前端UI组件Ant Design Dropdown 按钮式下拉菜单Button with dropdown menu组合实战指南Ant Design Dropdown 按钮式下拉菜单Button with dropdown menu组合实战指南 本指南围绕 ant design 官方前端UI组件设计系统上一篇一行配置跑起定时任务Serverless Examples Cron调度示例从入门到避坑指南下一篇终极方案Windows与iPhone文件传输一个免费工具搞定互传和剪贴板同步创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考