Skip to main content
Bases de Svelte
Introduction
Réactivité
Props
Logique
Évènements
Liaisons
Classes et styles
Actions
Transitions
Svelte avancé
Réactivité avancée
Réutiliser du contenu
Mouvements
Liaisons avancées
Transitions avancées
API de contexte
Éléments spéciaux
<script module>
Next steps
Bases de SvelteKit
Introduction
Routing
Chargement de données
En-têtes et cookies
Modules partagés
Formulaires
Routes d’API
$app/state
Erreurs et redirections
SvelteKit avancé
Hooks
Options de page
Options de lien
Routing avancé
Chargement avancé
Variables d’environnement
Conclusion

Dans le chapitre sur le chargement des données, nous avons vu comment récupérer des données venant du serveur dans le navigateur. Parfois, vous avez besoin d’envoyer des données dans la direction opposée, et c’est là que <form> — la méthode native de la plateforme web de soumettre des données — rentre en jeu.

Construisons une application de Todo. Nous avons déjà une base de données en mémoire définie dans src/lib/server/database.js, et notre fonction load de src/routes/+page.server.js utilise l’API cookies afin d’avoir une liste par utilisateur, mais nous avons besoin d’un <form> pour ajouter de nouveaux éléments :

src/routes/+page
<h1>todos</h1>

<form method="POST">
	<label>
		ajouter un élément :
		<input
			name="description"
			autocomplete="off"
		/>
	</label>
</form>

<ul class="todos">

Si nous entrons quelque chose dans l’élément <input> et que nous appuyons sur Entrée, la navigateur fait une requête POST (grâce à l’attribut method="POST") vers la route courante. Mais cela renvoie une erreur car nous n’avons pas créé d’action sur le serveur permettant de gérer cette request POST. Faisons ça maintenant :

src/routes/+page.server
import * as db from '$lib/server/database.js';

export function load({ cookies }) {
	// ...
}

export const actions = {
	default: async ({ cookies, request }) => {
		const data = await request.formData();
		db.createTodo(cookies.get('userid'), data.get('description'));
	}
};

Le contenu de request est un objet Request standard ; await request.formData() renvoie une instance de FormData.

Lorsque nous appuyons maintenant sur Entrée, la base de données est mise à jour et la page se recharge avec les nouvelles données.

Notez que nous n’avons pas eu besoin d’écrire de code impliquant fetch ou similaire — les données se mettent à jour automatiquement. Et puis nous avons utilisé un élément <form>, cette application fonctionnerait même si JavaScript était désactivé ou indisponible.

Modifier cette page sur Github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<script>
	let { data } = $props();
</script>
 
<div class="centered">
	<h1>à faire</h1>
 
	<ul class="todos">
		{#each data.todos as todo (todo.id)}
			<li>
				{todo.description}
			</li>
		{/each}
	</ul>
</div>
 
<style>
	.centered {
		max-width: 20em;
		margin: 0 auto;
	}
 
	label {
		width: 100%;
	}
 
	input {
		flex: 1;
	}
 
	span {
		flex: 1;
	}
 
	button {
		border: none;
		background: url(./remove.svg) no-repeat 50% 50%;
		background-size: 1rem 1rem;
		cursor: pointer;
		height: 100%;
		aspect-ratio: 1;
		opacity: 0.5;
		transition: opacity 0.2s;
	}
 
	button:hover {
		opacity: 1;
	}
 
	.saving {
		opacity: 0.5;
	}
</style>