Разрешить только число в Semantic UI React Form Input

Я создал компонент React для ввода валюты, чтобы пользователь мог вводить числовые значения. Я сделал тип ввода «число». Это работает только в Chrome (пользователь может вводить нечисловые значения в Firefox).

Компонент CurrencyInput:

import React from "react";
import { Form } from "semantic-ui-react";

interface ICurrencyInputProps {
  onChange(value: any): void;
  checkRange?: boolean;
  min: number;
  max: number;
  validationMessage: string;
  cssClasses?: string;
}

export class CurrencyInput extends React.Component<ICurrencyInputProps> {
  state = {
    showInvalidError: false,
    value: null
  };
  render() {
    return (
      <>
        <Form.Input
          icon="pound"
          iconPosition="left"
          placeholder="Whole pounds"
          className={this.props.cssClasses}
          type="text"
          error={this.state.showInvalidError}
          onChange={(event: any) => {
            let value = null;
            if (event.target.value) value = parseInt(event.target.value);

            this.setState({ value: value });
            this.props.onChange(value);
          }}         
        />      
      </>
    );
  }
}

export default CurrencyInput;

Применение:

<CurrencyInput
    cssClasses="has_tooltip"
    checkRange={true}
    onChange={(data: any) => {
              this.setState({
               premium: data
                        });
                      }}
    min={TargetPremiumRange.MIN}
    max={TargetPremiumRange.MAX}
    validationMessage="Validation message"/>

Я хочу запретить пользователю вводить любое нечисловое значение. Как я могу этого добиться?


person Joshua    schedule 04.02.2020    source источник
comment
type="text" pattern="[0-9]*"ура   -  person Chris W.    schedule 04.02.2020
comment
Пробовал и это. Не работал.   -  person Joshua    schedule 04.02.2020
comment
Даже если пользователь может ввести текст, при нажатии кнопки появится предупреждение, которое не позволит пользователю вводить нечисловые значения. [в браузере Firefox]   -  person Anupam Kumar    schedule 29.12.2020


Ответы (1)


Вы можете изменить состояние ошибки в onChange в <Form.Input>. Что-то типа:

onChange={(event: any) => {
    let value = null;
    if (event.target.value) {
        value = parseInt(event.target.value, 10);

        // Test for valid number
        if (isNaN(value)) {
            setState({showInvalidError: true});
        } else {
            this.setState({ value: value });
            this.props.onChange(value);
        }
    }       
}  
person Ed Lucas    schedule 04.02.2020
comment
Спасибо. Но пользователь по-прежнему сможет вводить нечисловые значения? - person Joshua; 04.02.2020
comment
Да, но если значение неверно, оно не изменит значение, сохраненное в состоянии, будет отображаться ваше состояние ошибки, и пользователю будет разрешено исправить его. Вы можете проверить каждый keydown() и предотвратить ввод числа, но это не решает случай, когда кто-то просто вставляет значение. onchange() должен покрыть это. - person Ed Lucas; 04.02.2020