使用ant-design-mobile的stepper时,唤起ios原生键盘无法输入负数(inputmode="decimal")

解决措施:将input的inputmode设置为空,并设置input的type为number

import classNames from 'classnames';
import { useRef, useState } from 'react';
import type { HTMLAttributes } from 'react';
import styles from './index.module.less';
import { Stepper } from 'antd-mobile';
import { useMount } from 'ahooks';

export type TOneKeyStepper = HTMLAttributes<HTMLDivElement> & {
  value?: any;
  standardValue: number;
  onChange?: (value) => void;
};

const OneKeyStepper = (props: TOneKeyStepper) => {
  const { value = null, onChange, standardValue } = props;
  const [stepperValue, setStepperValue] = useState<any>(value);

  const hackDomRef = useRef<HTMLDivElement>(null);

  // !!!HACK: 这里是hack掉steeper不支持输入负数
  useMount(() => {
    const inputDom = hackDomRef.current?.getElementsByTagName('input')?.[0] as HTMLInputElement;
    if (inputDom) {
      inputDom.setAttribute('inputmode', '');
      inputDom.setAttribute('type', 'number');
    }
  });

  return (
    <div ref={hackDomRef} className={classNames(styles.stepperWrapper, props.className)}>
      <Stepper
        value={stepperValue === '' ? null : stepperValue}
        digits={1}
        allowEmpty
        className={styles.stepper}
        onChange={val => {
          setStepperValue(val);
          onChange?.(val);
        }}
      />
      <div
        className={styles.standard}
        onClick={() => {
          setStepperValue(standardValue);
          onChange?.(standardValue);
        }}
      >
        填入标准值
      </div>
    </div>
  );
};

export default OneKeyStepper;

 

stepper内部本身使用的是 <input inputmode="decimal" />  分析react组件可以看出:

 

 

关于   inputmode :

inputmode 全局属性是一个枚举属性,它提供了用户在编辑元素或其内容时可能输入的数据类型的提示。

<input type="text" inputmode="tel" />

该属性可以取以下值:

  • none:不使用虚拟键盘,这个时候页面需要使用自定义的键盘代替。
  • text:默认值,会显示标准输入键盘。
  • decimal:小数表示键盘,除了数字之外可能会有小数点 . 或者千分符逗号 。
  • numeric:显示0-9的数字键盘。
  • tel:手机数字键盘,会有星号 * 或者井号 # 键。
  • search:提交按钮会显示 'search' 或者 ‘搜索’。
  • email:键盘上会有 @ 符号键。
  • url:键盘上会有斜杠 / 符号键。

当我们将 inputmode 属性设置为 tel 时,调起的虚拟键盘如下

 

 

 

当我们将 inputmode 属性设置为 tel 时,调起的虚拟键盘如下

 

 

解决问题过程中相关搜索:

1.【报Bug】Android 部分机种: <input> type="digit" 无法输入负号  :https://ask.dcloud.net.cn/question/150030

2.【报Bug】仅iphone上,input组件type="digit"时,在safari里无法输入小数点【PS:可调出键盘也无法输入,同手机chrome浏览器下正常】 : https://ask.dcloud.net.cn/question/154584

 

posted @ 2023-02-06 11:42  木杉呀  阅读(594)  评论(0编辑  收藏  举报