Pure function
Чистая функция не меняет никаких объектов или переменных, которые существовали до её вызова. При указании одинаковых входных данных должен быть всегда один и тот же результат.
В контексте React чистая функция — это функция, которая:
- Детерминирована — при одинаковых входных данных всегда возвращает одинаковый результат.
- Не изменяет внешнее состояние — не мутирует
props,stateили глобальные переменные.
React предполагает, что каждый написанный компонент является чистой функцией. React всегда должен возвращать один и тот же JSX при одинаковых входных данных.
Примеры чистых и нечистых функций в React
✅ Чистая функция (без побочных эффектов):
function add(a: number, b: number) {
return a + b;
}
console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5 (всегда один и тот же результат)
❌ Нечистая функция (изменяет внешнее состояние):
let total = 0;
function addToTotal(value: number) {
total += value;
return total;
}
console.log(addToTotal(5)); // 5
console.log(addToTotal(5)); // 10 (изменяется внешнее состояние!)
Чистые функции в React-компонентах
✅ Функциональные компоненты в React должны быть чистыми!
function Greeting({ name }: { name: string }) {
return <h1>Hello, {name}!</h1>;
}
📌 Этот компонент:
- Всегда рендерит один и тот же вывод для одного name.
- Не изменяет props и state.
❌ Нечистая компонента (мутирует пропсы!):
function BadComponent(props: { user: { name: string } }) {
props.user.name = "Hacked!"; // ❌ Изменяем пропсы — это плохо!
return <h1>Hello, {props.user.name}!</h1>;
}
📌 Почему плохо?
- Нарушает принципы React.
- Может вызвать неожиданные баги.
Где React использует чистые функции?
✔️ useReducer
function reducer(state: number, action: { type: string }) {
switch (action.type) {
case "increment":
return state + 1;
case "decrement":
return state - 1;
default:
return state;
}
}
📌 reducer — чистая функция: всегда возвращает новый state, не мутируя старый. ✔️ useMemo и useCallback Используются для оптимизации чистых функций и предотвращения лишних ререндеров.
Итог
- ✅ Чистые функции не мутируют props и state, не создают побочные эффекты.
- ✅ Функциональные компоненты должны быть чистыми.
- ✅ useReducer, useMemo, useCallback — инструменты для работы с чистыми функциями.
- ❌ Нечистые функции могут вызывать баги и ухудшать производительность.
🚀 Источник: ChatGPT