Componenta TextInput în React Native — elementul principal pentru introducerea textului de către utilizator, analogul elementului HTML input. TextInput suportă starea controlată și necontrolată, diferite tipuri de tastatură, măști de introducere și gestionarea evenimentelor de focalizare. Conform React Native Docs, 2024, TextInput este o componentă cheie pentru formulare, căutare, chat-uri și orice scenarii cu introducere de date de către utilizator. Componenta se adaptează automat la platformă, utilizând UITextField nativ pe iOS și EditText pe Android.
Principalele puncte
TextInput este o componentă React Native care permite utilizatorului să introducă text de pe tastatura dispozitivului. Este elementul principal pentru formulare de înregistrare, bare de căutare, câmpuri de introducere a mesajelor și orice alte scenarii care necesită introducere de date de către utilizator. Spre deosebire de dezvoltarea web, unde există tipuri separate de input (text, email, password, search), în React Native toate aceste variante sunt implementate printr-o singură componentă TextInput cu diferite proprietăți.
TextInput suportă două moduri de lucru: controlat (gestionat prin starea React) și necontrolat (cu referință). În modul controlat, valoarea câmpului este stocată în starea componentei și actualizată prin callback-ul onChangeText. Această abordare este recomandată pentru majoritatea aplicațiilor, deoarece asigură o singură sursă de adevăr și simplifică validarea.
Conform React Native Handling Text Input, 2024, TextInput se adaptează automat la platformă: pe iOS se utilizează UITextField nativ, pe Android — EditText. Aceasta asigură funcționarea corectă a înlocuirii automate, autocorectării și meniurilor de sistem (taiere/copiere/lipire) fără configurare suplimentară.
TextInput oferă un set extins de proprietăți pentru gestionarea introducerii, aspectului și comportamentului. Toate proprietățile sunt împărțite în mai multe categorii: gestionarea valorii, tipul tastaturii, stilizare, evenimente și particularități de platformă.
value — valoarea curentă a câmpului (pentru modul controlat). onChangeText — callback apelat la fiecare modificare a textului. placeholder — text sugestiv afișat când câmpul este gol. defaultValue — valoarea inițială pentru modul necontrolat. maxLength limitează numărul maxim de caractere pe care utilizatorul le poate introduce.
Componenta suportă onFocus (câmpul a primit focalizarea), onBlur (câmpul a pierdut focalizarea), onSubmitEditing (utilizatorul a apăsat Enter/Return), onKeyPress (apăsarea unei taste). Evenimentul onEndEditing este apelat după încheierea editării la pierderea focalizării. Aceste callback-uri permit implementarea unei logici complexe de validare și trimitere a formularelor.
Pe iOS sunt disponibile: clearButtonMode (buton de ștergere), keyboardAppearance (tastatură deschisă/închisă), returnKeyType (tipul butonului Return), enablesReturnKeyAutomatically. Pe Android sunt disponibile: textContentType (completare automată), underlineColorAndroid, inlineImageLeft. secureTextEntry funcționează pe ambele platforme pentru introducerea parolelor.
În React Native, TextInput poate funcționa în două moduri. În modul controlat, React gestionează valoarea câmpului: trimiteți value din stare și o actualizați prin onChangeText. În modul necontrolat, React doar inițializează câmpul, iar valoarea asemănătoare DOM-ului este stocată în interiorul componentei native.
Modul controlat este recomandat pentru toate formularele care necesită validare, filtrare sau formatare a datelor introduse. Starea câmpului este sincronizată cu starea componentei React, oferind control complet asupra valorii.
const LoginForm = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
return (
<View>
<TextInput
placeholder="Email"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
/>
<TextInput
placeholder="Password"
value={password}
onChangeText={setPassword}
secureTextEntry
maxLength={32}
/>
</View>
);
};
În acest exemplu, ambele câmpuri utilizează modul controlat. Email are tipul de tastatură email-address și capitalizarea automată dezactivată. Parola utilizează secureTextEntry pentru ascunderea caracterelor introduse și este limitată la 32 de caractere prin maxLength.
Modul necontrolat este potrivit pentru câmpuri simple unde nu este necesară validarea sau reacția imediată la introducere. Valoarea câmpului este extrasă prin referință în momentul trimiterii formularului.
const SimpleSearch = () => {
const inputRef = useRef(null);
const handleSearch = () => {
console.log(inputRef.current.value());
};
return (
<TextInput
ref={inputRef}
placeholder="Search..."
onSubmitEditing={handleSearch}
/>
);
};
În modul necontrolat, componenta se redează mai rapid, deoarece nu necesită sincronizarea stării la fiecare modificare a textului. Cu toate acestea, pierdeți posibilitatea de a filtra, formata sau valida introducerea în timp real.
TextInput suportă diferite tipuri de tastatură care adaptează aspectul la formatul de introducere așteptat. Alegerea tipului corect de tastatură îmbunătățește experiența utilizatorului și reduce numărul de erori de introducere pe dispozitivele mobile.
| Valoarea keyboardType | Descriere | Când să utilizați |
|---|---|---|
| default | Tastatură alfabetică standard | Nume, prenume, adresă |
| numeric | Tastatură numerică (doar cifre) | Vârstă, cantitate, cod PIN |
| email-address | Tastatură cu @ și .com | Câmp email în formularul de înregistrare |
| phone-pad | Tastatură telefonică cu + și # | Număr de telefon |
| url | Tastatură cu / și .com | Introducerea adresei web |
| decimal-pad | Tastatură numerică cu punct zecimal | Preț, greutate, dimensiune |
Pe iOS sunt disponibile tipuri suplimentare: numbers-and-punctuation (cifre și punctuație), twitter, web-search (cu căutare vocală). Pe Android este disponibil și visible-password (afișează parola). Alegerea corectă a keyboardType este un aspect important al UX al aplicației mobile.
Particularitățile de platformă includ, de asemenea, autoCapitalize (capitalizarea automată a primului cuvânt), autoCorrect (autocorectare), spellCheck (verificare ortografică), textContentType (completare automată pe iOS). Aceste proprietăți funcționează diferit pe fiecare platformă și necesită testare.
Să analizăm două scenarii reale: un câmp multi-linie pentru introducerea mesajelor și un câmp cu introducere mascată a numărului de telefon. Ambele utilizează TextInput cu diferite proprietăți pentru a obține comportamentul dorit.
Pentru introducerea textului lung (comentarii, descriere), TextInput comută în modul multi-linie prin proprietatea multiline. În acest mod, câmpul crește vertical și suportă întreruperea liniilor.
const MessageInput = ({ onSend }) => {
const [text, setText] = useState('');
return (
<TextInput
style={styles.input}
multiline
numberOfLines={4}
placeholder="Write a message..."
value={text}
onChangeText={setText}
textAlignVertical="top"
/>
);
};
Proprietatea multiline activează modul multi-linie, numberOfLines stabilește înălțimea inițială în linii. textAlignVertical: 'top' aliniază textul la marginea superioară (implicit pe Android, TextInput multi-linie centrează textul vertical).
Pentru introducerea numărului de telefon este adesea necesară formatarea în timp real. Combinând onChangeText cu expresii regulate, se poate implementa o mască de introducere.
const PhoneInput = () => {
const [phone, setPhone] = useState('');
const formatPhone = (text) => {
const cleaned = text.replace(/\D/g, '');
if (cleaned.length <= 11) {
return cleaned.replace(
/(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})/,
'+$1 ($2) $3 $4 $5'
);
}
return cleaned;
};
return (
<TextInput
keyboardType="phone-pad"
value={phone}
onChangeText={(t) => setPhone(formatPhone(t))}
placeholder="+7 (999) 123 45 67"
maxLength={20}
/>
);
};
Funcția formatPhone elimină toate caracterele ne-digitale și formatează numărul în format internațional standard. keyboardType: 'phone-pad' afișează tastatura telefonică. O astfel de abordare îmbunătățește UX pentru introducerea numerelor de telefon și previne erorile de formatare.
Întrebări frecvente
value este utilizat în modul controlat — React gestionează textul afișat prin stare. defaultValue este utilizat în modul necontrolat — stabilește valoarea inițială, iar modificările ulterioare sunt stocate în interiorul componentei.
Setați proprietatea secureTextEntry la true. TextInput va ascunde caracterele introduse, înlocuindu-le cu puncte sau asteriscuri. Pentru securitate suplimentară, puteți combina cu maxLength și autoCapitalize: 'none'.
onChangeText este apelat la fiecare modificare a textului, inclusiv la inserarea și ștergerea unui singur caracter. Acesta este comportamentul normal al unei componente controlate. Pentru optimizare, puteți utiliza debounce sau actualiza starea la onEndEditing.
TextInput nu suportă direct elemente imbricate. Soluția — creați un container View cu Flexbox, în interiorul căruia plasați pictograma și TextInput. Stilul containerului imită bordura câmpului de introducere, iar TextInput se întinde pe spațiul rămas.
Pe Android, TextInput are implicit o bordură inferioară (Material Design). O dezactivați prin underlineColorAndroid: 'transparent'. Această proprietate funcționează doar pe Android și elimină linia vizuală sub text.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și