apps/mantine.dev/src/pages/form/create-form-context.mdx
import { FormDemos } from '@docs/demos'; import { Layout } from '@/layout'; import { MDX_DATA } from '@/mdx';
export default Layout(MDX_DATA.createFormContext);
The createFormContext function creates a context provider and hook to get the form object from context:
import { TextInput } from '@mantine/core';
import { createFormContext } from '@mantine/form';
// Definition of form values is required
interface FormValues {
age: number;
name: string;
}
// createFormContext returns a tuple with 3 items:
// FormProvider is a component that sets the form context
// useFormContext hook returns the form object that was previously set in FormProvider
// useForm hook works the same way as useForm exported from the package but has a predefined type
const [FormProvider, useFormContext, useForm] =
createFormContext<FormValues>();
function ContextField() {
const form = useFormContext();
return (
<TextInput
label="Your name"
key={form.key('name')}
{...form.getInputProps('name')}
/>
);
}
export function Context() {
// Create form as described in use-form documentation
const form = useForm({
mode: 'uncontrolled',
initialValues: {
age: 0,
name: '',
},
});
// Wrap your form with FormProvider
return (
<FormProvider form={form}>
<form onSubmit={form.onSubmit(() => {})}>
<ContextField />
</form>
</FormProvider>
);
}
Usually it's a good idea to store the form context in a separate file to avoid dependency cycles:
// form-context.ts file
import { createFormContext } from '@mantine/form';
interface UserFormValues {
age: number;
name: string;
}
// You can give context variables any name
export const [UserFormProvider, useUserFormContext, useUserForm] =
createFormContext<UserFormValues>();
Then you can import context variables from anywhere:
// NameInput.tsx
import { TextInput } from '@mantine/core';
import { useUserFormContext } from './form-context';
export function NameInput() {
const form = useUserFormContext();
return (
<TextInput
label="Name"
key={form.key('name')}
{...form.getInputProps('name')}
/>
);
}
// UserForm.tsx
import { NumberInput } from '@mantine/core';
import { UserFormProvider, useUserForm } from './form-context';
import { NameInput } from './NameInput';
function UserForm() {
const form = useUserForm({
mode: 'uncontrolled',
initialValues: {
age: 0,
name: '',
},
});
return (
<UserFormProvider form={form}>
<form onSubmit={form.onSubmit(() => {})}>
<NumberInput
label="Age"
key={form.key('age')}
{...form.getInputProps('age')}
/>
<NameInput />
</form>
</UserFormProvider>
);
}