Potrzebuję TextInput
komponentu React Native , który pozwoli na wprowadzanie tylko znaków numerycznych (0 - 9). Mogę ustawić, keyboardType
do numeric
którego prawie mnie tam doprowadza, z wyjątkiem kropki (.). Jednak to nic nie powstrzymuje wklejania znaków nienumerycznych do pola.
To, co do tej pory wymyśliłem, to użycie OnChangeText
zdarzenia do spojrzenia na wprowadzony tekst. Usuwam z tekstu wszelkie znaki nienumeryczne. Następnie umieść tekst w polu stanu. Następnie zaktualizuj TextInput
poprzez jego Value
właściwość. Fragment kodu poniżej.
<TextInput
style={styles.textInput}
keyboardType = 'numeric'
onChangeText = {(text)=> this.onChanged(text)}
value = {this.state.myNumber}
/>
onTextChanged(text) {
// code to remove non-numeric characters from text
this.setState({myNumber: text})
}
Wydaje się, że to działa, ale wygląda na włamanie. Czy jest inny sposób, aby to zrobić?
react-native
Terry
źródło
źródło
keyboardType='numeric'
prop w TextInput, aby wyświetlać tylko klawiaturę numeryczną (duh), a także zastępując teksty wyrażeniem regularnym,text.replace(/[^0-9]/g, '')
jak zasugerowano poniżej, aby nikt nie mógł wklejać ciągów wewnątrz TextInput. Jak dotąd działa dobrze na React Native v0.62Odpowiedzi:
Jest to właściwy sposób, aby to zrobić, dopóki taki komponent (lub atrybut w TextInput) nie zostanie specjalnie opracowany.
Sieć ma typ „numer” dla elementu wejściowego, ale jest on oparty na sieci i natywny dla reagowania nie korzysta z widoku internetowego.
Możesz rozważyć utworzenie tego wejścia jako samodzielnego komponentu reagującego (może zadzwonić do NumberInput): umożliwi to ponowne użycie, a może nawet otwarcie źródła, ponieważ możesz utworzyć wiele TextInput, które mają różne filtry / kontrolery wartości.
Wadą natychmiastowej korekty jest zapewnienie prawidłowej informacji zwrotnej użytkownikowi, aby uniknąć nieporozumień co do tego, co stało się z jego wartością
źródło
Użycie RegExp do zastąpienia dowolnej liczby niebędącej cyfrą jest szybsze niż użycie pętli for z białą listą, tak jak robią to inne odpowiedzi.
Użyj tego dla swojej obsługi onTextChange:
Test wydajności tutaj: https://jsperf.com/removing-non-digit-characters-from-a-string
źródło
text.replace(/[^A-Za-z]/g, '')
keyboardType='numeric'
Przekaż także prop do pola TextInput.Możesz to zrobić w ten sposób. Przyjmuje tylko wartości liczbowe i ogranicza się do 10 liczb według własnego uznania.
Możesz zobaczyć wprowadzoną wartość, wpisując następujący kod na swojej stronie:
W funkcji onChanged () kod wygląda następująco:
Mam nadzieję, że jest to pomocne dla innych.
źródło
React Native TextInput zapewnia właściwości keyboardType z następującymi możliwymi wartościami: domyślna klawiatura numeryczna klawiatura dziesiętna numeryczna adres e-mail klawiatura telefoniczna
więc w twoim przypadku możesz użyć keyboardType = 'number-pad' do akceptowania tylko liczb. Nie obejmuje to „.”
więc,
jest tym, czego musisz użyć w swoim przypadku.
Aby uzyskać więcej informacji, zapoznaj się z oficjalnym linkiem do dokumentu TextInput: https://facebook.github.io/react-native/docs/textinput#keyboardtype
źródło
Funkcja sprawdzania poprawności danych wejściowych:
Mam nadzieję, że to jest pomocne.
źródło
Zezwalaj tylko na liczby używające wyrażeń regularnych
Możesz chcieć mieć więcej niż jedną weryfikację
źródło
validations(value: string) { return /0/.test(value) && /^\d+$/.test(value) ? this.setState({ numColumns: value }) : false; }
Pierwsze rozwiązanie
Możesz użyć
keyboardType = 'numeric'
do klawiatury numerycznej.W pierwszym przypadku uwzględniane są znaki interpunkcyjne, np .: - . i -
Drugie rozwiązanie
Użyj wyrażenia regularnego, aby usunąć znaki interpunkcyjne.
Sprawdź link do przekąski
https://snack.expo.io/@vishal7008/numeric-keyboard
źródło
Uprzejme przypomnienie dla tych, którzy napotkali problem, że „onChangeText” nie może zmienić wartości TextInput zgodnie z oczekiwaniami na iOS: jest to w rzeczywistości błąd w ReactNative i został naprawiony w wersji 0.57.1. Zobacz: https://github.com/facebook/react-native/issues/18874
źródło
i onChanged metoda:
źródło
"This synthetic event is reused for performance reasons. If you're seeing this, you're accessing the property 'type' on a released/nullified synthetic event. This is set to null. If you must keep the original synthetic event around, use event.persist(). See fb>react-event-pooling for more information."
nie wiem, co z tym zrobić. Możesz pomóc?Miałem ten sam problem w iOS, używając zdarzenia onChangeText do aktualizacji wartości tekstu wpisanego przez użytkownika. Nie byłem w stanie zaktualizować wartości TextInput, więc użytkownik nadal widziałby znaki nienumeryczne, które wpisał.
Dzieje się tak, ponieważ po naciśnięciu znaku nienumerycznego stan się nie zmieni, ponieważ this.setState używałby tej samej liczby (liczby, która pozostała po usunięciu znaków nienumerycznych), a następnie TextInput nie byłby ponownie renderowany.
Jedynym sposobem rozwiązania tego problemu było użycie zdarzenia keyPress, które ma miejsce przed zdarzeniem onChangeText i użycie w nim setState do zmiany wartości stanu na inny, zupełnie inny, wymuszając ponowne renderowanie, gdy wywołano zdarzenie onChangeText . Niezbyt zadowolony z tego, ale zadziałało.
źródło
źródło
Napisałem tę funkcję, która okazała się pomocna, aby uniemożliwić użytkownikowi wprowadzenie czegokolwiek innego, niż byłbym skłonny zaakceptować. Użyłem też
keyboardType="decimal-pad"
i mójonChangeText={this.decimalTextChange}
Pierwszy
if
blok to obsługa błędów w przypadku, gdy użytkownik usuwa cały tekst lub używa kropki dziesiętnej jako pierwszego znaku, lub jeśli próbuje wstawić więcej niż jedno miejsce dziesiętne, drugiif
blok zapewnia, że może wpisać jako dowolną liczbę liczb przed miejscem dziesiętnym, ale tylko do dwóch miejsc po przecinku.źródło
Użycie RegExp do zastąpienia dowolnej cyfry. Uważaj, gdy następny kod da ci pierwszą znalezioną cyfrę, więc jeśli użytkownik wklei akapit z więcej niż jedną liczbą (xx.xx), kod da ci pierwszą liczbę. To pomoże, jeśli chcesz mieć coś w rodzaju ceny, a nie telefonu komórkowego.
Użyj tego dla swojej obsługi onTextChange:
źródło
Możesz usunąć znaki nienumeryczne za pomocą wyrażenia regularnego
źródło
const [text, setText] = useState(''); const onChangeText = (text) => { if (+text) { setText(text); } }; <TextInput keyboardType="numeric" value={text} onChangeText={onChangeText} />
Powinno to zaoszczędzić na fizycznych klawiaturach
źródło
To nie działa na IOS, setState -> render -> nie zmienia tekstu, ale może zmienić inne. Textinput nie może zmienić swojej wartości, gdy textOnChange.
przy okazji, to działa dobrze na Androida.
źródło
Stworzyłem komponent, który rozwiązuje ten problem:
https://github.com/amirfl/react-native-num-textinput
źródło
Oto moja inna prosta odpowiedź, aby zaakceptować tylko liczby w polu tekstowym za pomocą wyrażeń regularnych.
źródło
Spróbuj tego tylko dla liczb dziesiętnych / zmiennoprzecinkowych
}
źródło
Cóż, jest to bardzo prosty sposób sprawdzenia poprawności liczby innej niż 0.
Będzie NaN, jeśli inputNum nie jest liczbą lub false, jeśli jest równe 0
źródło