Как вы можете использовать навигацию по ссылкам, чтобы уйти от перехваченного маршрута в Next.js 13?

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: изначально я зарегистрировал это как ошибку в репозитории 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 по перехваченным маршрутам?

Спасибо.

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

Danny 17.05.2023 16:51

У меня хорошие новости: оказалось, что это действительно была проблема, и она была вновь открыта после того, как изначально была закрыта. Я думаю, что они в настоящее время работают над этим и должны быть исправлены в одной из следующих версий патча.

Dimitris Karagiannis 18.05.2023 17:16

У меня была такая же проблема. Я не смог открыть вашу песочницу, но мне интересно, вы используете элемент Dialog для своего модального окна? Интересно, то, что происходит, это то, что вся эта вещь с предварительным рендерингом Next означает, что он действительно не удаляет эти элементы, а вместо этого пытается скрыть их с помощью CSS или чего-то еще? Dialog имеет свой собственный CSS, который может не совпадать с тем, что делает Next.

Amy Blankenship 01.06.2023 22:45

@AmyBlankenship да, странно, я использую функцию «поделиться ссылкой» из codeandbox, и она не работает: / Я не знаю, что не так. Нет, я не использовал элемент диалога для модального окна. Это общепризнанная проблема, вы можете следить за ее развитием здесь

Dimitris Karagiannis 02.06.2023 17:43

Я только что посмотрел это видео, в котором функция описана не так, как я понимаю из документации youtu.be/pTsmh36ZB8c

Amy Blankenship 02.06.2023 18:06

@AmyBlankenship Судя по тому, что я увидел на видео, он все правильно объясняет.

Dimitris Karagiannis 02.06.2023 18:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
6
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме