Вопрос проверяет понимание принципов иммутабельности в управлении состоянием, что критично для корректной работы реактивных систем и предотвращения трудноуловимых багов.
Прямая мутация состояния — это изменение значений внутри существующего объекта или массива без создания новой ссылки. В контексте React, Redux и многих других систем управления состоянием это считается антипаттерном, потому что нарушает принцип иммутабельности (неизменяемости данных).
Рассмотрим типичную ошибку при обновлении массива в React-компоненте:
// ❌ ПЛОХО: прямая мутация
const [todos, setTodos] = useState([{ id: 1, text: 'Learn React' }]);
const addTodoBad = (newTodo) => {
todos.push(newTodo); // Мутация существующего массива!
setTodos(todos); // Ссылка не изменилась, React может проигнорировать обновление
};
// ✅ ХОРОШО: создание нового массива
const addTodoGood = (newTodo) => {
setTodos([...todos, newTodo]); // Новый массив, новая ссылка
};
// Пример с объектом
const [user, setUser] = useState({ name: 'Alice', age: 30 });
// ❌ user.age = 31;
// ✅ setUser({ ...user, age: 31 });Принцип неизменяемости состояния является краеугольным камнем не только в React и Redux, но и в библиотеках для глобального состояния (MobX, хотя он использует наблюдаемые объекты, также рекомендует аккуратные мутации), в функциональном программировании, и даже в системах типа Immer, которые предоставляют API для записи мутабельного кода, но под капотом генерируют новые неизменяемые структуры.
Вывод: Избегайте прямой мутации состояния, чтобы обеспечить предсказуемость, упростить отладку и гарантировать корректную работу реактивных систем и их оптимизаций. Всегда создавайте новые объекты или массивы при обновлении.
Уровень
Рейтинг:
4
Сложность:
3
Навыки
JavaScript
React
Ключевые слова
Подпишись на React Developer в телеграм