Le composant TextInput dans React Native est l'élément principal pour la saisie de texte par l'utilisateur, analogue à l'élément input en HTML. TextInput prend en charge l'état contrôlé et non contrôlé, divers types de clavier, des masques de saisie et la gestion des événements de focus. Selon React Native Docs, 2024, TextInput est un composant clé pour les formulaires, la recherche, les chats et tout scénario nécessitant une saisie utilisateur. Le composant s'adapte automatiquement à la plateforme, utilisant UITextField natif sur iOS et EditText sur Android.
Points clés
TextInput est un composant React Native qui permet aux utilisateurs de saisir du texte à l'aide du clavier de l'appareil. C'est le bloc de construction principal pour les formulaires d'inscription, les barres de recherche, les champs de saisie de messages et tout autre scénario nécessitant une saisie utilisateur. Contrairement au développement web, où il existe des types d'input séparés (text, email, password, search), dans React Native toutes ces variantes sont implémentées via un seul composant TextInput avec différentes props.
TextInput prend en charge deux modes de fonctionnement: contrôlé (géré via l'état React) et non contrôlé (à l'aide d'une ref). En mode contrôlé, la valeur du champ est stockée dans l'état du composant et mise à jour via le callback onChangeText. Cette approche est recommandée pour la plupart des applications car elle fournit une source unique de vérité et simplifie la validation.
Selon React Native Handling Text Input, 2024, TextInput s'adapte automatiquement à la plateforme: sur iOS il utilise UITextField natif, sur Android — EditText. Cela garantit le bon fonctionnement de l'autocomplétion, de la correction automatique et des menus système (couper/copier/coller) sans configuration supplémentaire.
TextInput fournit un ensemble étendu de props pour contrôler la saisie, l'apparence et le comportement. Toutes les props sont divisées en plusieurs catégories: gestion de la valeur, type de clavier, style, événements et fonctionnalités spécifiques à la plateforme.
value — la valeur actuelle du champ (pour le mode contrôlé). onChangeText — callback invoqué à chaque modification du texte. placeholder — texte indicatif affiché lorsque le champ est vide. defaultValue — valeur initiale pour le mode non contrôlé. maxLength limite le nombre maximum de caractères que l'utilisateur peut saisir.
Le composant prend en charge onFocus (le champ a reçu le focus), onBlur (le champ a perdu le focus), onSubmitEditing (l'utilisateur a appuyé sur Entrée/Retour), onKeyPress (pression de touche). L'événement onEndEditing est appelé après la fin de l'édition lors de la perte du focus. Ces callbacks permettent d'implémenter une logique complexe de validation et de soumission de formulaires.
Sur iOS: clearButtonMode (bouton d'effacement), keyboardAppearance (clavier clair/foncé), returnKeyType (type de bouton Retour), enablesReturnKeyAutomatically. Sur Android: textContentType (remplissage automatique), underlineColorAndroid, inlineImageLeft. secureTextEntry fonctionne sur les deux plateformes pour la saisie de mots de passe.
Dans React Native, TextInput peut fonctionner dans deux modes. En mode contrôlé, React gère la valeur du champ: vous passez la valeur depuis l'état et la mettez à jour via onChangeText. En mode non contrôlé, React initialise seulement le champ, et la valeur de type DOM est stockée dans le composant natif.
Le mode contrôlé est recommandé pour tous les formulaires nécessitant une validation, un filtrage ou un formatage des données saisies. L'état du champ est synchronisé avec l'état du composant React, offrant un contrôle total sur la valeur.
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>
);
};
Dans cet exemple, les deux champs utilisent le mode contrôlé. Le champ email a le type de clavier email-address et la capitalisation automatique désactivée. Le champ mot de passe utilise secureTextEntry pour masquer les caractères saisis et est limité à 32 caractères via maxLength.
Le mode non contrôlé convient aux champs simples qui ne nécessitent pas de validation ou de réaction immédiate à la saisie. La valeur du champ est récupérée via une ref au moment de la soumission du formulaire.
const SimpleSearch = () => {
const inputRef = useRef(null);
const handleSearch = () => {
console.log(inputRef.current.value());
};
return (
<TextInput
ref={inputRef}
placeholder="Search..."
onSubmitEditing={handleSearch}
/>
);
};
En mode non contrôlé, le composant se rend plus rapidement car il ne nécessite pas de synchronisation d'état à chaque modification de texte. Cependant, vous perdez la capacité de filtrer, formater ou valider la saisie en temps réel.
TextInput prend en charge divers types de clavier qui adaptent la disposition au format de saisie attendu. Choisir le bon type de clavier améliore l'expérience utilisateur et réduit les erreurs de saisie sur les appareils mobiles.
| Valeur keyboardType | Description | Quand l'utiliser |
|---|---|---|
| default | Clavier alphabétique standard | Prénom, nom, adresse |
| numeric | Clavier numérique (chiffres uniquement) | Âge, quantité, code PIN |
| email-address | Clavier avec @ et .com | Champ email dans le formulaire d'inscription |
| phone-pad | Clavier téléphonique avec + et # | Numéro de téléphone |
| url | Clavier avec / et .com | Saisie d'une adresse web |
| decimal-pad | Clavier numérique avec point décimal | Prix, poids, taille |
Sur iOS, des types supplémentaires sont disponibles: numbers-and-punctuation, twitter, web-search (avec recherche vocale). Sur Android, visible-password est également disponible (affiche le mot de passe). Choisir le bon keyboardType est un aspect important de l'UX des applications mobiles.
Les fonctionnalités de la plateforme incluent également autoCapitalize (capitalisation automatique du premier mot), autoCorrect (correction automatique), spellCheck (vérification orthographique), textContentType (remplissage automatique sur iOS). Ces props fonctionnent différemment sur chaque plateforme et nécessitent des tests.
Considérons deux scénarios réels: un champ multiligne pour la saisie de messages et un champ avec masque pour le numéro de téléphone. Les deux utilisent TextInput avec différentes props pour atteindre le comportement souhaité.
Pour saisir du texte long (commentaires, descriptions), TextInput passe en mode multiligne via la prop multiline. Dans ce mode, le champ s'agrandit verticalement et prend en charge les sauts de ligne.
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"
/>
);
};
La prop multiline active le mode multiligne, numberOfLines définit la hauteur initiale en lignes. textAlignVertical: 'top' aligne le texte en haut (par défaut, sur Android, TextInput multiligne centre le texte verticalement).
Pour saisir un numéro de téléphone, un formatage en temps réel est souvent nécessaire. En combinant onChangeText avec des expressions régulières, vous pouvez implémenter un masque de saisie.
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}
/>
);
};
La fonction formatPhone supprime tous les caractères non numériques et formate le numéro dans un format international standard. keyboardType: 'phone-pad' affiche le clavier téléphonique. Cette approche améliore l'UX pour la saisie des numéros de téléphone et prévient les erreurs de formatage.
Questions fréquentes
value est utilisé en mode contrôlé — React gère le texte affiché via l'état. defaultValue est utilisé en mode non contrôlé — il définit la valeur initiale, et les modifications ultérieures sont stockées dans le composant.
Définissez la prop secureTextEntry sur true. TextInput masquera les caractères saisis, en les remplaçant par des points ou des astérisques. Pour plus de sécurité, vous pouvez le combiner avec maxLength et autoCapitalize: 'none'.
onChangeText est appelé à chaque modification du texte, y compris l'insertion et la suppression d'un seul caractère. C'est le comportement normal d'un composant contrôlé. Pour l'optimisation, vous pouvez utiliser debounce ou mettre à jour l'état lors de onEndEditing.
TextInput ne prend pas en charge les éléments imbriqués directement. La solution est de créer un conteneur View avec Flexbox, à l'intérieur duquel vous placez une icône et TextInput. Le style du conteneur imite la bordure du champ de saisie, et TextInput s'étend pour remplir l'espace restant.
Sur Android, TextInput a par défaut une bordure inférieure (Material Design). Désactivez-la avec underlineColorAndroid: 'transparent'. Cette prop fonctionne uniquement sur Android et supprime la ligne visuelle sous le texte.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi