Form Actions
Tangani pengiriman formulir dengan aksi sisi server dan validasi.
Form action memungkinkan Anda menangani pengiriman <form> di server, dengan pola validasi bawaan.
Mendefinisikan Actions
Ekspor objek actions dari +page.server.ts:
// src/routes/contact/+page.server.ts
import { fail } from "bosia";
import type { RequestEvent } from "bosia";
export async function load() {
return { greeting: "Contact us" };
}
export const actions = {
default: async ({ request }: RequestEvent) => {
const data = await request.formData();
const email = data.get("email") as string;
const name = data.get("name") as string;
const errors: Record<string, string> = {};
if (!email) errors.email = "Email is required";
if (!name) errors.name = "Name is required";
if (Object.keys(errors).length > 0) {
return fail(400, { email, name, errors });
}
// Process the form...
return { success: true, email, name };
},
};Default Action
Sebuah <form method="POST"> tanpa atribut action akan mengenai action default:
<form method="POST">
<input name="name" value={form?.name ?? ""} />
<input name="email" value={form?.email ?? ""} />
<button type="submit">Submit</button>
</form>Named Actions
Gunakan atribut action dengan awalan ?/ untuk menarget action tertentu:
<form method="POST" action="?/reset">
<button type="submit">Reset</button>
</form>export const actions = {
default: async ({ request }: RequestEvent) => {
// ...
},
reset: async () => {
return { cleared: true };
},
};Validasi dengan fail()
fail() mengembalikan sebuah ActionFailure — ia dikembalikan, bukan dilempar:
import { fail } from "bosia";
// Returns a 400 response with the error data
return fail(400, {
email, // preserve user input
name,
errors: { email: "Invalid email format" },
});Mengakses Data Action
Hasil action tersedia sebagai prop form:
<script lang="ts">
let { data, form } = $props();
</script>
{#if form?.errors}
<p class="text-red-500">{form.errors.email}</p>
{/if}
{#if form?.success}
<p class="text-green-500">Submitted successfully!</p>
{/if}Redirect dari Actions
Gunakan redirect() untuk berpindah halaman setelah action berhasil:
import { redirect } from "bosia";
export const actions = {
default: async ({ request }: RequestEvent) => {
// Process form...
redirect(303, "/thank-you");
},
};Cara Kerjanya
- Browser mengirimkan formulir sebagai request POST standar
- Bosia memanggil fungsi action yang cocok
- Saat berhasil: halaman dirender ulang dengan nilai kembalian action sebagai prop
formdan dataload()yang segar - Saat fail(): halaman dirender ulang dengan data kegagalan sebagai prop
formpada kode status yang ditentukan - Saat redirect(): browser mengikuti redirect