Я хочу, чтобы кто-то подтвердил мою интуицию по приведенной ниже проблеме.
Моя цель состояла в том, чтобы отслеживать (аналогично здесь ) props.personIdentId
и, когда она изменилась, звоните setSuggestions([])
.
Вот код:
function Identification(props) {
let [suggestions, setSuggestions] = useState([]);
let prevPersonIdentId = useRef(null)
let counter = useRef(0) // for logs
// for accessing prev props
useEffect(() => {
prevPersonIdentId.current = props.personIdentId;
console.log("Use effect", props.personIdentId, prevPersonIdentId.current, counter.current++)
});
// This props value has changed, act on it.
if (props.personIdentId != prevPersonIdentId.current) {
console.log("Props changed", props.personIdentId, prevPersonIdentId.current, counter.current++)
setSuggestions([])
}
Но он получал бесконечный l oop, как показано здесь:
Мое объяснение, почему это происходит, заключается в том, что: первоначально, когда он обнаруживает, что реквизит изменился с нуля на 3, он вызывает setSuggestions, который планирует повторный рендеринг, затем следующий повтор -render приходит, но предыдущий запланированный useEffect не успел запуститься, следовательно, prevPersonIdentId.current не обновился, и он снова входит и передает условие if, которое проверяет, изменился ли prop и так далее. Следовательно, бесконечно l oop.
Что подтверждает эта интуиция, так это то, что, используя это условие вместо старого, исправляет код:
if (props.personIdentId != prevPersonIdentId.current) {
prevPersonIdentId.current = props.personIdentId;
setSuggestions([])
}
Может кто-нибудь подтвердить это или добавить еще разработка