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

Я хочу создать модальное окно с использованием параллельных роутов, которое не будет закрываться при перезагрузке страницы. Таким образом, когда я открываю его и затем перезагружаю страницу, окно снова открывается, как это реализовано на сайте <a href="https://dodopizza.ru/peterburg/product/beef-n-saus" rel="nofollow">https://dodopizza.ru/peterburg/product/beef-n-saus</a>. Можете, пожалуйста, подсказать, как можно сделать что-то подобное или где я могу найти примеры? 

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

Мне нужно, чтобы окно отображалось поверх каталога и продолжало быть открытым даже после перезагрузки, точно так же, как это сделано на сайте Dodo. Как лучше всего реализовать это? Возможно, есть ресурсы, где можно найти информацию по этой теме?
  • 9 декабря 2024 г. 21:43
Ответы на вопрос 1
Для реализации модального окна в Next.js, которое будет оставаться открытым даже после перезагрузки страницы, вы можете использовать сочетание состояния в контексте и библиотеку Router. Для достижения этого эффекта, вы можете хранить состояние модального окна в URL, что позволит модальному окну оставаться открытым на разных страницах и даже после перезагрузки.

Вот общий подход, как вы можете это сделать:

### Шаг 1: Создание контекста для модального окна

Создайте контекст для хранения состояния модального окна. Это позволит управлять состоянием модального окна в глобальном масштабе.

```jsx
// context/ModalContext.js
import { createContext, useContext, useState } from 'react';
import { useRouter } from 'next/router';

const ModalContext = createContext();

export const ModalProvider = ({ children }) => {
    const router = useRouter();
    const [isOpen, setIsOpen] = useState(false);

    const openModal = () => {
        setIsOpen(true);
        router.push('?modal=true', undefined, { shallow: true });
    };

    const closeModal = () => {
        setIsOpen(false);
        router.push('', undefined, { shallow: true });
    };

    return (
        <ModalContext.Provider value={{ isOpen, openModal, closeModal }}>
            {children}
        </ModalContext.Provider>
    );
};

export const useModal = () => {
    return useContext(ModalContext);
};
```

### Шаг 2: Создание компонента модального окна

Создайте компонент для вашего модального окна:

```jsx
// components/Modal.js
import React from 'react';
import { useModal } from '../context/ModalContext';

const Modal = () => {
    const { isOpen, closeModal } = useModal();

    if (!isOpen) return null;

    return (
        <div className="modal">
            <div className="modal-content">
                <span className="close" onClick={closeModal}>&times;</span>
                <h2>Модальное окно</h2>
                <p>Содержимое модального окна...</p>
            </div>
        </div>
    );
};

export default Modal;
```

### Шаг 3: Обертка вашего приложения в провайдер

Теперь оберните ваше приложение в `ModalProvider` в `_app.js`:

```jsx
// pages/_app.js
import { ModalProvider } from '../context/ModalContext';
import Modal from '../components/Modal';

export default function App({ Component, pageProps }) {
    return (
        <ModalProvider>
            <Component {...pageProps} />
            <Modal />
        </ModalProvider>
    );
}
```

### Шаг 4: Открытие модального окна

Теперь вы можете открывать модальное окно, вызвав метод `openModal` из вашего контекста. Например, вы можете сделать это из кнопки на вашей странице:

```jsx
// pages/index.js
import { useModal } from '../context/ModalContext';

const HomePage = () => {
    const { openModal } = useModal();

    return (
        <div>
            <h1>Главная страница</h1>
            <button onClick={openModal}>Открыть модальное окно</button>
        </div>
    );
};

export default HomePage;
```

### Шаг 5: Проверка состояния при загрузке

Чтобы модальное окно автоматически открывалось при загрузке страницы, когда в URL есть параметр `modal=true`, вы можете добавить следующее в `ModalProvider`:

```jsx
import { useEffect } from 'react';

// Внутри ModalProvider
useEffect(() => {
    if (router.query.modal === 'true') {
        setIsOpen(true);
    }
}, [router.query.modal]);
```

### Заключение

Теперь ваше модальное окно будет открываться, если в URL присутствует параметр `modal=true`, и оставаться открытым даже после перезагрузки страницы. Таким образом, вы можете управлять его состоянием через URL. Вы также можете добавлять дополнительную логику для управления другими аспектами поведения модального окна, если это необходимо. 

Это базовый пример, и вам, возможно, придется адаптировать его под ваши конкретные потребности.
Похожие вопросы