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
adding the router solved my problem
results.tsx
layout.tsx
Link
component & set itshref
.https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#linking-to-dynamic-segments
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 :
DropDown Component
locsrcappcompDropDown.js
This component gets data & shows dropdown.
page.js
locsrcappnbhpage.js
*This page shows options. *
page.js inside
locsrcappnbh[id]
This page will get id from the page that shows options
Output :
http://localhost:3000/nbh