TextInput — що це, введення тексту та React Native

Автор: IT Sectr Опубліковано: 2026-07-05 Час читання: 9 хв

Компонент TextInput у React Native — основний елемент для введення тексту користувачем, аналог HTML-елемента input. TextInput підтримує контрольований і неконтрольований стан, різні типи клавіатури, маски введення та обробку подій фокусу. За даними React Native Docs, 2024, TextInput є ключовим компонентом для форм, пошуку, чатів та будь-яких сценаріїв із введенням користувача. Компонент автоматично адаптується до платформи, використовуючи нативні UITextField на iOS та EditText на Android.

Головне

  • TextInput — компонент React Native для введення тексту, аналог HTML input
  • Підтримує контрольований стан через value + onChangeText
  • Надає типи клавіатури: default, numeric, email, phone, url
  • Рендериться як UITextField на iOS та EditText на Android
  • Підтримує багаторядкове введення, placeholder та secureTextEntry для паролів

Що таке TextInput у React Native

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. Це забезпечує коректну роботу автозаповнення, автокорекції та системних меню (вирізати/копіювати/вставити) без додаткового налаштування.

Властивості та API компонента TextInput

TextInput надає розширений набір пропсів для керування введенням, зовнішнім виглядом та поведінкою. Усі пропси поділяються на кілька категорій: керування значенням, тип клавіатури, стилізація, події та платформенні особливості.

Пропси керування значенням

value — поточне значення поля (для контрольованого режиму). onChangeText — колбек, що викликається при кожній зміні тексту. placeholder — текст-підказка, що відображається коли поле порожнє. defaultValue — початкове значення для неконтрольованого режиму. maxLength обмежує максимальну кількість символів, які може ввести користувач.

Події TextInput

Компонент підтримує 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-подібне значення зберігається всередині нативного компонента.

Контрольований TextInput

Контрольований режим рекомендується для всіх форм, де потрібна валідація, фільтрація або форматування введених даних. Стан поля синхронізовано зі станом React-компонента, що дає повний контроль над значенням.

js
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.

Неконтрольований TextInput

Неконтрольований режим підходить для простих полів, де не потрібна валідація або миттєва реакція на введення. Значення поля вилучається через реф у момент надсилання форми.

js
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 із різними пропсами для досягнення потрібної поведінки.

Приклад 1: багаторядкове поле для повідомлення

Для введення довгого тексту (коментарі, опис) TextInput перемикається в багаторядковий режим через пропс multiline. У цьому режимі поле росте вертикально та підтримує перенесення рядків.

js
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 центрує текст вертикально).

Приклад 2: поле з форматуванням номера телефону

Для введення номера телефону часто потрібне форматування в реальному часі. Комбінуючи onChangeText із регулярними виразами, можна реалізувати маску введення.

js
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 та defaultValue у TextInput?

value використовується в контрольованому режимі — React керує відображуваним текстом через стан. defaultValue використовується в неконтрольованому режимі — задає початкове значення, а подальші зміни зберігаються всередині компонента.

Як приховати текст, що вводиться, для пароля?

Встановіть пропс secureTextEntry у true. TextInput приховає символи, що вводяться, замінюючи їх крапками або зірочками. Для додаткової безпеки можна комбінувати з maxLength та autoCapitalize: 'none'.

Чому onChangeText викликається при кожному натисканні?

onChangeText викликається при кожній зміні тексту, включаючи вставку та видалення одного символу. Це нормальна поведінка контрольованого компонента. Для оптимізації можна використовувати debounce або оновлювати стан при onEndEditing.

Як зробити TextInput з іконкою всередині?

TextInput не підтримує вкладені елементи безпосередньо. Рішення — створити View-контейнер із Flexbox, всередині якого розмістити іконку та TextInput. Стиль контейнера імітує границю поля введення, а TextInput розтягується на простір, що залишився.

Як прибрати підкреслення у TextInput на Android?

На Android TextInput за замовчуванням має нижню границю (Material Design). Вимкніть її через underlineColorAndroid: 'transparent'. Цей пропс працює тільки на Android та видаляє візуальну лінію під текстом.

Підсумки

  • TextInput — основний компонент React Native для введення тексту, аналог HTML input із розширеними можливостями
  • Підтримує контрольований (value + onChangeText) та неконтрольований режими роботи
  • Надає типи клавіатури (default, numeric, email, phone, url) та secureTextEntry для паролів
  • Багаторядковий режим через multiline із numberOfLines та textAlignVertical
  • Ключові події: onFocus, onBlur, onChangeText, onSubmitEditing, onEndEditing
  • Платформенні пропси включають textContentType (iOS), underlineColorAndroid (Android)
  • Для масок введення використовуйте onChangeText із форматуванням через регулярні вирази

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також