createForm
API for the createForm function
createForm
This is a client side form, for server side actions check out the
createForm$function.
The createForm utility is being used to create a form and interact with the MediaKit/Forms api.
import { z } from 'zod'import { createForm } from '@solid-mediakit/forms'
const { RenderTestForm, testFieldErrors } = createForm({ schema: z.object({ name: z.string().min(1), test: z.string().min(1), }), name: 'test',})CreateForm Input
The createForm function accepts in 3 properties
schema (required)
const {} = createForm({ schema: z.object({ name: z.string().min(1), test: z.string().min(1), }), ...})name (optional)
Specifying a name is going to change all of your returned variables names
const { RenderTestForm } = createForm({ name: 'test', ...})
// no name
const { RenderForm } = createForm({...})defaultValues (optional)
const {} = createForm({ defaultValues: { name: 'default name', test: 'default test', }, ...})Variables Name
The returned variables names changed based on the name mentioned in the createForm input.
// name: testconst { RenderTestForm, testFieldErrors, TestField } = createForm({ schema: z.object({ name: z.string().min(1), test: z.string().min(1) }), name: 'test',})
// name: okconst { RenderOkForm, okFieldErrors, OkField } = createForm({ schema: z.object({ name: z.string() }), name: 'ok',})
// no nameconst { RenderForm, fieldErrors, Field } = createForm({ schema: z.object({ name: z.string() }),})Once created a form, you will be given a function to render the Form automatically, but you will also be given a Field component you could use to render the <form> element on your own.
RenderForm
This is the recommended way of rendering a form, all you need is to render the RenderForm component you received from the createForm function.
import { type VoidComponent } from 'solid-js'import { z } from 'zod'import { createForm } from '@solid-mediakit/forms'
const Home: VoidComponent = () => { const { RenderExampleForm, exampleFieldErrors } = createForm({ schema: z.object({ name: z.string().min(1), test: z.string().min(1), }), name: 'example', }) return ( <RenderExampleForm onSubmit={async (input) => console.log(input)} onFormError={(e) => { if (e.isZodError()) { const nameErros = e.cause.fieldErrors.name // string[] | undefined const testErrors = e.cause.fieldErrors.test // string[] | undefined console.log('Validation error', { nameErros, testErrors }) } else { console.log(e.cause) } }} class='flex p-3 rounded-lg flex-col gap-2 h-[300px] w-[80vw] bg-zinc-800 items-center' > {({ Field, name }) => { // name: name | 'test const bgColor = name === 'test' ? 'bg-gray-700' : 'bg-zinc-900' return ( <Field inputClass={`${bgColor} p-3 rounded-lg focus:outline-none text-gray-500`} labelClass='text-white font-bold text-lg' wrapperClass='flex flex-col gap-1' /> ) }} <button class='bg-zinc-900 w-[80%] font-bold rounded-lg p-3 text-white flex items-center justify-center'> My Submit </button> </RenderExampleForm> )}
export default HomeonSubmit
This function will be called with a type-safed required input after validation the input using the provided schema.
<RenderExampleForm onSubmit={async (input) => { console.log(input) // {name: string; test: string;} }}>{...}</RenderExampleForm>onFormError
This function will be called whenever the schema failed to validate the input.
<RenderExampleForm onFormError={(e) => { if (e.isZodError()) { const nameErros = e.cause.fieldErrors.name // string[] | undefined const testErrors = e.cause.fieldErrors.test // string[] | undefined console.log('Validation error', { nameErros, testErrors }) } else { console.log(e.cause) } }}>{...}</RenderExampleForm>validate
This function returned from createForm is a function you can use to validate your data manually (i.e when you don't want to use RenderForm).
<form onSubmit={async (e) => { e.preventDefault() e.stopPropagation() const [success, dataOrError] = await validateTest() if (success) { console.log('is data', dataOrError) // do stuff } else { console.log('is error', dataOrError) } }}></form>Notice again: the name of the variables change based on the name property mention in the createForm input.
Field
You can also create your own forms and use our validation & type-safed Field component
import { Show, type VoidComponent } from 'solid-js'import { z } from 'zod'import { createForm } from '@solid-mediakit/forms'
const styles = { inputClass: 'p-3 bg-zinc-900 rounded-lg focus:outline-none text-gray-500', labelClass: 'text-white font-bold text-lg', wrapperClass: 'flex flex-col gap-1',}
const Home: VoidComponent = () => { const { testFieldErrors, TestField, validateTest } = createForm({ schema: z.object({ name: z.string().min(1), test: z.string().min(1), }), name: 'test', }) return ( <div> <Show when={testFieldErrors()}> {(e) => { return <pre>{JSON.stringify(e(), null, 2)}</pre> }} </Show> <form onSubmit={async (e) => { e.preventDefault() e.stopPropagation() const [success, dataOrError] = await validateTest(e.target) if (success) { console.log('is data', dataOrError) // do stuff } else { console.log('is error', dataOrError) } }} > <TestField name='test' {...styles} /> <TestField name='name' {...styles} /> <button type='submit'>My Submit</button> </form> </div> )}
export default HomeStyling
When using the Field component, you can choose to style it however you like:
- inputClass - The class of the input element
- labelClass - The class of the label element
- wrapperClass - The class of the div that wraps the
inputandlabelelements.
<Field inputClass='p-3 rounded-lg focus:outline-none text-gray-500' labelClass='text-white font-bold text-lg' wrapperClass='flex flex-col gap-1'/>Note: This is also relevent to the Field component you receieve when using the RenderForm method.
fieldErrors
The createForm function returns a signal that contains the errors of the input, so we can also do something like:
<Show when={exampleFieldErrors()}> {(e) => { return <pre>{JSON.stringify(e(), null, 2)}</pre> }}</Show>Notice again: the name of the variables change based on the name property mention in the createForm input.
values
The createForm function also returns a signal that contains the current forms values, so we can use a SolidJS effect to render the current values.
const { testValues } = createForm({ schema: z.object({ name: z.string().min(1), test: z.string().min(1), }), name: 'test', defaultValues: { name: 'default name', test: 'default test', },})
createEffect(() => { console.log(testValues())})Last updated: 5/30/25, 9:16 AM