Как создать эффект использования, который использует «router.push» и должен срабатывать только для «маршрутизатора».query.id` изменения в Next.js проект

#reactjs #next.js #use-effect #html5-history #next-router

Вопрос:

Мне нужно перейти между 2 маршрутами в приложении NextJS, таком как в следующем примере:

 FROM: /some-route?id=ID_1 TO: /some-route?id=ID_1amp;page=2  

И у меня есть useEffect , который делает что-то вроде этого:

  • Следует увольнять за любые id изменения
  • Использует router.push по какой-то причине
 import { useRouter } from 'next/router';  const { query, push } = useRouter(); const { id } = query;   useEffect(() =gt; {  try {  fetchDataFor(id);  }  catch(err) {  push('/not-found');  } },[id,push]);  

Проблема, с которой я сталкиваюсь, связана с тем фактом, что весь router объект изменится после обновления маршрута, и мой эффект повторится из-за push изменения ссылки на метод, хотя мой id не меняется.

В настоящее время мне нужно проверить, был ли id он обновлен или нет, используя некоторую useRef переменную, которая отслеживает предыдущее значение. Это громоздко.

Я подумал, что, возможно, мне следует использовать динамический маршрут, например:

 /some-route/[id] /some-route/[id]?page=2  

Но я предполагаю, что проблема останется из-за push свойства, которое будет продолжать меняться из-за изменения строки запроса.

Другим вариантом было бы исключить push метод из массива зависимостей useEffect. Но это похоже на анти-паттерн.

Каков был бы наилучший подход к решению этой проблемы?

Цель здесь состоит в том, чтобы иметь возможность использовать router.push (или, по крайней мере, каким-то образом продвигать другой маршрут) внутри useEffect , который должен запускаться только для query.id обновлений.

Комментарии:

1. Просто опустите push , зачем вообще помещать это сюда? Это неплохая практика, совершенно прекрасная вещь.