NumberKeyboard 数字键盘

介绍

虚拟数字键盘,可以配合密码输入框组件或自定义的输入框组件使用。

引入

import { NumberKeyboard } from "@taroify/core";

代码演示

默认样式

数字键盘提供了 onKeyPressonBackspaceonClose 事件,分别对应按键、删除和关闭操作。

function BasicNumberKeyboard(props: KeyboardProps) {
  const { keyboard, onKeyboard, onKeyPress } = props
  return (
    <>
      <Cell
        clickable
        title="弹出默认键盘"
        isLink
        onClick={() => onKeyboard?.("basic")}
      />
      <NumberKeyboard
        open={keyboard === "basic"}
        hideOnClickOutside
        onKeyPress={onKeyPress}
        onBlur={() => onKeyboard?.("")}
      />
    </>
  )
}

hideOnClickOutside 默认为 false。开启后,点击键盘以外的区域会触发 onBlur,可以在该事件中更新 open 来收起键盘。

带右侧栏的键盘

使用 NumberKeyboard.Sidebar 子组件可以用来展示键盘的右侧栏,常用于输入金额的场景。

function SidebarNumberKeyboard(props: KeyboardProps) {
  const { keyboard, onKeyboard, onKeyPress } = props
  return (
    <>
      <Cell
        clickable
        title="弹出带右侧栏的键盘"
        isLink
        onClick={() => onKeyboard?.("sidebar")}
      />
      <NumberKeyboard
        open={keyboard === "sidebar"}
        extraKey={[undefined, "."]}
        onKeyPress={onKeyPress}
        onClose={() => onKeyboard?.("")}
      >
        <NumberKeyboard.Sidebar>
          <NumberKeyboard.Key size="large" code="backspace" />
          <NumberKeyboard.Key size="large" code="keyboard-hide" color="blue">
            完成
          </NumberKeyboard.Key>
        </NumberKeyboard.Sidebar>
      </NumberKeyboard>
    </>
  )
}

身份证号键盘

通过 extraKey 属性可以设置左下角按键内容,比如需要输入身份证号时,可以将 extraKey 设置为 X

function IdCardNumberKeyboard(props: KeyboardProps) {
  const { keyboard, onKeyboard, onKeyPress } = props
  return (
    <>
      <Cell
        clickable
        title="弹出身份证号键盘"
        isLink
        onClick={() => onKeyboard?.("idCard")}
      />
      <NumberKeyboard
        open={keyboard === "idCard"}
        extraKey="X"
        onKeyPress={onKeyPress}
        onClose={() => onKeyboard?.("")}
      >
        <NumberKeyboard.Header>
          <NumberKeyboard.Button>完成</NumberKeyboard.Button>
        </NumberKeyboard.Header>
      </NumberKeyboard>
    </>
  )
}

键盘标题

通过 title 属性可以设置键盘标题。

function TitleNumberKeyboard(props: KeyboardProps) {
  const { keyboard, onKeyboard, onKeyPress } = props
  return (
    <>
      <Cell
        clickable
        title="弹出带标题的键盘"
        isLink
        onClick={() => onKeyboard?.("title")}
      />
      <NumberKeyboard
        open={keyboard === "title"}
        title="键盘标题"
        extraKey="."
        onKeyPress={onKeyPress}
        onClose={() => onKeyboard?.("")}
      >
        <NumberKeyboard.Header>
          <NumberKeyboard.Button>完成</NumberKeyboard.Button>
        </NumberKeyboard.Header>
      </NumberKeyboard>
    </>
  )
}

配置多个按键

extraKey 配置成数组,可以实现配置多个按键。

function NumberKeyboardWithKeys(props: KeyboardProps) {
  const { keyboard, onKeyboard, onKeyPress } = props
  return (
    <>
      <Cell
        clickable
        title="弹出配置多个按键的键盘"
        isLink
        onClick={() => onKeyboard?.("keys")}
      />
      <NumberKeyboard
        open={keyboard === "keys"}
        extraKey={["00", "."]}
        onKeyPress={onKeyPress}
        onClose={() => onKeyboard?.("")}
      >
        <NumberKeyboard.Sidebar>
          <NumberKeyboard.Key size="large" code="backspace" />
          <NumberKeyboard.Key size="large" code="keyboard-hide" color="blue">
            完成
          </NumberKeyboard.Key>
        </NumberKeyboard.Sidebar>
      </NumberKeyboard>
    </>
  )
}

