У меня бесконечный цикл с реактивными крючками, и я не уверен, почему

#reactjs #typescript

#reactjs #typescript

Вопрос:

https://codesandbox.io/s/wandering-wildflower-764w4

По сути, я пытаюсь сделать следующее:

У меня есть функция проверки сервера, которую я высмеял в примере. Я хотел бы сохранить состояние локально, чтобы на входе отображалось вводимое значение. Когда он будет проверен, я хочу, чтобы он запускал событие onChange.

Но каким-то образом я получаю бесконечный цикл, и я не понимаю, почему.

Ответ №1:

Вы получаете бесконечный цикл, потому что вы передаете onChange свойство таким образом:

 onChange={(v) => setMap((m) => ({ ...m, [key]: v }))}
 

Это означает, что ссылка props.onChange на будет меняться каждый раз. Итак, useEffect внутренняя AddressInput часть будет вызываться при каждом рендеринге.

В свою очередь, useEffect вызовы props.onChange() , которые запускают одно и то же useEffect , и цикл повторяется снова и снова.

Чтобы избежать бесконечного цикла, вам нужно сохранить ссылку на свойство типа функции с помощью useCallback хука.