{"id":267896,"date":"2022-11-11T14:02:00","date_gmt":"2022-11-11T11:02:00","guid":{"rendered":"https:\/\/howto.mediadoma.com\/?p=267896"},"modified":"2025-03-14T19:47:16","modified_gmt":"2025-03-14T16:47:16","slug":"hvordan-lage-dynamiske-ruter-i-next-js","status":"publish","type":"post","link":"https:\/\/howto.mediadoma.com\/no\/hvordan-lage-dynamiske-ruter-i-next-js\/","title":{"rendered":"Hvordan lage dynamiske ruter i Next.js"},"content":{"rendered":"\n<p>Dynamiske ruter er sider som lar deg bruke egendefinerte parametere i en URL. De er spesielt nyttige n\u00e5r du lager sider for dynamisk innhold.<\/p>\n<p>For en blogg kan du bruke en dynamisk rute for \u00e5 lage URL-er basert p\u00e5 titlene p\u00e5 blogginnleggene. Denne tiln\u00e6rmingen er bedre enn \u00e5 lage en sidekomponent for hvert innlegg.<\/p>\n<p>Du kan lage dynamiske ruter i Next.js ved \u00e5 definere to funksjoner: getStaticProps og getStaticPaths.<\/p>\n<h2>Opprette en dynamisk rute i Next.js<\/h2>\n<p>For \u00e5 lage en dynamisk rute i Next.js, legg til parenteser p\u00e5 en side. For eksempel, [params].js, [slug].js eller [id].js.<\/p>\n<p>For en blogg kan du bruke en snegle for den dynamiske ruten. S\u00e5 hvis et innlegg hadde slug <strong>dynamic-routes-nextjs<\/strong>, ville den resulterende URL-adressen v\u00e6re <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>I pages-mappen oppretter du en ny fil kalt [slug].js og oppretter Post-komponenten som tar postdataene som en prop.<\/p>\n<pre><code>const Post = ({ postData }) =&gt; {  return &lt;div&gt;{\/* content *\/}&lt;\/div&gt;;};<\/code><\/pre>\n<p>Det er forskjellige m\u00e5ter du kan sende innleggsdataene til Posten. Metoden du velger avhenger av hvordan du vil gjengi siden. For \u00e5 hente dataene under byggetiden, bruk getStaticProps() og for \u00e5 hente dem p\u00e5 foresp\u00f8rsel, bruk getServerSideProps().<\/p>\n<h2>Bruke getStaticProps for \u00e5 hente postdata<\/h2>\n<p>Blogginnlegg endres ikke s\u00e5 ofte, og det er tilstrekkelig \u00e5 hente dem p\u00e5 byggetidspunktet. S\u00e5, endre Post-komponenten for \u00e5 inkludere 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>GetStaticProps-funksjonen genererer postdataene som gjengis p\u00e5 siden. Den bruker slug fra banene generert av getStaticPaths-funksjonen.<\/p>\n<h2>Bruke getStaticPaths for \u00e5 hente baner<\/h2>\n<p>GetStaticPaths()-funksjonen returnerer banene for sidene som skal forh\u00e5ndsrenderes. Endre Post-komponenten for \u00e5 inkludere den:<\/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>Denne implementeringen av getStaticPaths henter alle innleggene som skal gjengis og returnerer sneglene som paramer.<\/p>\n<p>Til sammen vil [slug].js se slik ut:<\/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>Du m\u00e5 bruke getStaticProps() og getStaticPaths() sammen for \u00e5 lage en dynamisk rute. GetStaticPaths()-funksjonen skal generere de dynamiske rutene, mens getStaticProps() henter dataene som er gjengitt p\u00e5 hver rute.<\/p>\n<h2>Opprette nestede dynamiske ruter i Next.js<\/h2>\n<p>For \u00e5 opprette en nestet rute i Next.js, m\u00e5 du opprette en ny mappe i sider-mappen og lagre den dynamiske ruten i den.<\/p>\n<p>For \u00e5 lage \/pages\/posts\/dynamic-routes-nextjs, lagre for eksempel [slug].js i <strong>\/pages\/posts.<\/strong><\/p>\n<h2>Tilgang til URL-parametere fra dynamiske ruter<\/h2>\n<p>Etter \u00e5 ha opprettet ruten, kan du hente <a href=\"https:\/\/www.makeuseof.com\/what-is-a-url\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">URL-parameteren<\/a> fra den dynamiske ruten ved \u00e5 bruke useRouter() <a href=\"https:\/\/www.makeuseof.com\/react-hooks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React-kroken<\/a>.<\/p>\n<p>For sidene\/[slug].js, f\u00e5 sneglen slik:<\/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>Dette vil vise slug av innlegget.<\/p>\n<h2>Dynamisk ruting med getServerSideProps<\/h2>\n<p>Ved \u00e5 bruke Next.js kan du hente data p\u00e5 byggetidspunktet og lage dynamiske ruter. Du kan bruke denne kunnskapen til \u00e5 forh\u00e5ndsgjengi sider fra en liste over elementer.<\/p>\n<p>Hvis du vil hente data p\u00e5 hver foresp\u00f8rsel, bruk getServerSideProps i stedet for getStaticProps. Merk at denne tiln\u00e6rmingen er tregere; du b\u00f8r bare bruke den n\u00e5r du bruker regelmessig skiftende data.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Opptakskilde:  <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>Legg til fleksibilitet til rutingen din med en rask URL-inspeksjon.<\/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":[2931],"tags":[3060],"class_list":["post-267896","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programmering","tag-affiai-no"],"_links":{"self":[{"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/posts\/267896","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/comments?post=267896"}],"version-history":[{"count":1,"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/posts\/267896\/revisions"}],"predecessor-version":[{"id":312800,"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/posts\/267896\/revisions\/312800"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/media\/265549"}],"wp:attachment":[{"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/media?parent=267896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/categories?post=267896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/howto.mediadoma.com\/no\/wp-json\/wp\/v2\/tags?post=267896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}