双向绑定 v1.0.6

通过 valueonChange 管理当前输入值,并使用 maxlength 限制最大输入长度。点击数字或额外按键时会追加内容,点击删除键时会移除最后一个字符。

function ControlledNumberKeyboard() {
  const [open, setOpen] = useState(false)
  const [value, setValue] = useState("")

  return (
    <>
      <Cell
        clickable
        title="双向绑定"
        brief={value || "最多输入 6 位数字"}
        isLink
        onClick={() => setOpen(true)}
      />
      <NumberKeyboard
        open={open}
        value={value}
        maxlength={6}
        onChange={setValue}
        onClose={() => setOpen(false)}
      />
    </>
  )
}

随机数字键盘

通过 random 属性可以随机排序数字键盘,常用于安全等级较高的场景。

function RandomNumberKeyboard(props: KeyboardProps) {
  const { keyboard, onKeyboard, onKeyPress } = props
  return (
    <>
      <Cell
        clickable
        title="弹出配置随机数字的键盘"
        isLink
        onClick={() => onKeyboard?.("random")}
      />
      <NumberKeyboard
        open={keyboard === "random"}
        random
        onKeyPress={onKeyPress}
        onClose={() => onKeyboard?.("")}
      />
    </>
  )
}

API

NumberKeyboard Props

参数说明类型默认值
value v1.0.6当前输入值string''
open是否显示键盘boolean-
title键盘标题ReactNode-
maxlength v1.0.6输入值最大长度number | stringInfinity
transition v1.0.6是否开启过场动画booleantrue
extraKey底部额外按键的内容ReactNode | [ReactNode, ReactNode]-
random是否将通过随机顺序展示按键booleanfalse
hideOnClickOutside v1.0.6点击键盘外部时是否触发 onBlurbooleanfalse
safeAreaInsetBottom v1.0.6是否开启底部安全区适配booleantrue

NumberKeyboard Events

事件名说明回调参数
onChange v1.0.6输入值变化时触发value: string
onKeyPress点击任意按键时触发value: string | number, code: NumberKeyboardKeyCode
onBackspace点击删除键时触发-
onClose v1.0.6点击关闭按钮时触发-
onBlur v1.0.6点击关闭按钮,或开启 hideOnClickOutside 后点击外部时触发-
onShow v1.0.6键盘完全弹出时触发-
onHide点击关闭按钮时触发,兼容旧版本,推荐使用 onClose-

类型定义 v1.0.6

组件导出以下类型定义:

import type {
  NumberKeyboardChangeHandler,
  NumberKeyboardEventHandler,
  NumberKeyboardKeyCode,
  NumberKeyboardKeyOnPress,
  NumberKeyboardKeyValue,
  NumberKeyboardProps,
} from "@taroify/core"

主题定制

样式变量

组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 组件。

名称默认值描述
number-keyboard-z-index100-
number-keyboard-background-colorvar(--gray-2)-
number-keyboard-with-title-border-radius20px * $hd 20px * $hd 0 0-
number-keyboard-header-colorvar(--gray-7)-
number-keyboard-header-padding-top6px * $hd-
number-keyboard-header-height34px * $hd-
number-keyboard-header-font-sizevar(--font-size-lg)-
number-keyboard-key-height48px * $hd-
number-keyboard-key-font-size28px * $hd-
number-keyboard-key-background-colorvar(--white, $white)-
number-keyboard-key-border-radiusvar(--border-radius-lg)-
number-keyboard-key-line-height1.5-
number-keyboard-key-active-background-colorvar(--gray-3)-
number-keyboard-key-active-opacityvar(--active-opacity)-
number-keyboard-large-key-font-sizevar(--font-size-lg)-
number-keyboard-hide-padding0 var(--padding-md)-
number-keyboard-hide-font-sizevar(--font-size-md)-
number-keyboard-hide-colorvar(--text-link-color)-
number-keyboard-hide-active-opacityvar(--number-keyboard-key-active-opacity)-
number-keyboard-backspace-font-size22px * $hd-
number-keyboard-button-colorvar(--white)-
number-keyboard-button-background-colorvar(--primary-color)-