Прежде всего, давайте поням, почему useEffect
вызывается снова и снова при изменении URL, даже если зависимости не изменились. В основном, это происходит из-за того, что при изменении URL компонент перерендеривается, а, следовательно, и useEffect
вызывается заново.
Чтобы избежать вызова useEffect
при изменении URL без изменения зависимостей, мы можем использовать useEffect
вместе с хуком useRef
.
Пример:
import React, { useEffect, useRef } from 'react'; import { useHistory } from 'react-router-dom'; const MyComponent = () => { const isFirstRun = useRef(true); const history = useHistory(); useEffect(() => { if (isFirstRun.current) { isFirstRun.current = false; return; } // Здесь размещаем код, который должен выполниться при изменении URL }, [history.location.pathname]); // Указываем зависимость только от pathname return <div>My Component</div>; } export default MyComponent;
В этом примере мы используем useRef
для определения, является ли текущий запуск useEffect
первым. Если это первый запуск, мы просто переключаем флаг isFirstRun
, чтобы в следующий раз эффект беспрепятственно выполнялся. При следующих запусках мы проверяем, изменился ли URL, изменяясь только тогда, когда значение history.location.pathname
изменяется. Это позволит избежать повторного вызова useEffect
без изменения зависимости.