Я все еще довольно новичок в React и пытаюсь обернуть голову вокруг крючков. Сейчас я работаю с очень простым примером счетчика, используя console.log (), чтобы попытаться понять, что происходит за кулисами:
import React, { useState, useEffect } from 'react'
const Counter = () => {
const [ count, updateCount ] = useState(0)
console.log(count)
useEffect(() => {
updateCount(10)
console.log(count)
}, [count])
return (
<div>
<h1>Counter</h1>
<div>
<button onClick={() => updateCount(count-1)}>-</button>
<span>{count}</span>
<button onClick={() => updateCount(count+1)}>+</button>
</div>
</div>
)
}
Когда я загружаю эту страницу, я вижу 0, 0 10, 10, 10 вошли в консоль. Итак, насколько я понимаю, это то, что происходит:
- Компонент отображается, установив значение по умолчанию
count
равным 0. - 0 затем регистрируется на консоли, согласно строке 5
useEffect
всегда выполняется при первом отображении компонента, независимо от его зависимостей (верно?), поэтому он выполняет updateCount(10)
- Перед тем, как состояние фактически обновляется с
updateCount(10)
, 0 записывается на консоль согласно строке 9 count
обновления из-за updateCount(10)
. Поскольку состояние изменилось, компонент перерисовывается. 10 снова регистрируется в консоли в соответствии со строкой 5 - Так как
count
указан как зависимость useEffect
, а count
изменился, useEffect
выполняется снова. updateCount(10)
вызывается снова, хотя ничего не должно делать, поскольку count
уже 10. - 10 снова регистрируется на консоли, как в строке 9.
- Это оставляет один больше 10 записывается в консоль из строки 5. Я не понимаю, почему это выполняется снова. В прошлый раз, когда вызывался
useEffect
, он снова установил count
на 10, но, поскольку count
уже был установлен на десять, компонент не должен нуждаться в повторном рендеринге, так почему строка 5 выполняется снова? ? Или компонент повторно отображается каждый раз, когда вызывается обновление состояния, независимо от того, действительно ли изменяются свойства состояния?