Unlock the Power of Forms in Svelte
Tracking User Input with Svelte
Forms are an essential part of web development, and Svelte is no exception. To create robust and user-friendly forms, you need to track user input, validate data, and handle form submissions.
Svelte provides two directives to track user input: on:input and bind:value. While on:input requires a handleInput event, bind:value offers a cleaner way to work with form values. We’ll use bind:value to simplify our form development process.
<input bind:value={name} />
Validating Forms with Yup
Yup is a popular JavaScript object schema validator that ensures data conforms to a specific structure. By defining a schema, you can validate objects and guarantee that the data sent to the server is valid.
const schema = yup.object().shape({
name: yup.string().required(),
email: yup.string().email().required(),
});
We’ll create a profile form and validate it using Yup’s validate method.
schema.validate(values, { abortEarly: false })
.then(() => {
// Form is valid
})
.catch((err) => {
// Form is invalid
});
Creating a Profile Form with Svelte
Let’s set up a simple profile form to capture user data. We’ll bind the form fields to a values object and create an errors object to store validation errors. Our handleSubmit function will handle form validation and submission.
<form on:submit={handleSubmit}>
<label>Name:</label>
<input bind:value={values.name} />
<br>
<label>Email:</label>
<input bind:value={values.email} />
<br>
<button type="submit">Submit</button>
</form>
Displaying Validation Errors
To display errors, we’ll loop over Yup’s validation error.inner array and create a new object with fields and error messages. We’ll then update the errors object with the corresponding input field errors.
const errors = {};
err.inner.forEach((error) => {
errors[error.path] = error.message;
});
Simplifying Form Development with svelte-forms-lib
svelte-forms-lib is a Formik-inspired library that makes building forms in Svelte easier. We’ll explore how to integrate svelte-forms-lib into our form, using its createForm function, observables, and helper functions like handleChange and handleSubmit.
import { createForm } from 'velte-forms-lib';
const form = createForm({
values: {
name: '',
email: '',
},
validationSchema: schema,
});
Custom Validation with svelte-forms-lib
We’ll learn how to add a custom validation callback to createForm, checking the state of each input field and updating the errors object accordingly.
const form = createForm({
values: {
name: '',
email: '',
},
validate: (values) => {
const errors = {};
// Custom validation logic
return errors;
},
});
Yup Validation in svelte-forms-lib
svelte-forms-lib also supports Yup validation through the validationSchema prop. We’ll pass in our schema object and let svelte-forms-lib handle the validation.
const form = createForm({
values: {
name: '',
email: '',
},
validationSchema: schema,
});
Custom Form Components in svelte-forms-lib
To reduce boilerplate code, svelte-forms-lib provides custom components like <Form/>, <Field/>, <Select/>, and <ErrorMessage/>. We’ll use these components to create a concise and efficient form.
<Form>
<Field name="name">
<input />
<ErrorMessage>{errors.name}</ErrorMessage>
</Field>
<Field name="email">
<input />
<ErrorMessage>{errors.email}</ErrorMessage>
</Field>
<button type="submit">Submit</button>
</Form>