Компонент TextInput в React Native принимает любой символ при вставке, не зависит от типа клавиатуры

#react-native

Вопрос:

Компонент TextInput не должен принимать другие символы, кроме числовых.

Реальная проблема заключается в том , что при вставке внутрь TextInput: 555 555 555 вместо 555555555 я получаю 555 555 5 .

Кроме этого, я могу вставить все, что захочу ^*D -/6 .

Я попробовал регулярное выражение на

 function handler(e) {
  const tmp =  e.replace(/[^0-9]/g, '');       
  setValue(tmp)
}
 

Есть ли какой-нибудь хороший способ поймать событие вставки или что-то в этом роде?

Код прост:

 export default function App() {
  const [value, setValue] = React.useState('');
    
  function handler(e) {
    setValue(e);
  }
    
  return (
    <View style={styles.container}>
      <TextInput
        value={value}
        onChangeText={handler}
        keyboardType="numeric"
        maxLength={9}
      />
    </View>
  );
}
 

Ответ №1:

Не уверен, что вы сможете поймать событие вставки. Один из способов решить вашу конкретную проблему-использовать регулярное выражение и принудительно применять максимальную длину из обработчика onChangeText.


Пример

 export default function App() {
  const [value, setValue] = React.useState('');

  function handler(text) {
    if (text.length >= value.length   2){
      // Maybe this can be captured as a paste event?
      // Haven't tested it, but it's an idea.
      // Since key-ins cannot increase the length of the value by 
      // more than 1 at a time, if text length increase by 2 or more,
      // then I think it's safe to assume it's a paste event.
    }

    const maxLength = 9
    let cleanNumber = text.replace(/[^0-9]/g, "")
    if (cleanNumber.length > maxLength) {
      cleanNumber = cleanNumber.substr(0, maxLength)
    }
    setValue(cleanNumber);
  }

  return (
    <View style={styles.container}>
      <TextInput
        value={value}
        onChangeText={handler}
        keyboardType="numeric"
        // maxLength={9} <-- Don't use maxLength prop here.
      />
    </View>
  );
}