Как реализовать форму с полями ввода?

Создание формы с полями ввода в React Native включает в себя использование компонента TextInput и отслеживание ввода пользователя через состояние (state), часто в сочетании с обработкой кнопки отправки и валидацией данных. В более сложных случаях используются библиотеки вроде formik, react-hook-form и yup для управления формой и валидацией.

Основной компонент: TextInput

TextInput — компонент для ввода текста пользователем. Работает аналогично input в HTML и может быть настроен для разных типов данных: текст, email, пароль, телефон, числа и т.д.

Пример простой формы (имя + email)

import React, { useState } from 'react';
import { View, TextInput, Button, Text, StyleSheet, Alert } from 'react-native';
export default function App() {
const \[name, setName\] = useState('');
const \[email, setEmail\] = useState('');
const handleSubmit = () => {
if (name.trim() === '' || email.trim() === '') {
Alert.alert('Ошибка', 'Пожалуйста, заполните все поля');
return;
}
console.log('Имя:', name);
console.log('Email:', email);
Alert.alert('Успех', \`Добро пожаловать, ${name}\`);
};
return (
<View style={styles.container}>
<Text style={styles.label}>Имя</Text>
<TextInput
style={styles.input}
placeholder="Введите имя"
value={name}
onChangeText={setName}
/>
&lt;Text style={styles.label}&gt;Email&lt;/Text&gt;
<TextInput
style={styles.input}
placeholder="Введите email"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
/>
&lt;Button title="Отправить" onPress={handleSubmit} /&gt;
&lt;/View&gt;
);
}
const styles = StyleSheet.create({
container: {
padding: 20,
marginTop: 50,
},
label: {
marginVertical: 8,
fontWeight: 'bold',
},
input: {
borderWidth: 1,
borderColor: '#ccc',
padding: 10,
borderRadius: 4,
},
});

Основные props компонента TextInput

Свойство Назначение
value Значение поля
--- ---
onChangeText Функция, вызываемая при каждом вводе символа
--- ---
placeholder Текст-заполнитель
--- ---
keyboardType Тип клавиатуры (default, email-address, numeric, phone-pad)
--- ---
secureTextEntry Скрытие текста для паролей
--- ---
autoCapitalize Управление автокапитализацией (none, sentences, words, characters)
--- ---
multiline Многострочный ввод
--- ---
numberOfLines Кол-во видимых строк (если multiline)
--- ---
editable Можно ли редактировать
--- ---
onSubmitEditing Событие при нажатии "Enter" или "Done" на клавиатуре
--- ---
returnKeyType Тип кнопки (например, done, next)
--- ---

Ввод пароля

<TextInput
secureTextEntry={true}
placeholder="Пароль"
value={password}
onChangeText={setPassword}
/>

Управление фокусом между полями

Можно использовать ref и метод focus:

const emailRef = useRef(null);
<TextInput
placeholder="Имя"
returnKeyType="next"
onSubmitEditing={() => emailRef.current.focus()}
/>
<TextInput
placeholder="Email"
ref={emailRef}
/>

Очистка формы

Просто сбросьте значения состояний:

setName('');
setEmail('');

Подключение клавиатуры

Чтобы скрыть клавиатуру при нажатии вне поля ввода:

import { Keyboard, TouchableWithoutFeedback } from 'react-native';
&lt;TouchableWithoutFeedback onPress={Keyboard.dismiss}&gt;
&lt;View&gt;{/\* форма \*/}&lt;/View&gt;
&lt;/TouchableWithoutFeedback&gt;

Простая ручная валидация

if (email.trim() === '' || !email.includes('@')) {
Alert.alert('Ошибка', 'Введите корректный email');
}

Подключение библиотеки Formik (управление формой)

npm install formik

Пример:

import { Formik } from 'formik';
<Formik
initialValues={{ name: '', email: '' }}
onSubmit={(values) => console.log(values)}
\>
{({ handleChange, handleBlur, handleSubmit, values }) => (
&lt;View&gt;
<TextInput
placeholder="Имя"
onChangeText={handleChange('name')}
onBlur={handleBlur('name')}
value={values.name}
/>
<TextInput
placeholder="Email"
onChangeText={handleChange('email')}
onBlur={handleBlur('email')}
value={values.email}
keyboardType="email-address"
/>
&lt;Button onPress={handleSubmit} title="Отправить" /&gt;
&lt;/View&gt;
)}
&lt;/Formik&gt;

Валидация через Yup

npm install yup
import \* as Yup from 'yup';
const validationSchema = Yup.object().shape({
name: Yup.string().required('Введите имя'),
email: Yup.string().email('Неверный email').required('Введите email'),
});

И передаётся в Formik:

<Formik
initialValues={{ name: '', email: '' }}
validationSchema={validationSchema}
onSubmit={...}
\>
...
&lt;/Formik&gt;

Отображение ошибок

{errors.email && touched.email && (
&lt;Text style={{ color: 'red' }}&gt;{errors.email}&lt;/Text&gt;
)}

Пример формы с 3 полями и валидацией вручную

const \[name, setName\] = useState('');
const \[email, setEmail\] = useState('');
const \[password, setPassword\] = useState('');
const handleSubmit = () => {
if (!name || !email || !password) {
Alert.alert('Ошибка', 'Все поля обязательны');
return;
}
if (!email.includes('@')) {
Alert.alert('Ошибка', 'Введите корректный email');
return;
}
if (password.length < 6) {
Alert.alert('Ошибка', 'Пароль слишком короткий');
return;
}
console.log({ name, email, password });
};

Советы по UX

  • Используйте keyboardType для удобной клавиатуры.

  • Используйте returnKeyType="next" для переключения между полями.

  • Добавляйте placeholder и подписи (label) для ясности.

  • Добавляйте autoCapitalize="none" для email/паролей.

  • Добавьте show/hide password кнопку к полям с паролем.

  • Скрывайте клавиатуру при тапе вне поля.

  • Обязательно показывайте ошибки валидации.

Создание формы в React Native требует комбинирования TextInput, состояний (useState, Formik, react-hook-form), управления клавиатурой и визуального отклика. Такой подход обеспечивает интерактивные и валидируемые формы, адаптированные под мобильные платформы.