Динамический маршрут Nextjs отображается дважды

#next.js

#next.js

Вопрос:

У меня есть динамический маршрут в pages/user/[id].jsx моем [id].jsx содержимом console.log(useRouter().query.id); , если я перейду к url/user/5 нему, когда проверю консоль, как только получу undefined, а затем правильный идентификатор (в данном случае 5). Что здесь происходит, есть ли способ это исправить?

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

1. Это ожидаемое поведение для динамических маршрутов, см. github.com/vercel/next.js/issues/12010 за подробностями.

2. Спасибо @juliomalves, решения, представленные в связанной проблеме, очень помогли.

Ответ №1:

Для этого вы можете использовать getInitialProps.

 // sample usage
// file /pages/user/[id].jsx

export default function User({id}){ 
  return <div>{id}</div>
}
    
User.getInitialProps = (appContext) => {
  return {id: appContext.query.id}
}
 

Ответ №2:

Я не знаю содержимого вашей страницы, но если у вас нет getStaticProps or getServerSideProps (или old getInitialProps ), то NextJS обрабатывает вашу страницу как статическую страницу и выполняет автоматическую статическую оптимизацию (https://nextjs.org/docs/advanced-features/automatic-static-optimization#how-it-works )

Там вы можете прочитать, что:

Во время предварительной визуализации объект запроса маршрутизатора будет пустым, поскольку у нас нет информации о запросе для предоставления на этом этапе. После гидратации, Next.js вызовет обновление вашего приложения для предоставления параметров маршрута в объекте запроса.

Чтобы преодолеть двойной рендеринг, вы можете сделать:

 // pages/user/[id].jsx

import { useRouter } from 'next/router';

const UserPage = () => {
    const { query, isReady } = useRouter()

    // wait until there is a query with the data; or `!query.id`
    if (!isReady) {
        return null;
    }

    return query.id;
}

export default UserPage;
 

Или, если у вас есть какой-то эффект использования:

 // pages/user/[id].jsx

import { useEffect } from 'react';
import { useRouter } from 'next/router';

const UserPage = () => {
    const { query, isReady } = useRouter()
    
    useEffect(() => {
        if (isReady) {
            // fetch(`your.domain/user/${query.id}`)...;
        }
    }, [isReady])

    if (!isReady) {
        return null;
    }

    return query.id;
}

export default UserPage;