skip to Main Content

I am very new to Next.js, and I want to link data that has been selected to a new page using dynamic routes. It didn’t work when I read the docs; perhaps I made some mistake that I don’t see.

this is my data.tsx

'use client'
import {WithId} from "mongodb";
import {Neighborhood} from "@/types/db/Neighborhood";
import React, {ChangeEvent, FormEvent, useState} from "react";

interface FormProps {
    data: WithId<Neighborhood>[];
}
const Data: React.FC<FormProps> = ({data}) =>{
    return (
        <main className={"flex flex-row"}>
            <div className={"alcohol-alert flex flex-col items-startp-4"}>
                <button className={"btn btn-alcohol"} type={"button"}>
                    <a href={"../notification"}>Alcohol melding maken</a>
                </button>
                <select className={"alcohol-drop p-4"}>
                    {data.map((neighborhood) => (
                        <option key={neighborhood._id.toString()} value={neighborhood._id.toString()}>
                            {neighborhood.Title}
                        </option>
                    ))}
                </select>
            </div>
        </main>
    )
}
export default Data

Inside the data.tsx i have a file that is page.tsx it will get the name of the data

import {getNeighborhoods} from '@util/mongodb/neighborhood';
import Data from './data'

export default async function Home() {
    const neighborhoodData = await getNeighborhoods()
    const data = await neighborhoodData.toArray()

    return (
        <main className="flex min-h-screen flex-col items-center justify-between p-24 md:container md:mx-auto">
            <div className="homepage-div flex">
                <div className="home p-4">
                    <h1 className={"text-2xl font-bold mb-2"}>Politieoverlast</h1>
                    <p className={"text-gray-700"}>Welkom bij "politieoverlast," jouw online bron voor het verkennen van
                        maatschappelijke uitdagingen en het bevorderen van bewustwording. Onze missie is om een dieper
                        begrip te creëren van problemen die onze samenleving beïnvloeden, en we beginnen met twee
                        cruciale datasets: alcoholoverlast en het mysterieuze "xxx."</p>
                    <br/>
                    <p className={"text-gray-700"}><b>Overlastscores voor Alcoholoverlast:</b> Dit is een probleem dat
                        vele gemeenschappen wereldwijd treft. Het overmatige gebruik van alcohol kan leiden tot ernstige
                        gevolgen, waaronder gezondheidsproblemen, sociale conflicten en veiligheidsrisico's. Op
                        "politieoverlast" hebben we overlastscores verzameld en geanalyseerd om te laten zien welke
                        gemeenten het meest getroffen zijn door alcoholgerelateerde problemen. We presenteren deze
                        scores op een schaal van 1 tot 100 om de ernst van de situatie duidelijk te maken.</p>
                    <div className={"home-btns flex flex-row "}>
                        <Data data={data}/>
                        <div className={"dropdown flex flex-col items-start"}>
                            <button className={"btn btn-other"} type={"button"}>
                                Andere dataset
                            </button>
                            <select className={"other-drop p-4"}>
                                <option value={"gemeente1"}>Gemeente 1</option>
                                <option value={"gemeente2"}>Gemeente 2</option>
                                <option value={"gemeente3"}>Gemeente 3</option>
                            </select>
                        </div>
                    </div>
                </div>
            </div>
        </main>
    )
}

and than i have a results folder there in is a [id].tsx

import { useRouter } from "next/router";

function NeighborhoodDetail() {
    const router = useRouter();
    const { id } = router.query;

    return (
        <div>
            <h1>Neighborhood Detail Page</h1>
            <Data data={data} selectedNeighborhood={id} />
        </div>
    );
}

export default NeighborhoodDetail;

2

