inputType={"number"},数字拨号盘未显示在 ios 中但在 android 中可见 - React js

inputType={"number"}, Number dial pad not showing in ios but visible in android - React js

我正在使用 React Bootstrap 表单控件和输入组。

我创建了一个组件并在我的其他模块中使用。

代码如下:

import InputGroup from "react-bootstrap/InputGroup";
import Form from "react-bootstrap/Form"; 

export default class TextInput extends Component {

render() {
    var { value, maxLength, defaultInput, prefix, inputProps, placeholder, label, labelClass, formGroupClass, inputType, error, warning, onChange, disabled, mandatory } = this.props;
    return (
      <div className={styles.container}>
        <Form.Group className={formGroupClass}>
          {label?
            (<Form.Label className={labelClass}>{label}
              {mandatory ? <span className="text-danger"> *</span>
                : ""}
            </Form.Label>)
            : ""
          }
          <InputGroup>
            {prefix && prefix !== "" ?
              <InputGroup.Prepend>
                <InputGroup.Text>{prefix}
                </InputGroup.Text>
              </InputGroup.Prepend> : ""}
            <Form.Control isInvalid={!!error} className={warning ? "border border-warning " : undefined}
              disabled={disabled}
              type={inputType}
              placeholder={placeholder}
              value={value}
              defaultValue={defaultInput}
              maxLength={maxLength}
              onChange={(e) => onChange(e.target.value)}
              onKeyPress={(e) => this.onKeyUp(e)}
              {...inputProps}
            />            
          </InputGroup>
          <Form.Text className="feedback-warn text-warning">
            {warning}
          </Form.Text>
          <Form.Control.Feedback type="invalid">
            {error}
          </Form.Control.Feedback>
        </Form.Group>
      </div>
    );
  }
}

}

并在我的其他模块中使用此组件,如下所示:

<TextInput
   placeholder={formData.mobileNum.label}
   inputType={"number"}
   error={formData.mobileNum.errMsg}
   value={formData.mobileNum.value}
   prefix={"+91"}
   maxLength="10"
   onChange={(text) =>
            changeValue(formData.mobileNum.propName, text)
   }
/>

我遇到的问题是在 android 设备中,当我点击输入字段时数字键盘工作正常。

如果 ios 设备 inputType={"number"} 不工作,因为我无法获得数字键盘。

我尝试了一些修复,但它们也影响了 android。当我尝试输入输入字段时,我希望两个设备都有数字键盘。

<TextInput
   placeholder={formData.mobileNum.label}
   error={formData.mobileNum.errMsg}
   value={formData.mobileNum.value}
   prefix={"+91"}
   maxLength="10"
keyboardType="numeric" //add this
   onChange={(text) =>
            changeValue(formData.mobileNum.propName, text)
   }
/>

在文本输入中添加 keyboardType 并删除 inputType

我解决了这个问题。 犯了一些愚蠢的错误,没有注意到 {...inputProps} 它包含所有剩余的输入道具。

在我的 TextInput 组件中简单地添加了方法:pattern 和 inputMode

var { pattern, inputMode } = this.props


 <Form.Control isInvalid={!!error} className={warning ? "border border-warning " : undefined}
              disabled={disabled}
              type={inputType}
              placeholder={placeholder}
              value={value}
              pattern={pattern} // add this
              inputMode={inputMode} // add this
              defaultValue={defaultInput}
              maxLength={maxLength}
              onChange={(e) => onChange(e.target.value)}
              onKeyPress={(e) => this.onKeyUp(e)}
              {...inputProps}
            />     

然后在我的其他文件中像这样简单地使用这些道具:

<TextInput
   ..other props
   pattern={"[0-9]*"}
   inputMode={"numeric"}
   onChange={(text) =>
            changeValue(formData.mobileNum.propName, text)
   }
/>

pattern={"[0-9]*"} 和 inputMode={"numeric"} 将强制此 ios 设备使用数字拨号盘。尽管 pattern prop 本身就足够了,但如果 pattern 不起作用,inputMode 只是一个后备。

注意 -> 这不会影响 android 使用数字键盘的行为。

备选方案:

我们可以利用 {...inputProps}

而不是更改 Main 组件中的内容
<TextInput
   ...other props
   inputProps={{ pattern: "[0-9]*", inputMode: "numeric" }} //add this
   onChange={(text) =>
            changeValue(formData.mobileNum.propName, text)
   }
/>