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

Une page qui possède une seule action est, en pratique, plutôt rare. La plupart du temps vous aurez besoin d’avoir plusieurs actions sur la même page. Dans cette application, ajouter une tâche ne suffit pas — nous aimerions pouvoir les supprimer une fois qu’elles sont terminées.

Commencez par remplacer notre action default avec les actions create et delete :

src/routes/+page.server
export const actions = {
	create: async ({ cookies, request }) => {
		const data = await request.formData();
		db.createTodo(cookies.get('userid'), data.get('description'));
	},

	delete: async ({ cookies, request }) => {
		const data = await request.formData();
		db.deleteTodo(cookies.get('userid'), data.get('id'));
	}
};

Les actions par défault (default) ne peuvent pas coexister avec les actions nommées.

L’élément <form> a un attribut optionnel action, qui est similaire à l’attribut href d’un élément <a>. Mettez à jour le formulaire existant pour le faire pointer vers la nouvelle action create :

src/routes/+page
<form method="POST" action="?/create">
	<label>
		ajouter une tâche :
		<input
			name="description"
			autocomplete="off"
		/>
	</label>
</form>

L’attribut action peut être n’importe quelle URL — si l’action était définie sur une autre page, vous pourriez avoir quelque chose comme /todos?/create. Puisque l’action est sur cette page, nous pouvons omettre complètement le chemin, ce qui explique que l’attribut action a une valeur commençant par ?.

Ensuite, nous souhaitons créer un formulaire pour chaque tâche, ainsi qu’un <input> caché qui l’identifie de manière unique :

src/routes/+page
<ul class="todos">
	{#each data.todos as todo (todo.id)}
		<li>
			<form method="POST" action="?/delete">
				<input type="hidden" name="id" value={todo.id} />
				<span>{todo.description}</span>
				<button aria-label="Marquer comme fait"></button>
			</form>
		</li>
	{/each}
</ul>

Modifier cette page sur Github

précédent suivant
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
55
56
57
58
59
60
61
62
63
64
<script>
	let { data } = $props();
</script>
 
<div class="centered">
	<h1>à faire</h1>
 
	<form method="POST">
		<label>
			ajouter une tâche :
			<input
				name="description"
				autocomplete="off"
			/>
		</label>
	</form>
 
	<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>