Answers


  1. Chosen as BEST ANSWER

    adding the router solved my problem

    results.tsx

    'use client'
    import React from 'react';
    import { useLocation } from 'react-router-dom';
    export default function Results() {
        const location = useLocation();
        const { municipality } = location.state;
        return (
            <div className="flex min-h-screen flex-col items-center justify-between p-24 md:container md:mx-auto">
                <div className="resultspage-div flex">
                    <div className="results p-4">
                        <h1 className={"text-2xl font-bold mb-2"}>Score</h1>
                        <div className={"currentresults"}>
                            <h3>Gemeentenaam: {municipality.Title}</h3>
                            <p>Score nu: 88</p>
                        </div>
                        <div className={"mt-5"}>
                            <h3>Voorspelling:</h3>
                            <p>Toekomst: 89</p>
                        </div>
                        <br/>
                        <p>Op "politieoverlast" gebruiken we een eenvoudig scoresysteem om de mate van overlast in verschillende gemeenten aan te geven. We begrijpen dat duidelijkheid belangrijk is, dus hier is een uitleg van onze scores, die variëren van 0 tot 100:</p>
                        <br/>
                        <p><b>0 tot 20:</b> Dit wordt beschouwd als een "Veilige" score. In gemeenten met een score in dit bereik is er over het algemeen weinig tot geen overlast gerelateerd aan alcoholproblemen. Bewoners kunnen zich hier over het algemeen veilig voelen.</p>
                        <br/>
                        <p><b>30 tot 60:</b> Dit wordt aangeduid als "Matige" overlast. Gemeenten met scores in dit bereik kennen een gematigd niveau van alcoholgerelateerde problemen. Het is belangrijk om bewust te zijn van mogelijke risico's, maar over het algemeen is er geen extreme alertheid nodig.</p>
                        <br/>
                        <p><b>60 tot 90:</b> Dit wordt beschouwd als "Gevaarlijke" overlast. In gemeenten met scores in dit bereik zijn er aanzienlijke problemen met betrekking tot alcoholgerelateerde overlast. Bewoners en bezoekers moeten voorzichtig zijn en maatregelen nemen om zichzelf te beschermen.</p>
                        <br/>
                        <p><b>90 tot 100:</b> Dit is "Heel Gevaarlijke" overlast. Gemeenten met scores in dit bereik worden geconfronteerd met zeer ernstige problemen met betrekking tot alcoholoverlast. Wees uiterst voorzichtig als u zich in deze gemeenten bevindt en zoek ondersteuning en begeleiding waar mogelijk.</p>
                        <br/>
                        <div className={"btn-results p-4"}>
                            <button className={"btn btn-back"} type={"button"}><a href={"../"}>Terug</a></button>
                        </div>
                    </div>
                </div>
            </div>
        )
    }
    

    layout.tsx

    'use client'
    import './globals.css'
    import type { Metadata } from 'next'
    import { Inter } from 'next/font/google'
    import Footer from '@/components/footer'
    import Header from '@/components/header'
    import { BrowserRouter as Router } from 'react-router-dom';
    
    const inter = Inter({ subsets: ['latin'] })
    
    // export const metadata: Metadata = {
    //   title: 'Create Next App',
    //   description: 'Generated by create next app',
    // }
    
    export default function RootLayout({
      children,
    }: {
      children: React.ReactNode
    }) {
      return (
        <html lang="en">
        <Router>
          <body>
          <Header/>
          <main className={inter.className}>{children}</main>
          <Footer/>
          </body>
        </Router>
        </html>
      )
    }
    

  2. Here is a small example code that I made which might help you understand, I have kept it simple as possible (this code is in .js, you may edit as needed) :

    Folder Structure :

    projectName
    ├── .gitignore
    ├── jsconfig.json
    ├── next.config.js
    ├── package-lock.json
    ├── package.json
    ├── postcss.config.js
    ├── public
    │   ├── images
    │   ├── next.svg
    │   └── vercel.svg
    ├── README.md
    ├── src
    │   └── app
    │       ├── api
    │       ├── comp
    │       │   └── DropDown.js
    │       ├── favicon.ico
    │       ├── globals.css
    │       ├── layout.js
    │       ├── nbh
    │       │   ├── page.js
    │       │   └── [id]
    │       │       └── page.js
    │       └── page.js
    └── tailwind.config.js
    

    DropDown Component locsrcappcompDropDown.js

    This component gets data & shows dropdown.

    'use client'
    import React, { useEffect, useMemo, useState } from 'react'
    import Link from 'next/link'
    
    const DropDown = ({ Data }) => {
        const [SelectedID, SetSelectedID] = useState(null)
        return (
            <div>
                <h3>List of Neighbourhoods </h3>
                <label >Choose a Neighbourhood: </label>
                <select
                    onChange={(e) => {
                        console.log(e.target.value)
                        SetSelectedID(e.target.value)
                    }}
                    name="Neighbourhoods">
                    <option value="null">Select an Option</option>
                    {
                        Data.map((val, ind) => {
    
                            return (
                                <option key={ind} value={ind} >{val.Title}</option>
                            )
                        })
                    }
                </select>
    
                <p>
                    You selected :
                    {
                        SelectedID ?
                            <Link style={{ color: "blue" }} href={"/nbh/" + SelectedID} >Go to details page {Data[SelectedID].Title} </Link>
                            :
                            null
                    }
                </p>
            </div>
        )
    }
    
    export default DropDown
    

    page.js locsrcappnbhpage.js

    *This page shows options. *

    import React from 'react'
    import DropDown from '../comp/DropDown'
    const page = () => {
        const data = [{
            "id": 1,
            "Title": "Village Green",
            "description": "Fusce consequat. Nulla nisl. Nunc nisl.nnDuis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.nnIn hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo."
        }, {
            "id": 2,
            "Title": "Mandrake",
            "description": "Fusce consequat. Nulla nisl. Nunc nisl.nnDuis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum."
        }, {
            "id": 3,
            "Title": "Cascade",
            "description": "Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.nnInteger tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.nnPraesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede."
        }, {
            "id": 4,
            "Title": "Mayfield",
            "description": "Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem."
        }]
        return (
            <div>
                <h3>Page that Shows options : </h3>
                <DropDown Data={data} />
            </div>
        )
    }
    export default page
    

    page.js inside locsrcappnbh[id]

    This page will get id from the page that shows options

    export default function Page({ params }) {
        return <div>Details Page : {params.id}</div>
    }
    

    Output :

    1. Goto http://localhost:3000/nbh
    2. You will see a dropdown, select a option, the you will see a Link to that option click on it.
    3. It will take you to details page & you will see ID that we passed through the link.
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search