SvelteKit Load Functions och Form Actions 🎯
Modulsmål 🚀
Efter denna modul behärskar du 50% av Webbserverprogrammering 1 (for real! 💪). Du kommer att kunna:
- ✅ Ladda data på servern med load functions (25% av kursen!)
- ✅ Skicka data till servern med form actions (25% av kursen!)
- ✅ Hantera state på servern mellan requests
- ✅ Använda cookies för att spåra användare
Konceptöversikt: Load vs Actions 🧠
Load Functions - Hämta data 📥
- Körs på servern innan sidan laddas
- Skickar data från server till klient
- Har tillgång till cookies, params, URL, etc.
Form Actions - Skicka data 📤
- Körs på servern när formulär skickas
- Tar emot data från klient till server
- Fungerar även utan JavaScript!
I förra modulen byggde du egna API endpoints med +server.ts
. Nu lär vi oss SvelteKit:s inbyggda sätt att hantera data - mycket smidigare för vanliga use cases! Du kommer att uppskatta skillnaden.
Dagens övning: Bygg en Clicker-app! 🖱️
Steg 1: Skapa projektet 🏗️
# VIKTIGT: Var i rätt mapp! Inte i ditt gamla projekt
npm create svelte@latest clicker-app
cd clicker-app
npm install
npm run dev
Många glömmer att cd clicker-app
. Kom ihåg rätt mapp!
Steg 2: Sätt upp server-state 📊
Skapa src/lib/store.ts
för att hålla koll på din count:
// src/lib/store.ts
let count = 0;
export function getCount(): number {
return count;
}
export function incrementCount(): number {
count++;
return count;
}
// Lägg till fler funktioner här om du vill...
/lib
är SvelteKit:s konvention för delad kod som kan importeras överallt!
Steg 3: Load function - Skicka data till klienten 📤
Skapa src/routes/+page.server.ts
:
// src/routes/+page.server.ts
import type { PageServerLoad } from './$types';
import { getCount } from '$lib/store';
export const load = (({ cookies, url, params }) => {
// Din kod här - vad ska du returnera?
// Tips: det du returnerar här blir tillgängligt som 'data' i +page.svelte
}) satisfies PageServerLoad;
Steg 4: Form Actions - Ta emot data från klienten 📥
Lägg till i samma fil:
// Fortsättning i +page.server.ts
import type { Actions } from './$types';
export const actions = {
increment: async ({ request, cookies }) => {
// Din kod här - vad ska hända när någon klickar?
// Tips: använd incrementCount() från din store
},
// Lägg till fler actions om du vill...
} satisfies Actions;
Steg 5: Frontend - Visa och skicka 🎨
Uppdatera src/routes/+page.svelte
:
<script>
import { enhance } from '$app/forms';
// Hur får du tag på data från load function?
export let data;
</script>
<h1>Clicker App!</h1>
<!-- Visa count här -->
<p>Count: {/* Vad ska stå här? */}</p>
<!-- Form för att klicka -->
<form method="POST" action="?/increment" use:enhance>
<button type="submit">Klicka mig!</button>
</form>
<!-- Lägg till styling om du vill -->
Viktiga koncept 🧠
Action naming
<!-- Formuläret anropar "increment" action -->
<form method="POST" action="?/increment">
<!-- Motsvarar: -->
export const actions = {
increment: async ({ request }) => { ... }
}
use:enhance = ingen page reload
<!-- Utan use:enhance - sidan laddar om -->
<form method="POST" action="?/increment">
<!-- Med use:enhance - smooth! -->
<form method="POST" action="?/increment" use:enhance>
Nästa nivå: Multi-user med cookies! 🍪
När du har grundversionen fungerande, försök detta:
Utöka din store för flera användare
// src/lib/store.ts
const userCounts = new Map<string, number>();
export function getUserCount(userId: string): number {
// Din kod här
}
export function incrementUserCount(userId: string): number {
// Din kod här
}
// Kanske en funktion för att få alla användares counts?
Använd cookies för att identifiera användare
// I din load function
export const load = (({ cookies }) => {
let userId = cookies.get('userId');
if (!userId) {
// Skapa ett nytt användar-ID och spara i cookie
// Tips: använd crypto.randomBytes() eller Math.random()
// VIKTIGT: Detta är osäkert för produktion!
// Vi lär oss säker authentication i senare moduler
cookies.set('userId', user.id,{
path: '/'
})
}
// Returnera data baserat på userId
}) satisfies PageServerLoad;
// Läsa cookie
const value = cookies.get('name');
// Sätta cookie
cookies.set('name', 'value', {
path: '/',
maxAge: 60 * 60 * 24 // 1 dag
});
Vanliga problem 🔧
❌ "Actions not found"
Kontrollera:
- Har du skapat
+page.server.ts
? - Stämmer action-namnet:
action="?/increment"
→increment: async
❌ Data uppdateras inte
Lösning: Glöm inte use:enhance
på formuläret!
❌ "Cannot read property of undefined"
Kontrollera: Returnerar din load function rätt data?
Utmaningar 🚀
Grundnivå:
- Lägg till en "reset" knapp
- Visa när sidan senast laddades
- Lägg till lite CSS för att göra det snyggt
Mellannivå:
- Håll koll på flera användare med cookies
- Visa en topplista med alla användares counts
- Lägg till formulär för att sätta eget användarnamn
Expertnivå:
- Realtidsuppdateringar när andra klickar
- Spara data så det överlever server-restart
- Lägg till statistik (klick per minut, etc.)
- Load Functions: kit.svelte.dev/docs/load
- Form Actions: kit.svelte.dev/docs/form-actions
- Cookies Tutorial: learn.svelte.dev/tutorial/cookies
Nästa steg 🎯
I nästa modul går vi igenom SvelteKit:s officiella tutorial för att befästa allt du lärt dig!