{"id":267898,"date":"2022-11-11T13:52:00","date_gmt":"2022-11-11T10:52:00","guid":{"rendered":"https:\/\/howto.mediadoma.com\/?p=267898"},"modified":"2025-03-13T18:05:12","modified_gmt":"2025-03-13T15:05:12","slug":"como-criar-rotas-dinamicas-no-next-js","status":"publish","type":"post","link":"https:\/\/howto.mediadoma.com\/pt-pt\/como-criar-rotas-dinamicas-no-next-js\/","title":{"rendered":"Como criar rotas din\u00e2micas no Next.js"},"content":{"rendered":"\n<p>As rotas din\u00e2micas s\u00e3o p\u00e1ginas que permitem usar par\u00e2metros personalizados em uma URL. Eles s\u00e3o especialmente ben\u00e9ficos ao criar p\u00e1ginas para conte\u00fado din\u00e2mico.<\/p>\n<p>Para um blog, voc\u00ea pode usar uma rota din\u00e2mica para criar URLs com base nos t\u00edtulos das postagens do blog. Essa abordagem \u00e9 melhor do que criar um componente de p\u00e1gina para cada postagem.<\/p>\n<p>Voc\u00ea pode criar rotas din\u00e2micas em Next.js definindo duas fun\u00e7\u00f5es: getStaticProps e getStaticPaths.<\/p>\n<h2>Como criar uma rota din\u00e2mica no Next.js<\/h2>\n<p>Para criar uma rota din\u00e2mica em Next.js, adicione colchetes a uma p\u00e1gina. Por exemplo, [params].js, [slug].js ou [id].js.<\/p>\n<p>Para um blog, voc\u00ea pode usar um slug para a rota din\u00e2mica. Portanto, se uma postagem tivesse o slug <strong>dynamic-routes-nextjs<\/strong>, a URL resultante seria <a href=\"https:\/\/example.com\/dynamic-routes-nextjs\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/example.com\/dynamic-routes-nextjs<\/a>.<\/p>\n<p>Na pasta pages, crie um novo arquivo chamado [slug].js e crie o componente Post que recebe os dados do post como prop.<\/p>\n<pre><code>const Post = ({ postData }) =&gt; {  return &lt;div&gt;{\/* content *\/}&lt;\/div&gt;;};<\/code><\/pre>\n<p>Existem diferentes maneiras de passar os dados da postagem para a postagem. O m\u00e9todo escolhido depende de como voc\u00ea deseja renderizar a p\u00e1gina. Para buscar os dados durante o tempo de constru\u00e7\u00e3o, use getStaticProps() e para busc\u00e1-los mediante solicita\u00e7\u00e3o, use getServerSideProps().<\/p>\n<h2>Usando getStaticProps para buscar dados de postagem<\/h2>\n<p>As postagens do blog n\u00e3o mudam com tanta frequ\u00eancia, e busc\u00e1-las no momento da compila\u00e7\u00e3o \u00e9 suficiente. Portanto, modifique o componente Post para incluir getStaticProps().<\/p>\n<pre><code>import { getSinglePost } from \"..\/..\/utils\/posts\"; const Post = ({ content }) =&gt; {  return &lt;div&gt;{\/* content *\/}&lt;\/div&gt;;}; export const getStaticProps = async ({ params }) =&gt; {    const post = await getSinglePost(params.slug);    return {      props: { ...post },    };  };<\/code><\/pre>\n<p>A fun\u00e7\u00e3o getStaticProps gera os dados de postagem renderizados na p\u00e1gina. Ele usa o slug dos caminhos gerados pela fun\u00e7\u00e3o getStaticPaths.<\/p>\n<h2>Usando getStaticPaths para buscar caminhos<\/h2>\n<p>A fun\u00e7\u00e3o getStaticPaths() retorna os caminhos para as p\u00e1ginas que devem ser pr\u00e9-renderizadas. Altere o componente Post para inclu\u00ed-lo:<\/p>\n<pre><code>export const getStaticPaths = async() =&gt; {  const paths = getAllPosts().map(({ slug }) =&gt; ({ params: { slug } }));  return {    paths,    fallback: false,  };};<\/code><\/pre>\n<p>Essa implementa\u00e7\u00e3o de getStaticPaths busca todos os posts que devem ser renderizados e retorna os slugs como par\u00e2metros.<\/p>\n<p>Ao todo, [slug].js ficar\u00e1 assim:<\/p>\n<pre><code>import { getAllPosts, getSinglePost } from \"..\/..\/utils\/posts\"; const Post = ({ content }) =&gt; {  return &lt;div&gt;{content}&lt;\/div&gt;;}; export const getStaticPaths = async() =&gt; {  const paths = getAllPosts().map(({ slug }) =&gt; ({ params: { slug } }));  return {    paths,    fallback: false,  };}; export const getStaticProps = async ({ params }) =&gt; {  const post = await getSinglePost(params.slug);   return {    props: { ...post },  };}; export default Post;<\/code><\/pre>\n<p>Voc\u00ea deve usar getStaticProps() e getStaticPaths() juntos para criar uma rota din\u00e2mica. A fun\u00e7\u00e3o getStaticPaths() deve gerar as rotas din\u00e2micas, enquanto getStaticProps() busca os dados renderizados em cada rota.<\/p>\n<h2>Como criar rotas din\u00e2micas aninhadas no Next.js<\/h2>\n<p>Para criar uma rota aninhada em Next.js, voc\u00ea precisa criar uma nova pasta dentro da pasta pages e salvar a rota din\u00e2mica dentro dela.<\/p>\n<p>Por exemplo, para criar \/pages\/posts\/dynamic-routes-nextjs, salve [slug].js dentro <strong>de \/pages\/posts.<\/strong><\/p>\n<h2>Acessando par\u00e2metros de URL de rotas din\u00e2micas<\/h2>\n<p>Depois de criar a rota, voc\u00ea pode recuperar o <a href=\"https:\/\/www.makeuseof.com\/what-is-a-url\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">par\u00e2metro<\/a> de URL da rota din\u00e2mica usando o hook useRouter() <a href=\"https:\/\/www.makeuseof.com\/react-hooks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a>.<\/p>\n<p>Para o pages\/[slug].js, pegue o slug assim:<\/p>\n<pre><code>import { useRouter } from 'next\/router' const Post = () =&gt; {  const router = useRouter()  const { slug } = router.query  return &lt;p&gt;Post: {slug}&lt;\/p&gt;} export default Post<\/code><\/pre>\n<p>Isso exibir\u00e1 o slug do post.<\/p>\n<h2>Roteamento din\u00e2mico com getServerSideProps<\/h2>\n<p>Usando Next.js, voc\u00ea pode buscar dados em tempo de compila\u00e7\u00e3o e criar rotas din\u00e2micas. Voc\u00ea pode usar esse conhecimento para pr\u00e9-renderizar p\u00e1ginas de uma lista de itens.<\/p>\n<p>Se voc\u00ea deseja buscar dados em cada solicita\u00e7\u00e3o, use getServerSideProps em vez de getStaticProps. Observe que essa abordagem \u00e9 mais lenta; voc\u00ea s\u00f3 deve us\u00e1-lo ao consumir dados que mudam regularmente.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/www.makeuseof.com\" class=\"external external_icon\">www.makeuseof.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Adicione flexibilidade ao seu roteamento com uma r\u00e1pida inspe\u00e7\u00e3o de URL.<\/p>\n","protected":false},"author":1,"featured_media":265549,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[2932],"tags":[3061],"class_list":["post-267898","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/267898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=267898"}],"version-history":[{"count":1,"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/267898\/revisions"}],"predecessor-version":[{"id":299609,"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/267898\/revisions\/299609"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/265549"}],"wp:attachment":[{"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=267898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=267898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/howto.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=267898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}