8 votes

Routage dynamique avec getServerSideProps dans Nextjs

J'essaie d'apprendre nextjs. J'ai du mal à mettre au point le routage avec getServerSideProps .

En utilisant une api gratuite, j'ai une liste de pays affichée sur le DOM. Je veux créer un lien dynamique vers un pays pour que les données soient récupérées et affichées pour ce pays spécifique.

Voici mon code jusqu'à présent

const Country = props => (
  <Layout>
    <h1>{props.country.name}</h1>
    <span>{props.country.capital}</span>
  </Layout>
);
export async function getServerSideProps(context) {
  const { id } = context.query;
  const res = await fetch(`https://restcountries.eu/rest/v2/name/${id}`);
  const country = await res.json();

  console.log(`Fetched place: ${country.name}`);
  return { props: { country } };
}
export default Country;

  <div className='container'>
    <Head>
      <title>Countries List</title>
      <link rel='icon' href="stackoverflow.com/favicon.ico' />
    </Head>
    <Layout>
      <main>
        <h1>
          Countries{' '}
          <span role='img' aria-label='world emoji'>

          </span>
        </h1>
        <ul>
          {countries.map(country => (
            <li key={country.name}>
              <Link href="stackoverflow.com/p/[id]' as={`/p/${country.name}`}>
                <a>{country.name}</a>
              </Link>
            </li>
          ))}
        </ul>
      </main>
    </Layout>
  </div>
);

export async function getServerSideProps() {
  // Call an external API endpoint to get posts.
  const res = await fetch('https://restcountries.eu/rest/v2/all');
  const countries = await res.json();

  // By returning { props: posts }, the Blog component
  // will receive `posts` as a prop at build time
  return {
    props: {
      countries,
    },
  };
}

export default Home;

L'URL est acheminée dynamiquement. Par exemple, lorsque vous cliquez sur Afghanistan, l'URL affiche http://localhost:3000/p/Afghanistan .

Mon composant de pays n'affiche cependant rien et undefined est imprimé sur le terminal.

Exemple d'url et de réponse à partir de l'URL : https://restcountries.eu/rest/v2/name/Afghanistan

{
name: "Afghanistan"
}

Toutes mes excuses si c'est une question de débutant. J'essaie d'apprendre nextjs

10voto

Yilmaz Points 51
export async function getServerSideProps(context) {
  const { id } = context.query;
  const res = await fetch(`https://restcountries.eu/rest/v2/name/${id}`);
  const country = await res.json();

  console.log(`Fetched place: ${country.name}`);
  return { props: { country } };
}

vous retournez un objet imbriqué de la fonction ci-dessus

    { props: { country:country } }

donc cet accessoire sera attaché aux accessoires comme ceci :

      `props.props`

c'est ainsi que vous devez mettre en œuvre

const Country = props => (
  <Layout>
    <h1>{props.props.country.name}</h1>
    <span>{props.props.country.capital}</span>
  </Layout>
);

0voto

BleddP Points 11

Pour compléter la réponse acceptée, vous pouvez également déstructurer le texte pour le rendre (imho) plus lisible. Cette opération est toutefois entièrement facultative.

const Country = ({ country }) => (
  <Layout>
    <h1>{country.name}</h1>
    <span>{country.capital}</span>
  </Layout>
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X