JGuang

虚拟输入框 <Experimental></Experimental>

VirtualInput <Experimental></Experimental> · Ant Design Mobile

交互预览
npm install antd-mobile@5.43.0

虚拟输入框 <Experimental></Experimental> VirtualInput <Experimental></Experimental>

与 Input 输入框外观、用法一致。

安装

npm install antd-mobile@5.43.0

antd-mobile 是移动网页组件库,不是 React Native 或小程序组件。React 19 项目需在入口用 unstableSetRender 注册 createRoot,否则 Toast、Dialog 等命令式 API 无法渲染;深色模式通过 <html data-prefers-color-scheme="dark"> 切换。

示例来自 Ant Design Mobile 官方仓库(MIT),固定在 npm 5.43.0 对应的提交;示例中的 DemoBlock 等展示辅助组件由 JGuang 重写,不属于 antd-mobile 的 API。

与 Input 输入框外观、用法一致。

何时使用

需要配合虚拟键盘使用时。

示例

VirtualInput

属性

属性说明类型默认值
clearable是否启用清除图标,点击清除图标后会清空虚拟输入框booleanfalse
onBlur失去焦点时触发() => void-
onClear点击清除按钮时触发() => void-
onClick点击时触发(e: React.MouseEvent<HTMLDivElement>) => void-
onFocus获得焦点时触发() => void-
placeholder提示文本string-
value输入值string''
cursor光标相关配置,movable 表示是否可调整,onMove 为光标移动回调{ movable?: boolean; onMove?: (position: number) => void }{ movable: false }

严格意义上讲,VirtualInput 并不是一个表单类型的组件,它只是对数据进行展示。

Ref

属性说明类型
blur让输入框失去焦点() => void
focus让输入框获得焦点() => void

CSS 变量

属性说明默认值全局变量
--caret-color光标颜色var(--adm-color-primary)--adm-virtual-input-caret-color
--caret-width光标宽度2px--adm-virtual-input-caret-width
--color文字颜色var(--adm-color-text)-
--disabled-color禁用状态下的文字颜色var(--adm-color-weak)-
--font-size字号17px-
--placeholder-colorplaceholder 文字颜色var(--adm-color-light)-
--text-align文字对齐方式left-

与NumberKeyboard配合使用

强烈推荐将 NumberKeyboard 作为属性传入 VirtualInput,一方面可以少写很多联动代码,另外也有完善的无障碍支持。

如果两个组件分离式引入,则需手动添加联动逻辑代码,且存在无障碍支持问题。

// ✅ 推荐这么做
 <VirtualInput
  placeholder='请输入内容'
  clearable
  keyboard={
    <NumberKeyboard
      confirmText='确定'
      customKey={{ key: '.', title: '小数点' }}
    />
  }
/>

// ❌ 不推荐这么做
<VirtualInput
  placeholder='请输入内容'
  clearable
  value={value}
  onFocus={() => setVisible(true)}
  onBlur={() => setVisible(false)}
  onClear={() => setValue('')}
  ref={inputRef}
/>
<NumberKeyboard
  visible={visible}
  confirmText='确定'
  customKey={{ key: '.', title: '小数点' }}
  onInput={v => setValue(i => i + v)}
  onDelete={() => setValue(i => i.slice(0, i.length - 1))}
  onClose={() => { setVisible(false); inputRef.current?.blur(); }}
/>