Компонент TextInput у React Native — основний елемент для введення тексту користувачем, аналог HTML-елемента input. TextInput підтримує контрольований і неконтрольований стан, різні типи клавіатури, маски введення та обробку подій фокусу. За даними React Native Docs, 2024, TextInput є ключовим компонентом для форм, пошуку, чатів та будь-яких сценаріїв із введенням користувача. Компонент автоматично адаптується до платформи, використовуючи нативні UITextField на iOS та EditText на Android.
Головне
TextInput — це компонент React Native, який дозволяє користувачеві вводити текст з клавіатури пристрою. Він є основним будівельним блоком для форм реєстрації, пошукових рядків, полів введення повідомлень та будь-яких інших сценаріїв, де потрібне введення користувача. На відміну від веб-розробки, де існують окремі типи input (text, email, password, search), у React Native всі ці варіанти реалізуються через один компонент TextInput із різними пропсами.
TextInput підтримує два режими роботи: контрольований(керований через стан React) та неконтрольований (з рефом). У контрольованому режимі значення поля зберігається в стані компонента та оновлюється через колбек onChangeText. Цей підхід рекомендується для більшості застосунків, оскільки він забезпечує єдине джерело істини та спрощує валідацію.
За даними React Native Handling Text Input, 2024, TextInput автоматично адаптується до платформи: на iOS використовується нативний UITextField, на Android — EditText. Це забезпечує коректну роботу автозаповнення, автокорекції та системних меню (вирізати/копіювати/вставити) без додаткового налаштування.
TextInput надає розширений набір пропсів для керування введенням, зовнішнім виглядом та поведінкою. Усі пропси поділяються на кілька категорій: керування значенням, тип клавіатури, стилізація, події та платформенні особливості.
value — поточне значення поля (для контрольованого режиму). onChangeText — колбек, що викликається при кожній зміні тексту. placeholder — текст-підказка, що відображається коли поле порожнє. defaultValue — початкове значення для неконтрольованого режиму. maxLength обмежує максимальну кількість символів, які може ввести користувач.
Компонент підтримує onFocus(поле отримало фокус), onBlur (поле втратило фокус), onSubmitEditing (користувач натиснув Enter/Return), onKeyPress (натискання клавіші). Подія onEndEditing викликається після завершення редагування при втраті фокусу. Ці колбеки дозволяють реалізувати складну логіку валідації та надсилання форм.
На iOS доступні: clearButtonMode (кнопка очищення), keyboardAppearance (світла/темна клавіатура), returnKeyType (тип кнопки Return), enablesReturnKeyAutomatically. На Android доступні: textContentType (автозаповнення), underlineColorAndroid, inlineImageLeft. secureTextEntry працює на обох платформах для введення паролів.
У React Native TextInput може працювати в двох режимах. У контрольованому режимі React керує значенням поля: ви передаєте значення зі стану та оновлюєте його через onChangeText. У неконтрольованому режимі React лише ініціалізує поле, а DOM-подібне значення зберігається всередині нативного компонента.
Контрольований режим рекомендується для всіх форм, де потрібна валідація, фільтрація або форматування введених даних. Стан поля синхронізовано зі станом React-компонента, що дає повний контроль над значенням.
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>
);
};
У цьому прикладі обидва поля використовують контрольований режим. Email має тип клавіатури email-address та вимкнений автокапітал. Пароль використовує secureTextEntry для приховування символів та обмежений 32 символами через maxLength.
Неконтрольований режим підходить для простих полів, де не потрібна валідація або миттєва реакція на введення. Значення поля вилучається через реф у момент надсилання форми.
const SimpleSearch = () => {
const inputRef = useRef(null);
const handleSearch = () => {
console.log(inputRef.current.value());
};
return (
<TextInput
ref={inputRef}
placeholder="Search..."
onSubmitEditing={handleSearch}
/>
);
};
У неконтрольованому режимі компонент рендериться швидше, оскільки не потребує синхронізації стану при кожній зміні тексту. Однак ви втрачаєте можливість фільтрувати, форматувати або валідувати введення в реальному часі.
TextInput підтримує різні типи клавіатури, які адаптують розкладку під очікуваний формат введення. Вибір правильного типу клавіатури покращує користувацький досвід та знижує кількість помилок введення на мобільних пристроях.
| Значення keyboardType | Опис | Коли використовувати |
|---|---|---|
| default | Стандартна алфавітна клавіатура | Ім'я, прізвище, адреса |
| numeric | Цифрова клавіатура (тільки цифри) | Вік, кількість, PIN-код |
| email-address | Клавіатура з @ та .com | Поле email у формі реєстрації |
| phone-pad | Телефонна клавіатура з + та # | Номер телефону |
| url | Клавіатура з / та .com | Введення веб-адреси |
| decimal-pad | Цифрова клавіатура з десятковою крапкою | Ціна, вага, розмір |
На iOS доступні додаткові типи: numbers-and-punctuation, twitter, web-search (з голосовим пошуком). На Android також доступний visible-password (показує пароль). Правильний вибір keyboardType — важливий аспект UX мобільного застосунку.
Платформенні особливості також включають autoCapitalize(автоматичний капітал першого слова), autoCorrect (автокорекція), spellCheck (перевірка орфографії), textContentType (автозаповнення на iOS). Ці пропси працюють по-різному на кожній платформі та потребують тестування.
Розглянемо два реальні сценарії: багаторядкове поле для введення повідомлення та поле з маскованим введенням номера телефону. Обидва використовують TextInput із різними пропсами для досягнення потрібної поведінки.
Для введення довгого тексту (коментарі, опис) TextInput перемикається в багаторядковий режим через пропс multiline. У цьому режимі поле росте вертикально та підтримує перенесення рядків.
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"
/>
);
};
Пропс multiline вмикає багаторядковий режим, numberOfLines задає початкову висоту в рядках. textAlignVertical: 'top' вирівнює текст по верхньому краю (за замовчуванням на Android багаторядковий TextInput центрує текст вертикально).
Для введення номера телефону часто потрібне форматування в реальному часі. Комбінуючи onChangeText із регулярними виразами, можна реалізувати маску введення.
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}
/>
);
};
Функція formatPhone видаляє всі нецифрові символи та форматує номер у стандартний міжнародний формат. keyboardType: 'phone-pad' показує телефонну клавіатуру. Такий підхід покращує UX для введення телефонних номерів та запобігає помилкам форматування.
Поширені запитання
value використовується в контрольованому режимі — React керує відображуваним текстом через стан. defaultValue використовується в неконтрольованому режимі — задає початкове значення, а подальші зміни зберігаються всередині компонента.
Встановіть пропс secureTextEntry у true. TextInput приховає символи, що вводяться, замінюючи їх крапками або зірочками. Для додаткової безпеки можна комбінувати з maxLength та autoCapitalize: 'none'.
onChangeText викликається при кожній зміні тексту, включаючи вставку та видалення одного символу. Це нормальна поведінка контрольованого компонента. Для оптимізації можна використовувати debounce або оновлювати стан при onEndEditing.
TextInput не підтримує вкладені елементи безпосередньо. Рішення — створити View-контейнер із Flexbox, всередині якого розмістити іконку та TextInput. Стиль контейнера імітує границю поля введення, а TextInput розтягується на простір, що залишився.
На Android TextInput за замовчуванням має нижню границю (Material Design). Вимкніть її через underlineColorAndroid: 'transparent'. Цей пропс працює тільки на Android та видаляє візуальну лінію під текстом.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.