state
Изменнеие и хранение локального состояния внутри функциональных компонентов.
Пример useState
import { useState } from 'react';
...
const [count, setCount] = useState<number>(0);
...
<button onClick={() => setCount(count + 1)}>Change count</button>
prevState
Параметр setState, который содержит предыдущий state.
import { useState } from 'react';
...
const [count, setCount] = useState(0);
const onButtonClick = () => {
setCount(count + 1);
// идентичная запись с prevState
setCount(prevState => prevState + 1);
}
...
<button onClick={onButtonClick}>Change count</button>
Передача объекта в setState
Пример изменения одного поля объекта
setGameState((prevState: TPandaGameState) => {
return {
...prevState,
gameStatus: 'take-cards',
};
});
// короткая запись
setGameState((prevState: TPandaGameState) => ({
...prevState,
gameStatus: 'take-cards',
}));
Типизация setState при передаче в props
type TProps = {
// с помощью React.Dispatch
setGameState: React.Dispatch<React.SetStateAction<TPandaGameState>>;
// с помощью функции
setGameState: (val: TPandaGameState) => void;
}
Использование общего state-объекта
Вместо большого количества одиночных можно использовать объект состояний, на подобие как было в классовых компонентах;
initialState
может принимать даже функцию, которая возвращает значение;
import { useState } from 'react';
// типизация state
type TState = {
value1: number;
value2: boolean;
value3: string[];
};
const initialState: TState = {
value1: 1,
value2: false,
value3: ['a', 'b', 'c'],
}
const [state, setState] = useState<TState>(initialState);
...
const onButtonClick = () => {
setState({
// or need to add all prev state values
...state,
value1: 2,
value2: true,
value3: ['a'],
});
};
...