ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: изначально я зарегистрировал это как ошибку в репозитории Next.js на github, но она не была признана проблемой и была немедленно закрыта. Предоставленное объяснение/решение не сработало для меня, поэтому это означает, что я, должно быть, делаю что-то не так, поэтому вопрос здесь.
Вопрос/проблема
У меня есть это демонстрационное приложение (источник codesandbox здесь ), которое использует две функции маршрутизации Next.js: Параллельные маршруты и перехватчики маршрутов
Короче говоря, нажатие на фотографию изменяет URL-адрес с / на /photos/[id], но если вы не перезагрузите страницу, фотография будет отображаться в модальном режиме поверх предыдущего просмотра маршрута, вместо того, чтобы полностью изменить страницу на страницу сведений о фотографии, которая аккуратный.
При нажатии на модальное наложение вызывается функция router.back(), которая возвращает нас на один шаг назад в стеке истории, URL-адрес изменяется на /, а модальное фото больше не отображается, как и ожидалось.
Теперь я столкнулся со сценарием, в котором мне нужно иметь возможность уйти от модального окна с помощью фактического компонента Link вместо вызова router.back(). Это означает, что пользователь должен иметь возможность щелкнуть ссылку, которая указывает в сторону от /photos/[id], URL-адрес должен измениться на то, куда указывает ссылка, а модальное окно должно исчезнуть.
Однако, как вы можете видеть в демо, это не так.
Вместо этого происходит следующее: пользователь щелкает ссылку, которая указывает в сторону от /photos/[id], URL-адрес меняется на то, куда указывает ссылка, но модальное окно остается там, где оно есть. Вы можете наблюдать это поведение, даже если вы нажмете на ссылку, которая приведет вас на совершенно не относящуюся к делу страницу.
Сначала я подумал, что проблема как-то связана с компонентом Link, и попытался заменить его чем-то вроде
<button
className = "action"
onClick = {() => {
router.push(`/`);
}}
>
Close
</button>
Тем не менее, это все еще не работает. Похоже, что вызов router.push('/') работает иначе, чем router.back(), хотя оба они приводят к изменению URL-адреса на /.
Если это каким-то образом преднамеренное поведение, это действительно странно, потому что, помимо того, что это противоречит интуиции, сами документы читают
Если модальное окно было инициировано через клиентскую навигацию, например. используя , вы можете закрыть модальное окно, вызвав router.back() или используя компонент Link. (источник)
Выделенная жирным шрифтом часть меня действительно сбивает с толку.
Как было предложено в комментарии , оставленном по проблеме, я попробовал решение с маршрутом [...catchAll]; Я попытался переместить его из app/ в app/@modal/ и app/@modal/(..)photos/ и посмотреть, в каком каталоге он будет работать, как описано, и это не сработало.
Итак, это баг, или я что-то ужасно неправильно использую и недопонимаю в работе роутера и перехвата роутера?
Если последнее, как заставить работать навигацию Link по перехваченным маршрутам?
Спасибо.
У меня хорошие новости: оказалось, что это действительно была проблема, и она была вновь открыта после того, как изначально была закрыта. Я думаю, что они в настоящее время работают над этим и должны быть исправлены в одной из следующих версий патча.
У меня была такая же проблема. Я не смог открыть вашу песочницу, но мне интересно, вы используете элемент Dialog для своего модального окна? Интересно, то, что происходит, это то, что вся эта вещь с предварительным рендерингом Next означает, что он действительно не удаляет эти элементы, а вместо этого пытается скрыть их с помощью CSS или чего-то еще? Dialog имеет свой собственный CSS, который может не совпадать с тем, что делает Next.
@AmyBlankenship да, странно, я использую функцию «поделиться ссылкой» из codeandbox, и она не работает: / Я не знаю, что не так. Нет, я не использовал элемент диалога для модального окна. Это общепризнанная проблема, вы можете следить за ее развитием здесь
Я только что посмотрел это видео, в котором функция описана не так, как я понимаю из документации youtu.be/pTsmh36ZB8c
@AmyBlankenship Судя по тому, что я увидел на видео, он все правильно объясняет.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Оказывается, на самом деле это была проблема с Next.js, и отправленный мной тикет, который изначально был закрыт, был повторно открыт (см. ссылку на отчет о проблеме GitHub в отказе от ответственности). Должно быть исправлено в одной из следующих версий исправлений обновлений Next.js.
Для чего это стоит, я тоже сталкиваюсь с этой проблемой. Непонятно, как закрыть модальное окно, пройдя вперед от модального окна.