> Как передавать данные в обработчик сабмита, помещенный в useCallback в React (React)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Milk and Cartoons

Стек: React

> Пример ответа

Для передачи данных в обработчик сабмита, обернутый в useCallback, используйте замыкание или передачу аргументов через стрелочную функцию. Вот пример:

JSX
import React, { useCallback, useState } from 'react';
function MyForm() {
const [formData, setFormData] = useState({ name: '', email: '' });
// Способ 1: данные уже в замыкании (если они из стейта или пропсов)
const handleSubmit = useCallback((event) => {
event.preventDefault();
console.log('Отправка данных:', formData); // formData из замыкания
}, [formData]); // зависимость от formData
// Способ 2: передача дополнительных данных через аргументы
const handleSubmitWithExtra = useCallback((event, extraData) => {
event.preventDefault();
console.log('Данные формы:', formData, 'Доп. данные:', extraData);
}, [formData]);
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={formData.name}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
/>
<button type="submit">Отправить</button>
{/* Пример с дополнительными данными */}
<button onClick={(e) => handleSubmitWithExtra(e, { source: 'кнопка' })}>
Отправить с доп. данными
</button>
</form>
);
}

Ключевые моменты:

  • Если данные уже доступны в компоненте (стейт, пропсы), они автоматически захватываются замыканием useCallback. Укажите их в массиве зависимостей, чтобы обработчик обновлялся при изменении данных.

  • Для передачи уникальных данных (например, ID из цикла) используйте стрелочную функцию в onSubmit или onClick, которая вызывает handleSubmit с нужными аргументами.

  • Избегайте передачи объектов или массивов, создаваемых при каждом рендере, без мемоизации - это может привести к лишним ререндерам.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью