Multi-Step Form

Collect user information through different pages and sections.

Check full example at StackBlitz.

Step 1: Set up your routes.

import { Router, Route } from "@solidjs/router" import { MultiStepForm } from "./multistep_form" import { Step1 } from "./step1" import { Step2 } from "./step2" import { Result } from "./result" export const App = () => { return ( <Router> <Route path="/" component={MultiStepForm}> <Route path="/step1" component={Step1} /> <Route path="/step2" component={Step2} /> <Route path="/result" component={Result} /> </Route> </Router> ) }

Step 2: Create your pages, collect the data and navigate to the next page.

import { createForm, FormProvider } from 'solid-hook-form' export const MultiStepForm = (props) => { const form = createForm({ defaultValues: { addressLine1: '', addressLine2: '', firstName: '', lastName: '' } mode: 'onChange' }) const { handleSubmit } = form const onSubmit = (values) => { console.log(values) } return ( <FormProvider form={form}> <form onSubmit={handleSubmit(onSubmit)}> {props.children} </form> </FormProvider> ) }

import { useFormContext } from 'solid-hook-form'; import { useNavigate } from '@solidjs/router'; import { Show } from 'solid-js'; export const Step1 = () => { const navigate = useNavigate(); const { register, errors, trigger, formState } = useFormContext(); const onNext = () => { trigger(); if (formState.isValid()) { navigate('/step2'); } }; return ( <fieldset name="address" > <h3>Step 1</h3> <input {...register('addressLine1', { required: 'Required' })} /> <Show when={errors.addressLine1}> <p role="alert">{errors.addressLine1?.message}</p> </Show> <input {...register('addressLine2', { required: 'Required' })} /> <Show when={errors.addressLine2}> <p role="alert">{errors.addressLine2?.message}</p> </Show> <button type="button" onClick={onNext}>Next</button> </fieldset> ); };

Step 3: Make final submission with all the data or display the resulting data.

import { useFormContext } from 'solid-hook-form'; import { useNavigate } from '@solidjs/router'; export const Summary = () => { const navigate = useNavigate(); const { getValues } = useFormContext(); const onBack = () => { navigate(-1); }; return ( <div> <h3>Result</h3> <p> Address: {getValues('addressLine1')} {getValues('addressLine2')} </p> <p> Contact: {getValues('firstName')} {getValues('lastName')} </p> <button type="submit">Submit</button> <button type="button" onClick={onBack}> Back </button> </div> ); };