State — это внутренние данные компонента, которые могут изменяться со временем и влиять на его отображение. В отличие от props, state полностью контролируется самим компонентом.
import { useState } from 'react';
function Counter() {
// Объявление state: count - текущее значение, setCount - функция обновления
const [count, setCount] = useState(0); // Начальное значение 0
return (
<div>
<p>Вы кликнули {count} раз</p>
<button onClick={() => setCount(count + 1)}>
Кликни меня
</button>
</div>
);
}
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 }; // Инициализация state
}
render() {
return (
<div>
<p>Вы кликнули {this.state.count} раз</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Кликни меня
</button>
</div>
);
}
}
Неправильно:
// Для функциональных компонентов
count = count + 1;
// Для классовых компонентов
this.state.count = 5;
Правильно:
// Функциональные компоненты
setCount(count + 1);
// Классовые компоненты
this.setState({ count: 5 });
setCount(prevCount => prevCount + 1);
// Для классовых компонентов
this.setState(prevState => ({ count: prevState.count + 1 }));
const [user, setUser] = useState({
name: 'Иван',
age: 30,
isActive: true
});
// Обновление
setUser(prev => ({ ...prev, age: 31 }));
const [data, setData] = useState(() => {
// Выполняется только при первоначальном рендере
const initialData = computeExpensiveValue();
return initialData;
});
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<button onClick={() => dispatch({ type: 'increment' })}>
Count: {state.count}
</button>
);
}
Когда несколько компонентов должны использовать одни данные:
function Parent() {
const [sharedState, setSharedState] = useState('');
return (
<>
<ChildA value={sharedState} onChange={setSharedState} />
<ChildB value={sharedState} />
</>
);
}
const expensiveValue = useMemo(() => computeExpensiveValue(count), [count]);
const MemoizedComponent = React.memo(function MyComponent({ prop }) {
// Рендерится только при изменении prop
});
State — это:
Основные методы работы:
useState
для функциональных компонентовthis.state
и this.setState
для классовых компонентовuseReducer
для сложной логики обновленийГлавные правила:
Оптимизации:
Совет: Для глобального состояния приложения рассмотрите использование Context API или специализированных решений (Redux, MobX, Zustand), когда state нужно разделять между многими компонентами.