{"id":267900,"date":"2022-11-11T13:43:00","date_gmt":"2022-11-11T10:43:00","guid":{"rendered":"https:\/\/howto.mediadoma.com\/?p=267900"},"modified":"2025-03-13T16:58:40","modified_gmt":"2025-03-13T13:58:40","slug":"como-crear-rutas-dinamicas-en-next-js","status":"publish","type":"post","link":"https:\/\/howto.mediadoma.com\/es\/como-crear-rutas-dinamicas-en-next-js\/","title":{"rendered":"C\u00f3mo crear rutas din\u00e1micas en Next.js"},"content":{"rendered":"\n<p>Las rutas din\u00e1micas son p\u00e1ginas que le permiten usar par\u00e1metros personalizados en una URL. Son especialmente beneficiosos cuando se crean p\u00e1ginas para contenido din\u00e1mico.<\/p>\n<p>Para un blog, puede usar una ruta din\u00e1mica para crear direcciones URL basadas en los t\u00edtulos de las publicaciones del blog. Este enfoque es mejor que crear un componente de p\u00e1gina para cada publicaci\u00f3n.<\/p>\n<p>Puede crear rutas din\u00e1micas en Next.js definiendo dos funciones: getStaticProps y getStaticPaths.<\/p>\n<h2>Creaci\u00f3n de una ruta din\u00e1mica en Next.js<\/h2>\n<p>Para crear una ruta din\u00e1mica en Next.js, agregue corchetes a una p\u00e1gina. Por ejemplo, [params].js, [slug].js o [id].js.<\/p>\n<p>Para un blog, podr\u00eda usar un slug para la ruta din\u00e1mica. Entonces, si una publicaci\u00f3n tuviera el slug <strong>dynamic-routes-nextjs<\/strong>, la URL resultante ser\u00eda <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>En la carpeta de p\u00e1ginas, cree un nuevo archivo llamado [slug].js y cree el componente Publicar que toma los datos de la publicaci\u00f3n como apoyo.<\/p>\n<pre><code>const Post = ({ postData }) =&gt; {  return &lt;div&gt;{\/* content *\/}&lt;\/div&gt;;};<\/code><\/pre>\n<p>Hay diferentes formas de pasar los datos de la publicaci\u00f3n a la publicaci\u00f3n. El m\u00e9todo que elija depende de c\u00f3mo desee representar la p\u00e1gina. Para obtener los datos durante el tiempo de compilaci\u00f3n, use getStaticProps() y para obtenerlos a pedido, use getServerSideProps().<\/p>\n<h2>Uso de getStaticProps para obtener datos de publicaci\u00f3n<\/h2>\n<p>Las publicaciones de blog no cambian con tanta frecuencia y es suficiente obtenerlas en el momento de la compilaci\u00f3n. Por lo tanto, modifique el componente Publicar 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>La funci\u00f3n getStaticProps genera los datos de publicaci\u00f3n representados en la p\u00e1gina. Utiliza el slug de las rutas generadas por la funci\u00f3n getStaticPaths.<\/p>\n<h2>Uso de getStaticPaths para obtener rutas<\/h2>\n<p>La funci\u00f3n getStaticPaths() devuelve las rutas de las p\u00e1ginas que deben renderizarse previamente. Cambie el componente Publicar para incluirlo:<\/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>Esta implementaci\u00f3n de getStaticPaths obtiene todas las publicaciones que deben procesarse y devuelve los slugs como par\u00e1metros.<\/p>\n<p>En conjunto, [slug].js se ver\u00e1 as\u00ed:<\/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>Debe usar getStaticProps() y getStaticPaths() juntos para crear una ruta din\u00e1mica. La funci\u00f3n getStaticPaths() deber\u00eda generar las rutas din\u00e1micas, mientras que getStaticProps() obtiene los datos representados en cada ruta.<\/p>\n<h2>Creaci\u00f3n de rutas din\u00e1micas anidadas en Next.js<\/h2>\n<p>Para crear una ruta anidada en Next.js, debe crear una nueva carpeta dentro de la carpeta de p\u00e1ginas y guardar la ruta din\u00e1mica dentro de ella.<\/p>\n<p>Por ejemplo, para crear \/pages\/posts\/dynamic-routes-nextjs, guarde [slug].js dentro de <strong>\/pages\/posts.<\/strong><\/p>\n<h2>Acceso a par\u00e1metros de URL desde rutas din\u00e1micas<\/h2>\n<p>Despu\u00e9s de crear la ruta, puede recuperar el <a href=\"https:\/\/www.makeuseof.com\/what-is-a-url\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">par\u00e1metro<\/a> de URL de la ruta din\u00e1mica usando el gancho useRouter() <a href=\"https:\/\/www.makeuseof.com\/react-hooks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a>.<\/p>\n<p>Para las p\u00e1ginas\/[slug].js, obtenga el slug as\u00ed:<\/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>Esto mostrar\u00e1 el slug de la publicaci\u00f3n.<\/p>\n<h2>Enrutamiento din\u00e1mico con getServerSideProps<\/h2>\n<p>Con Next.js puede obtener datos en el momento de la compilaci\u00f3n y crear rutas din\u00e1micas. Puede usar este conocimiento para renderizar previamente p\u00e1ginas de una lista de elementos.<\/p>\n<p>Si desea obtener datos en cada solicitud, use getServerSideProps en lugar de getStaticProps. Tenga en cuenta que este enfoque es m\u00e1s lento; solo debe usarlo cuando consuma datos que cambian regularmente.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <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>Agregue flexibilidad a su enrutamiento con un punto r\u00e1pido de inspecci\u00f3n 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":[2933],"tags":[3062],"class_list":["post-267900","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/267900","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=267900"}],"version-history":[{"count":1,"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/267900\/revisions"}],"predecessor-version":[{"id":298611,"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/267900\/revisions\/298611"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/265549"}],"wp:attachment":[{"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=267900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=267900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/howto.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=267900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}