Обновления состояния асинхронные .Функция setCount
, которую вы получаете от useState
, не может волшебным образом протянуть руку и изменить значение вашей count
константы.С одной стороны, это константа.С другой стороны, setCount
не имеет к нему доступа.Вместо этого, когда вы вызываете setCount
, функция компонента будет вызвана снова, а useState
вернет обновленный счетчик.
Live Пример:
const {useState} = React;
function Example() {
const [count, setCount] = useState(false);
const test = () =>{
setCount(!count); // Schedules asynchronous call to Example, re-rendering the component
};
return (
<div className="App">
<h1 onClick={test}>Hello CodeSandbox</h1>
<div>Count: {String(count)}</div>
</div>
);
}
ReactDOM.render(<Example />, document.getElementById("root"));
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
Если вам необходимо выполнить побочный эффект при изменении count
, используйте useEffect
:
useEffect(() => {
console.log(`count changed to ${count}`);
}, [count]);
Обратите внимание, что мы говорим useEffect
, что мы должны вызывать наш обратный вызов только при изменении count
, поэтому, если у нас есть другое состояние, наш обратный вызов не запускается без необходимости.
Live Пример:
const {useState, useEffect} = React;
function Example() {
const [count, setCount] = useState(false);
const test = () =>{
setCount(!count); // Schedules asynchronous call to Example, re-rendering the component
};
useEffect(() => {
console.log(`count changed to ${count}`);
}, [count]);
return (
<div className="App">
<h1 onClick={test}>Hello CodeSandbox</h1>
<div>Count: {String(count)}</div>
</div>
);
}
ReactDOM.render(<Example />, document.getElementById("root"));
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>