В setState() передают функцию, чтобы получить актуальное состояние на момент изменения 🔄 Это важно из‑за асинхронности работы setState!
// ❌ Может сломаться:
setState({count: state.count + 1});
// ✅ Правильно:
setState(prevState => ({count: prevState.count + 1}));
setState(prev => ({count: prev.count + 1})); // 0 + 1 = 1
Передача функции в setState() — как попросить друга запомнить, что именно нужно купить, а не писать список заново! 🛒
React обновляет состояние асинхронно — не сразу:
// ❌ Проблема:
function handleClick() {
// Представим, что count = 0
setState({count: state.count + 1}); // 0 + 1 = 1
setState({count: state.count + 1}); // 0 + 1 = 1 (опять!)
setState({count: state.count + 1}); // 0 + 1 = 1 (и снова!)
// Результат: count = 1, а не 3!
}Почему так происходит:
Функция получает актуальное предыдущее состояние:
// ✅ Решение:
function handleClick() {
setState(prev => ({count: prev.count + 1})); // 0 + 1 = 1
setState(prev => ({count: prev.count + 1})); // 1 + 1 = 2
setState(prev => ({count: prev.count + 1})); // 2 + 1 = 3
// Результат: count = 3 ✅
}Как это работает:
// ✅ Нужно для нескольких изменений подряд
const increment = () => {
setState(prev => ({count: prev.count + 1}));
setState(prev => ({count: prev.count + 1}));
setState(prev => ({count: prev.count + 1}));
};// ✅ Когда новое состояние зависит от старого
const toggle = () => {
setState(prev => ({isOpen: !prev.isOpen}));
};
const addItem = () => {
setState(prev => ({
items: [...prev.items, newItem]
}));
};// ✅ Можно без функции, если полностью заменяем
setState({name: 'Новое имя'});
setState({age: 25});
setState({isLoggedIn: true});// ✅ Не зависит от предыдущего состояния
const resetForm = () => {
setState({
name: '',
email: '',
message: ''
});
};// ❌ Ошибка — думать, что setState синхронный
const handleClick = () => {
setState({count: state.count + 1});
console.log(state.count); // Старое значение!
};
// ✅ Правильно — использовать useEffect или callback// ❌ Ошибка — смешивать в одном обработчике
const handleClick = () => {
setState({count: state.count + 1}); // ❌
setState(prev => ({count: prev.count + 1})); // ✅
setState({count: state.count + 1}); // ❌
};Передача функции в setState() — как получать свежую информацию перед принятием решений! 💡
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