{"id":267901,"date":"2022-11-11T13:26:00","date_gmt":"2022-11-11T10:26:00","guid":{"rendered":"https:\/\/howto.mediadoma.com\/?p=267901"},"modified":"2025-03-14T19:47:11","modified_gmt":"2025-03-14T16:47:11","slug":"hur-man-skapar-dynamiska-rutter-i-next-js","status":"publish","type":"post","link":"https:\/\/howto.mediadoma.com\/sv\/hur-man-skapar-dynamiska-rutter-i-next-js\/","title":{"rendered":"Hur man skapar dynamiska rutter i Next.js"},"content":{"rendered":"\n<p>Dynamiska rutter \u00e4r sidor som l\u00e5ter dig anv\u00e4nda anpassade parametrar i en URL. De \u00e4r s\u00e4rskilt anv\u00e4ndbara n\u00e4r du skapar sidor f\u00f6r dynamiskt inneh\u00e5ll.<\/p>\n<p>F\u00f6r en blogg kan du anv\u00e4nda en dynamisk rutt f\u00f6r att skapa webbadresser baserat p\u00e5 rubrikerna p\u00e5 blogginl\u00e4ggen. Detta tillv\u00e4gag\u00e5ngss\u00e4tt \u00e4r b\u00e4ttre \u00e4n att skapa en sidkomponent f\u00f6r varje inl\u00e4gg.<\/p>\n<p>Du kan skapa dynamiska rutter i Next.js genom att definiera tv\u00e5 funktioner: getStaticProps och getStaticPaths.<\/p>\n<h2>Skapa en dynamisk rutt i Next.js<\/h2>\n<p>F\u00f6r att skapa en dynamisk rutt i Next.js, l\u00e4gg till parenteser p\u00e5 en sida. Till exempel [params].js, [slug].js eller [id].js.<\/p>\n<p>F\u00f6r en blogg kan du anv\u00e4nda en snigel f\u00f6r den dynamiska rutten. S\u00e5 om ett inl\u00e4gg hade snigeln <strong>dynamic-routes-nextjs<\/strong>, skulle den resulterande webbadressen vara <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>Skapa en ny fil som heter [slug].js i pages-mappen och skapa Post-komponenten som tar inl\u00e4ggsdata som en rekvisita.<\/p>\n<pre><code>const Post = ({ postData }) =&gt; {  return &lt;div&gt;{\/* content *\/}&lt;\/div&gt;;};<\/code><\/pre>\n<p>Det finns olika s\u00e4tt att skicka inl\u00e4ggsdata till Posten. Vilken metod du v\u00e4ljer beror p\u00e5 hur du vill rendera sidan. F\u00f6r att h\u00e4mta data under byggtiden, anv\u00e4nd getStaticProps() och f\u00f6r att h\u00e4mta den p\u00e5 beg\u00e4ran, anv\u00e4nd getServerSideProps().<\/p>\n<h2>Anv\u00e4nda getStaticProps f\u00f6r att h\u00e4mta inl\u00e4ggsdata<\/h2>\n<p>Blogginl\u00e4gg \u00e4ndras inte lika ofta, och det r\u00e4cker att h\u00e4mta dem vid byggtiden. S\u00e5, modifiera Post-komponenten s\u00e5 att den inkluderar 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-funktionen genererar inl\u00e4ggsdata som renderas p\u00e5 sidan. Den anv\u00e4nder snigeln fr\u00e5n s\u00f6kv\u00e4garna som genereras av getStaticPaths-funktionen.<\/p>\n<h2>Anv\u00e4nda getStaticPaths f\u00f6r att h\u00e4mta s\u00f6kv\u00e4gar<\/h2>\n<p>Funktionen getStaticPaths() returnerar s\u00f6kv\u00e4garna f\u00f6r sidorna som ska f\u00f6rrenderas. \u00c4ndra Post-komponenten f\u00f6r att inkludera 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>Denna implementering av getStaticPaths h\u00e4mtar alla inl\u00e4gg som ska renderas och returnerar slugarna som params.<\/p>\n<p>Sammantaget kommer [slug].js att se ut s\u00e5 h\u00e4r:<\/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\u00e5ste anv\u00e4nda getStaticProps() och getStaticPaths() tillsammans f\u00f6r att skapa en dynamisk rutt. GetStaticPaths()-funktionen b\u00f6r generera de dynamiska rutterna, medan getStaticProps() h\u00e4mtar data som renderas vid varje rutt.<\/p>\n<h2>Skapa kapslade dynamiska rutter i Next.js<\/h2>\n<p>F\u00f6r att skapa en kapslad rutt i Next.js m\u00e5ste du skapa en ny mapp i pages-mappen och spara den dynamiska rutten i den.<\/p>\n<p>Till exempel, f\u00f6r att skapa \/pages\/posts\/dynamic-routes-nextjs, spara [slug].js inuti <strong>\/pages\/posts.<\/strong><\/p>\n<h2>\u00c5tkomst till URL-parametrar fr\u00e5n dynamiska rutter<\/h2>\n<p>Efter att du skapat rutten kan du h\u00e4mta <a href=\"https:\/\/www.makeuseof.com\/what-is-a-url\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">URL-parametern<\/a> fr\u00e5n den dynamiska rutten med hj\u00e4lp av useRouter() <a href=\"https:\/\/www.makeuseof.com\/react-hooks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React hook<\/a>.<\/p>\n<p>F\u00f6r sidorna\/[slug].js, h\u00e4mta snigeln s\u00e5 h\u00e4r:<\/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>Detta kommer att visa inl\u00e4ggets snigel.<\/p>\n<h2>Dynamisk routing med getServerSideProps<\/h2>\n<p>Med hj\u00e4lp av Next.js kan du h\u00e4mta data vid byggtid och skapa dynamiska rutter. Du kan anv\u00e4nda denna kunskap f\u00f6r att f\u00f6rrendera sidor fr\u00e5n en lista med objekt.<\/p>\n<p>Om du vill h\u00e4mta data p\u00e5 varje beg\u00e4ran, anv\u00e4nd getServerSideProps ist\u00e4llet f\u00f6r getStaticProps. Observera att detta tillv\u00e4gag\u00e5ngss\u00e4tt \u00e4r l\u00e5ngsammare; du b\u00f6r bara anv\u00e4nda den n\u00e4r du konsumerar data som \u00e4ndras regelbundet.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <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>L\u00e4gg till flexibilitet till din routing med en snabb URL-inspektion.<\/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":[3045],"tags":[3063,3063],"class_list":["post-267901","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-diverse-2","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/267901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=267901"}],"version-history":[{"count":1,"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/267901\/revisions"}],"predecessor-version":[{"id":312799,"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/267901\/revisions\/312799"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/265549"}],"wp:attachment":[{"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=267901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=267901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/howto.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=267901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}