Формы — это основной способ взаимодействия пользователя с приложением. Они позволяют вводить текст, отправлять данные, авторизовываться, заполнять профили и многое другое. В React Native работа с формами похожа на веб-разработку, но есть свои нюансы, такие как управление клавиатурой на мобильных устройствах.

Сегодня мы разберём:

  • Как работать с текстовыми полями (TextInput).
  • Как управлять клавиатурой.
  • Использование библиотеки Formik для упрощения работы с формами.
  • На практике создадим форму регистрации с валидацией.

Теория: текстовые поля и клавиатура

TextInput

TextInput — это основной компонент для ввода текста в React Native. Он гибкий, поддерживает стилизацию и разные события, такие как ввод текста, фокус, размытие (blur).

Пример TextInput:

import React, { useState } from 'react';
import { View, TextInput, Text, StyleSheet } from 'react-native';

const TextInputExample = () => {
  const [value, setValue] = useState('');

  return (
    <View style={styles.container}>
      <Text style={styles.label}>Введите текст:</Text>
      <TextInput
        style={styles.input}
        value={value} // Значение текстового поля
        onChangeText={setValue} // Обработчик изменения текста
        placeholder="Например, ваше имя"
      />
      <Text>Вы ввели: {value}</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: { padding: 20 },
  label: { marginBottom: 10, fontSize: 16 },
  input: {
    borderWidth: 1,
    borderColor: '#ccc',
    padding: 10,
    borderRadius: 5,
    marginBottom: 10,
  },
});

export default TextInputExample;

Управление клавиатурой

На мобильных устройствах клавиатура может перекрывать текстовые поля. Чтобы с этим справляться:

  • Используйте KeyboardAvoidingView, чтобы переместить содержимое экрана.
  • Используйте Keyboard.dismiss() для скрытия клавиатуры при клике вне текстового поля.

Пример работы с клавиатурой:

import React, { useState } from 'react';
import {
  View,
  TextInput,
  Text,
  StyleSheet,
  KeyboardAvoidingView,
  TouchableWithoutFeedback,
  Keyboard,
  Platform,
} from 'react-native';

const KeyboardExample = () => {
  const [value, setValue] = useState('');

  return (
    <KeyboardAvoidingView
      style={styles.container}
      behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
    >
      <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
        <View style={styles.inner}>
          <Text style={styles.label}>Введите текст:</Text>
          <TextInput
            style={styles.input}
            value={value}
            onChangeText={setValue}
            placeholder="Введите что-нибудь"
          />
          <Text>Вы ввели: {value}</Text>
        </View>
      </TouchableWithoutFeedback>
    </KeyboardAvoidingView>
  );
};

const styles = StyleSheet.create({
  container: { flex: 1 },
  inner: { padding: 20, flex: 1, justifyContent: 'center' },
  label: { marginBottom: 10, fontSize: 16 },
  input: {
    borderWidth: 1,
    borderColor: '#ccc',
    padding: 10,
    borderRadius: 5,
    marginBottom: 10,
  },
});

export default KeyboardExample;

Formik: удобная работа с формами

Formik — это библиотека, которая упрощает создание и управление формами в React (включая React Native). Она помогает:

  • Управлять состоянием формы.
  • Обрабатывать ввод и отправку данных.
  • Валидировать поля.

Formik работает отлично в связке с библиотекой Yup для валидации. Установим их:

npm install formik yup

Практика: форма регистрации с валидацией

Создадим простую форму регистрации, где пользователь вводит имя, email и пароль. Будем проверять:

  • Имя не может быть пустым.
  • Email должен быть в правильном формате.
  • Пароль должен быть не короче 6 символов.

Код формы регистрации

import React from 'react';
import { View, Text, TextInput, Button, StyleSheet } from 'react-native';
import { Formik } from 'formik';
import * as Yup from 'yup';

// Валидация с помощью Yup
const validationSchema = Yup.object({
  name: Yup.string().required('Имя обязательно'),
  email: Yup.string().email('Некорректный email').required('Email обязателен'),
  password: Yup.string()
    .min(6, 'Пароль должен содержать не менее 6 символов')
    .required('Пароль обязателен'),
});

const RegistrationForm = () => {
  return (
    <Formik
      initialValues={{ name: '', email: '', password: '' }}
      validationSchema={validationSchema}
      onSubmit={(values) => {
        console.log('Данные формы:', values);
        alert('Регистрация успешна!');
      }}
    >
      {({
        handleChange,
        handleSubmit,
        values,
        errors,
        touched,
        handleBlur,
      }) => (
        <View style={styles.container}>
          {/* Поле ввода имени */}
          <Text style={styles.label}>Имя</Text>
          <TextInput
            style={styles.input}
            onChangeText={handleChange('name')}
            onBlur={handleBlur('name')} // Обработка ухода фокуса
            value={values.name}
            placeholder="Введите ваше имя"
          />
          {touched.name && errors.name && (
            <Text style={styles.error}>{errors.name}</Text>
          )}

          {/* Поле ввода email */}
          <Text style={styles.label}>Email</Text>
          <TextInput
            style={styles.input}
            onChangeText={handleChange('email')}
            onBlur={handleBlur('email')}
            value={values.email}
            placeholder="Введите ваш email"
            keyboardType="email-address"
          />
          {touched.email && errors.email && (
            <Text style={styles.error}>{errors.email}</Text>
          )}

          {/* Поле ввода пароля */}
          <Text style={styles.label}>Пароль</Text>
          <TextInput
            style={styles.input}
            onChangeText={handleChange('password')}
            onBlur={handleBlur('password')}
            value={values.password}
            placeholder="Введите пароль"
            secureTextEntry
          />
          {touched.password && errors.password && (
            <Text style={styles.error}>{errors.password}</Text>
          )}

          {/* Кнопка отправки */}
          <Button title="Зарегистрироваться" onPress={handleSubmit} />
        </View>
      )}
    </Formik>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    padding: 20,
    backgroundColor: '#f5f5f5',
  },
  label: {
    fontSize: 16,
    marginBottom: 5,
  },
  input: {
    borderWidth: 1,
    borderColor: '#ccc',
    padding: 10,
    borderRadius: 5,
    marginBottom: 10,
    backgroundColor: '#fff',
  },
  error: {
    color: 'red',
    marginBottom: 10,
  },
});

export default RegistrationForm;

Разберём код

Formik

  • Мы используем initialValues для начального состояния формы.
  • Валидация обрабатывается с помощью Yup.
  • Метод handleSubmit вызывается при нажатии на кнопку отправки.

Yup

  • Проверяем, что поля заполнены.
  • Указываем формат email.
  • Проверяем длину пароля.

UI

  • Используем TextInput для ввода данных.
  • Отображаем ошибки под соответствующими полями.

Дополнения и улучшения

  • Скрытие клавиатуры: Оберните форму в TouchableWithoutFeedback, чтобы скрывать клавиатуру при нажатии вне полей.
  • Добавьте лоадер: Показывайте индикатор загрузки при отправке данных на сервер.
  • Запрос на сервер: Подключите API для отправки данных формы.
 

Комментарии

0

Без регистрации и смс