# Les 5 — Lesopdracht ## QuickPoll Part 1 — bouw de basis **Duur:** ~120 minuten klassikaal bouwen --- ## Doel Aan het einde heb je een werkende **QuickPoll Part 1**: lijst van polls op homepage, click → detail-page, voting met lokale state (data verdwijnt bij refresh — dat lossen we Les 7 op). --- ## Stap 1 — Setup ```bash pnpm create next-app@latest quickpoll \ --typescript --tailwind --app --no-src-dir --import-alias "@/*" cd quickpoll pnpm dev ``` Check: localhost:3000 toont Next.js welcome. --- ## Stap 2 — In-memory data `lib/data.ts`: ```typescript export const polls = [ { id: "1", title: "Beste taal?", options: [ { id: "a", text: "TypeScript", votes: 0 }, { id: "b", text: "Python", votes: 0 }, { id: "c", text: "Go", votes: 0 }, ], }, ]; export function getPoll(id: string) { return polls.find(p => p.id === id); } ``` --- ## Stap 3 — Homepage `app/page.tsx`: ```tsx import { polls } from "@/lib/data"; import Link from "next/link"; export default function Home() { return (

QuickPoll

); } ``` --- ## Stap 4 — Detail-page `app/poll/[id]/page.tsx`: ```tsx import { getPoll } from "@/lib/data"; import { notFound } from "next/navigation"; import { VoteForm } from "@/components/VoteForm"; export default async function PollPage({ params, }: { params: Promise<{ id: string }> }) { const { id } = await params; const poll = getPoll(id); if (!poll) notFound(); return (

{poll.title}

); } ``` --- ## Stap 5 — VoteForm (Client Component) `components/VoteForm.tsx`: ```tsx "use client"; import { useState } from "react"; export function VoteForm({ poll }) { const [votes, setVotes] = useState(poll.options); const [voted, setVoted] = useState(false); function vote(optionId: string) { setVotes(prev => prev.map(o => o.id === optionId ? { ...o, votes: o.votes + 1 } : o )); setVoted(true); } return (
{votes.map(o => ( ))} {voted &&

Bedankt voor je stem!

}
); } ``` --- ## Eisen - [ ] Next.js project draait lokaal - [ ] Homepage toont lijst polls - [ ] Klik op poll → detail-pagina - [ ] Voting werkt lokaal (visuele update) - [ ] not-found.tsx voor onbekende poll IDs - [ ] Tailwind styling — leesbaar --- ## Bonus - Voeg een 2e poll toe in `lib/data.ts` - Maak een `app/loading.tsx` met een mooi skeleton - Voeg basic styling polish toe (hover effects, transitions) --- ## Klaar? Volgende les: Server Actions + form handling + voorbereiding op Supabase. Daarna Les 7 = echte database.