Я собирался прокомментировать принятый на данный момент ответ, но не хватило места!
Во-первых, при использовании функциональных компонентов важно отказаться от мышления в терминах событий жизненного цикла. Подумайте об изменениях свойств / состояний. У меня была аналогичная ситуация, когда я хотел, чтобы срабатывала только конкретная useEffect
функция, когда конкретная опора (parentValue
в моем случае) меняет свое начальное состояние. Итак, я создал реф, основанный на его начальном значении:
const parentValueRef = useRef(parentValue);
а затем включил следующее в начало useEffect
fn:
if (parentValue === parentValueRef.current) return;
parentValueRef.current = parentValue;
(Как правило, не запускайте эффект, если parentValue
не изменился. Обновите ссылку, если она изменилась, готовность к следующей проверке, и продолжайте запускать эффект)
Таким образом, хотя другие предлагаемые решения решат конкретный вариант использования, который вы указали, в конечном итоге они помогут изменить то, как вы думаете о функциональных компонентах.
Думайте о них как о рендеринге компонента на основе некоторых свойств.
Если вам действительно нужно какое-то местное состояние, useState
предоставит это, но не предполагайте, что ваша проблема будет решена с сохранением локального состояния.
Если у вас есть код, который изменит ваши реквизиты во время рендеринга, этот `` побочный эффект '' должен быть заключен в useEffect
, но его цель - получить чистый рендеринг, на который не влияют какие-либо изменения во время рендеринга. . Хук useEffect
будет запущен после завершения рендеринга и, как вы указали, он будет запускаться при каждом рендеринге - если только второй параметр не используется для предоставления списка свойств / состояний, чтобы определить, какие измененные элементы приведут к его изменению. выполнить последующие разы.
Удачи на пути к функциональным компонентам / крючкам! Иногда необходимо отучиться чему-то, чтобы освоить новый способ работы :) Это отличный учебник: https://overrected.io/a-complete-guide-to-useeffect/
06.02.2021
useRef
вместоsetState
? Я не вижу этого на этой странице и хотел бы понять, почему. 24.06.2019fn
не следует указывать в качестве входных данных. См. Объяснение: reactjs.org/docs/. Если что-то внутриfn
вводит deps, скорее всего, они должны быть указаны какinputs
напрямую. 02.10.2019