← Назад к вопросам

Быстрее работает React Hook Form или Formik

2.0 Middle🔥 201 комментариев
#React

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

React Hook Form vs Formik: Производительность и сравнение

Краткий ответ

React Hook Form (RHF) быстрее чем Formik. RHF — это минималистичная библиотека, которая использует неконтролируемые компоненты и минимизирует ре-рендеры. Formik создает больше ре-рендеров из-за управления состоянием формы через React state.

Различия в архитектуре

React Hook Form:

  • Использует неконтролируемые компоненты (uncontrolled inputs)
  • Работает с DOM напрямую через ref
  • Минимальное количество ре-рендеров
  • Размер бандла: ~9.6 KB (gzipped)
  • Более высокая производительность
import { useForm } from 'react-hook-form';

function MyForm() {
  const { register, handleSubmit, watch } = useForm({
    defaultValues: { name: '', email: '' }
  });
  
  const onSubmit = (data) => console.log(data);
  
  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('name')} />
      <input {...register('email')} />
      <button type="submit">Send</button>
    </form>
  );
}

Formik:

  • Использует контролируемые компоненты (controlled inputs)
  • Управляет состоянием формы через React state
  • Больше ре-рендеров при изменении полей
  • Размер бандла: ~16 KB (gzipped)
  • Меньшая производительность для больших форм
import { Formik, Form, Field } from 'formik';

function MyForm() {
  return (
    <Formik
      initialValues={{ name: '', email: '' }}
      onSubmit={(values) => console.log(values)}
    >
      <Form>
        <Field name="name" />
        <Field name="email" />
        <button type="submit">Send</button>
      </Form>
    </Formik>
  );
}

Подробное сравнение

ПараметрReact Hook FormFormik
Размер бандла9.6 KB16 KB
Ре-рендерыМинимальные (только подписанные поля)Больше (при изменении state)
ПроизводительностьВысокаяСредняя
Кривая обученияКрутая (нужно понять ref и RHF API)Пологая (более интуитивно)
ФункциональностьБазовая, но расширяемаяПолная из коробки
TypeScript поддержкаОтличная (встроенная)Хорошая
СообществоРастущееБольшое и зрелое
Интеграция с UI библиотекамиХорошаяОтличная

Производительность на практике

React Hook Form — минимум ре-рендеров:

import { useForm } from 'react-hook-form';
import { useCallback } from 'react';

function RHFExample() {
  const { register, watch, formState: { errors } } = useForm();
  
  // watch() подписывает только на конкретные поля
  const email = watch('email');
  
  // Рендер происходит только при изменении email
  return (
    <div>
      <input {...register('name')} />
      <input {...register('email')} />
      <p>Email: {email}</p>
    </div>
  );
}

Formik — больше ре-рендеров:

import { Formik, Form, Field } from 'formik';

function FormikExample() {
  return (
    <Formik
      initialValues={{ name: '', email: '' }}
      onSubmit={(values) => {}}
    >
      {({ values }) => (
        <Form>
          <Field name="name" />
          <Field name="email" />
          {/* При изменении ЛЮБОГО поля весь компонент ре-рендерится */}
          <p>Email: {values.email}</p>
        </Form>
      )}
    </Formik>
  );
}

Результаты бенчмарков

На основе официальных тестов и сообщества:

React Hook Form:

  • Простая форма (5 полей): ~50ms
  • Большая форма (50 полей): ~150ms
  • Валидация: быстро

Formik:

  • Простая форма (5 полей): ~100ms
  • Большая форма (50 полей): ~400ms
  • Валидация: медленнее

RHF примерно в 2-3 раза быстрее на больших формах.

Когда использовать React Hook Form

  1. Нужна высокая производительность — особенно для больших форм
  2. Простые формы без сложной логики валидации
  3. Хочешь минимизировать размер бандла
  4. Работаешь с неконтролируемыми компонентами
  5. Нужна TypeScript типизация
import { useForm } from 'react-hook-form';

function PerformantForm() {
  const { register, handleSubmit, formState: { errors } } = useForm();
  
  return (
    <form onSubmit={handleSubmit((data) => console.log(data))}>
      <input
        {...register('name', { required: 'Name is required' })}
        placeholder="Name"
      />
      {errors.name && <p>{errors.name.message}</p>}
      
      <input
        {...register('email', {
          required: 'Email is required',
          pattern: { value: /^[^@]+@[^@]+$/, message: 'Invalid email' }
        })}
        placeholder="Email"
      />
      {errors.email && <p>{errors.email.message}</p>}
      
      <button type="submit">Submit</button>
    </form>
  );
}

Когда использовать Formik

  1. Нужна полная функциональность из коробки
  2. Сложная валидация и логика формы
  3. Работаешь с контролируемыми компонентами
  4. Большая команда, нужен стандартный подход
  5. Интеграция с UI библиотеками (Material-UI, Ant Design)
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';

const validationSchema = Yup.object().shape({
  name: Yup.string().required('Name is required'),
  email: Yup.string().email('Invalid email').required('Email is required')
});

function FormikForm() {
  return (
    <Formik
      initialValues={{ name: '', email: '' }}
      validationSchema={validationSchema}
      onSubmit={(values) => console.log(values)}
    >
      <Form>
        <Field name="name" placeholder="Name" />
        <ErrorMessage name="name" component="div" />
        
        <Field name="email" placeholder="Email" />
        <ErrorMessage name="email" component="div" />
        
        <button type="submit">Submit</button>
      </Form>
    </Formik>
  );
}

React Hook Form + Zod для валидации

Современный подход — RHF с Zod или Yup:

import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';

const schema = z.object({
  name: z.string().min(1, 'Name is required'),
  email: z.string().email('Invalid email')
});

function ModernForm() {
  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: zodResolver(schema)
  });
  
  return (
    <form onSubmit={handleSubmit((data) => console.log(data))}>
      <input {...register('name')} placeholder="Name" />
      {errors.name && <p>{errors.name.message}</p>}
      
      <input {...register('email')} placeholder="Email" />
      {errors.email && <p>{errors.email.message}</p>}
      
      <button type="submit">Submit</button>
    </form>
  );
}

Заключение

React Hook Form быстрее, чем Formik из-за:

  • Неконтролируемых компонентов
  • Минимальных ре-рендеров
  • Более легкого бандла
  • Прямой работы с DOM

Для современной разработки фронтенда React Hook Form — это оптимальный выбор, особенно для производительности. Formik все еще полезен для сложных форм с богатой функциональностью и хорошей интеграцией с UI библиотеками.