В отличие от состояния в компоненте класса, который будет хранить состояние как объект, нет ограничения типа состояния с помощью useState
hook.Может принимать состояние как string, boolean, number, object or array
.Единственное предостережение в том, что setState объединит обновленный объект состояния с предыдущим состоянием, тогда как установщик хуков этого не делает.Вы также можете иметь несколько объявлений useState с несколькими различными типами состояний внутри компонента
Пример использования useState
хуков будет
const [count, setCount] = useState(0);
const [name, setName] = useState('Mr A');
const [isOpen, setIsOpen] = useState(false);
const [user, setUser] = useState({ name: 'Mr B', email: 'mrb@xyz.com'});
const [items, setItems] = useState(['Foo', 'Bar']);
Каждое использование useState
будет иметь собственную ссылку и возвращать состояние и его установщик.
Установщик на useState
передается с новым значением состояния.Он также может принимать функцию обратного вызова, которой передается предыдущее значение состояния
Пример
setUser({name: 'Mr C', email: 'mrc@xyz.com'});
или
setUser(prevState => ({...prevState, email:'mrB12@pwd.com'}))
DEMO
const { useState } = React;
function App() {
const [state, setState] = useState({ name: "A", email: "ABC@PWD.com" });
const [count, setCount] = useState(0);
return (
<div>
<div onClick={() => setState(prevState => ({ ...prevState, name: 'B' }))}>
{state.name}
</div>
<div>{count}</div>
<button onClick={() => setCount(prevCount => prevCount + 1)}>
Click To increment count
</button>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
PS В большинстве случаев useState
будет работать для вас.Однако, если ваше состояние становится сложным и вам нужна сложная мутация, useReducer
- лучший путь вперед.Вы можете посмотреть документы здесь