
前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载导读在 React UI 组件库 rsuite 中Input输入框提供了disabled禁用、readOnly只读和plaintext纯文本三种互不相同的状态属性用于应对表单校验、只读展示、详情预览等不同业务场景。本文以官方文档中的 disabled 示例 为核心骨架结合 Input 源码、InputBase 底层实现 与样式定义逐一拆解三种状态的语义差异、组合用法与底层原理帮助你准确选择正确的状态写出更严谨的表单交互。三种状态的核心区别rsuite 的Input组件以及承载它的InputGroup组合组件提供了三个语义完全不同的布尔属性属性视觉表现能否获得焦点值能否被修改常见业务场景disabled灰化背景与文字变为禁用色不能不能表单尚未满足条件、提交中、权限不足readOnly与正常输入框一致可以不能可选中、可复制展示已提交的数据、配合复制操作plaintext完全去掉边框与背景渲染为纯文本无输入框形态不能详情页、审批流的只读回显其中最容易混淆的是disabled与readOnly前者连焦点都拿不到文本也无法选中复制后者仍然是一个活的输入框用户可以把光标放进去、选中全部文本并复制只是不能修改内容。而plaintext则从根本上改变了组件形态——它不再渲染input而是渲染一段文本节点。官方示例一行代码看清三种状态文档中 disabled.md 给出的示例非常直观它在一个VStack中纵向排列三组输入第一组同时演示了单独的Input与InputGroup的禁用效果后两组分别演示readOnly与plaintextimport { Input, InputGroup, VStack, HStack, Text, Divider } from rsuite; import SearchIcon from rsuite/icons/Search; const App () ( VStack divider{Divider /} HStack Text muted w{80}Disabled/Text Input disabled valueDisabled input w{200} / InputGroup disabled w{200} Input valueDisabled input group / InputGroup.Addon SearchIcon / /InputGroup.Addon /InputGroup /HStack HStack Text muted w{80}ReadOnly/Text Input readOnly valueRead only input w{200} / /HStack HStack Text muted w{80}Plaintext/Text Input plaintext valuePlaintext input w{200} / /HStack /VStack ); ReactDOM.render(App /, document.getElementById(root));这段示例中有几个值得注意的细节Text组件带muted属性作为左侧状态标签w{80}与w{200}分别是 rsuite Box 体系提供的宽度简写VStack配合divider{Divider /}在每两行之间插入分隔线这是 rsuite 布局组件 Stack 系列的典型用法禁用状态同时作用在InputGroup上而不仅是单个Input——这是接下来要重点展开的内容。单独禁用 InputHTML 原生语义的直接透传单个输入框的禁用最简单只需在Input上设置disabledInput disabled valueDisabled input w{200} /在源码层面Input是一个很薄的封装Input.tsx 把disabled等其余属性原样透传给底层的InputBaseInputBase最终渲染为原生input disabled元素// src/Input/Input.tsx 中的透传 return ( InputBase asinput ref{ref} classPrefix{classPrefix} size{size} type{type} inputProps{{ size: htmlSize }} {...rest} / );在 InputBase.tsx 中有一个关键逻辑——inputable !disabled !readOnly它决定了事件处理器是否挂载const inputable !disabled !readOnly; if (inputable) { eventProps.onChange handleChange; eventProps.onKeyDown handleKeyDown; eventProps.onFocus createChainedFunction(onFocus, inputGroup?.onFocus); eventProps.onBlur createChainedFunction(onBlur, inputGroup?.onBlur); }也就是说一旦设置了disabled或readOnlyonChange、onKeyDown等交互回调都不会被绑定配合原生属性的行为从根本上杜绝了输入修改。测试用例也验证了这一点在 Input.spec.tsx 中onChange只有在正常输入框中触发fireEvent.change才会被调用。样式层面Input 的 mixin 定义了禁用态的外观:disabled { background-color: var(--rs-input-disabled-bg); color: var(--rs-text-disabled); }禁用输入框使用--rs-input-disabled-bg背景与--rs-text-disabled文字颜色视觉上一眼可辨。禁用整个 InputGroup一条属性自动透传全体子组件文档示例的第二组演示了组合场景——把disabled设置在容器组件InputGroup上让内部的输入框与附加元素Addon整体进入禁用态InputGroup disabled w{200} Input valueDisabled input group / InputGroup.Addon SearchIcon / /InputGroup.Addon /InputGroup这种一条属性管一组的能力来自 InputGroup.tsx 的实现const inputGroupChildren useMemo(() { return React.Children.map(children, item { if (React.isValidElement(item)) { // Fix: Add type assertion to pass the disabled prop to the child element return disabled ? React.cloneElement(item, { disabled } as { disabled?: boolean }) : item; } return item; }); }, [children, disabled]);核心机制是当InputGroup的disabled为真时通过React.cloneElement遍历子元素并强制注入disabled属性——这解释了为什么文档示例中InputGroup内部的Input无需单独写disabled也能生效。同时InputGroup还通过 Context 向下传递size与焦点回调并把disabled、inside等信息输出为data-disabled、data-inside等数据属性供样式选择器使用Box {...rest} ref{ref} className{classes} >.rs-input-group[data-disabledtrue] { background-color: var(--rs-input-disabled-bg); color: var(--rs-text-disabled); cursor: not-allowed; .rs-input, .rs-input-group-btn, .rs-input-group-addon { color: inherit; } }容器整体灰化、光标变为not-allowed内部输入框、按钮InputGroup.Button与附加元素InputGroup.Addon的文字颜色统一继承禁用色形成一个完整的禁用组合框视觉单元。需要留意的是InputGroup的disabled会通过 cloneElement 强加给所有直接子元素因此不要把disabled与需要保持可交互的子组件混放在同一个 InputGroup 中。另外InputGroup.Addon本身也接受独立的disabled属性见 InputGroupAddon.tsxInputGroup.Button则直接包装Button组件并继承其全部属性见 InputGroupButton.tsx可实现更精细的控制。readOnly可复制、不可修改第三种场景是看得见、选得中、改不了文档示例Input readOnly valueRead only input w{200} /从 InputBase.tsx 可以看到readOnly与disabled一样会被排除在inputable之外因此onChange等回调同样不会绑定。但它渲染的是原生readOnly属性而非disabled属性见 InputBase.tsx 中对disabled、readOnly的分别透传因此输入框外观保持正常不灰化用户可以点击输入框、移动光标、全选并复制文本用户无法键入或修改内容。这是一个常被忽视却很实用的差异在提交成功后的回显或分享只读数据场景中readOnly比disabled更友好因为它保留了文本的可复制性而disabled的输入框在很多浏览器中连文本选中都做不到。plaintext从输入框退化为纯文本plaintext是 rsuite 非常有特色的一个属性它不是禁用的输入框而是直接把组件渲染成一段无边框、无背景的文本Input plaintext valuePlaintext input w{200} /在 InputBase.tsx 中plaintext的优先级最高一旦设置就直接短路渲染为Plaintext组件根本不会创建input// Make the component display in plain text, // and display default characters when there is no value. if (plaintext) { return ( Plaintext ref{ref} localeKeyunfilled placeholder{placeholder} {typeof value undefined ? defaultValue : value} /Plaintext ); }Plaintext 组件 渲染的是一个带roletext的Box并增加empty样式类。它特别适用于表单详情展示填写时是输入框详情页里同一份数据切到plaintext就变成了干净的文本行与表格、描述列表的观感统一。值得强调的是空值行为当value为undefined且没有defaultValue时Plaintext会显示占位文案。占位文案取自国际化配置localeKeyunfilled例如 英文语言包 中是Unfilled中文语言包 中是未填写并且 rsuite 为 全部 30 语言 都提供了对应翻译。如果不想显示默认文案可以显式传入placeholder覆盖。三种状态的属性对照与选型建议结合 Input 官方文档 Props 表 与源码三者的完整语义可归纳如下属性类型默认值底层行为disabledboolean无透传原生disabled不绑定事件回调样式灰化readOnlyboolean无透传原生readOnly不绑定事件回调外观不变plaintextboolean无短路渲染为Plaintext文本节点空值显示 locale 占位符选型建议需要彻底禁止交互含焦点与复制如提交中的表单、无权限字段 → 用disabled需要保留复制能力、仅禁止修改如已提交数据的回显 → 用readOnly需要把字段从表单态切换为展示态特别是配合详情页复用 → 用plaintext组合输入框整体禁用如带搜索图标、按钮、单位前缀的InputGroup→ 直接在InputGroup上写disabled内部子组件会自动继承。小结rsuite 的Input组件通过disabled、readOnly、plaintext三个属性覆盖了禁交互、禁修改、纯展示三层递进的只读需求disabled由原生属性 事件绑定拦截双重保障readOnly保留可复制性plaintext则从渲染层面把输入框替换为文本节点并具备完整的国际化空值占位。掌握三者的差异能让你在表单校验、结果回显、详情展示等场景中写出语义更准确、交互更友好的界面。赞分享前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载相关推荐rsuite Form 表单四种状态详解disabled、readOnly、plaintext 与 plaintext 的实际应用rsuite Form 表单四种状态详解disabled、readOnly、plaintext 与 plaintext 的实际应用 本指南以 rsuite 官前端UI组件rsuite Cascader 禁用与只读状态全解析disabled、disabledItemValues、readOnly 与 plaintext 实战指南rsuite Cascader 禁用与只读状态全解析disabled、disabledItemValues、readOnly 与 plaintext 实战指南前端UI组件rsuite CheckPicker 禁用与只读状态全解析disabled、disabledItemValues、readOnly 与 plaintext 实战指南rsuite CheckPicker 禁用与只读状态全解析disabled、disabledItemValues、readOnly 与 plaintext 实前端UI组件上一篇揭秘gh_mirrors/yt/ytdlbot支持多平台的Telegram视频下载神器10分钟快速上手下一篇EmotiVoice终极指南2000种音色的情感语音合成神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考