![require(esm) Backported to Node.js 20, Paving the Way for ESM-Only Packages](https://cdn.sanity.io/images/cgdhsj6q/production/be8ab80c8efa5907bc341c6fefe9aa20d239d890-1600x1097.png?w=400&fit=max&auto=format)
Security News
require(esm) Backported to Node.js 20, Paving the Way for ESM-Only Packages
require(esm) backported to Node.js 20, easing the transition to ESM-only packages and reducing complexity for developers as Node 18 nears end-of-life.
material-ui-hook-form
Advanced tools
A set of wrapper components to facilitate using Material-UI with React Hook Form
A set of wrapper components to facilitate using Material-UI with React Hook Form
This component can use inside
<Fields>
You can pass any props from TextField
to Field
.
Additional props from React Hook Form
:
name: string
- name is required and unique. Input name also supports dot and bracket syntax, which allows you to easily create nested form fields. Read more
control?: Control
- control object is from invoking useForm. it's optional if you are using FormContext.required?: string | ValidationOptionObject<boolean>
min?: ValidationOptionObject<number | string>
max?: ValidationOptionObject<number | string>
maxLength?: ValidationOptionObject<number | string>
minLength?: ValidationOptionObject<number | string>
pattern: ValidationOptionObject<RegExp>
validate?: Validate | Record<string, Validate>
Addtional props:
disableErrorMessage?: boolean
- Hide error message when truedisableLabel?:boolean
- Hide label when true// Text
<Field name="firstName" />
<Field name="firstName" required maxLength={5} minLength={3} />
<Field name="phone" pattern={/^\d+$/} />
// TextArea
<Field name="note" multiline rows={4} />
<Field
name="note"
multiline
rows={4}
validate={v =>
v
? String(v)
.toLowerCase()
.includes('mui') || 'note must include word `mui`'
: undefined
}
/>;
// Select
<Field name="department" options={['HR', 'accounting', 'shipping']} />
// Select with render props
<Field name="department">
{DEPARTMENTS.map(option=> {
<MenuItem key={option} value={option}>{option}</MenuItem>
})}
</Field>
This component can use inside
<Fields>
You can pass any props from TextField
to FieldNumber
except select
, SelectProps
.
You can pass any props from React Number Format
Additional props from React Hook Form
:
name: string
- name is required and unique. Input name also supports dot and bracket syntax, which allows you to easily create nested form fields. Read more
control?: Control
- control object is from invoking useForm. it's optional if you are using FormContext.required?: string | ValidationOptionObject<boolean>
min?: ValidationOptionObject<number | string>
max?: ValidationOptionObject<number | string>
validate?: Validate | Record<string, Validate>
Addtional props:
disableErrorMessage?: boolean
- Hide error message when truedisableLabel?:boolean
- Hide label when true// Number
<FieldNumber name="age" />
// Currency, $ 150,000
<FieldNumber name="salary" min={150000} thousandSeparator prefix="$ " md={4} />
If you need to build advanced Number Format, you can leaveage <FieldNumberFormat />
// A Money Format that will store user input as smallest currency unit and display as regular format.
// e.g. $100 => 100000
function CurrencyFormat({ value, onChange, currency = 'USD', ...other }: any) {
const [maskValue, setMaskValue] = React.useState(value / 100);
React.useEffect(() => setMaskValue(value / 100), [value]);
return (
<NumberFormat
value={maskValue}
isNumericString
thousandSeparator
onValueChange={target => {
if (target.floatValue) {
setMaskValue(target.floatValue);
onChange(target.floatValue * 100);
}
}}
customInput={TextField}
prefix={getCurrencyPrefix(currency)}
decimalScale={getCurrencyDecimalScale(currency)}
{...other}
/>
);
}
interface FieldMoney extends Except<FieldNumberFormat, 'as'> {
currency?: CurrencyEnum;
}
function FieldMoney({ className, ...other }: FieldMoney) {
return <FieldNumberFormat {...other} as={CurrencyFormat} className={clsx(className)} />;
}
export default FieldMoney;
This component can use inside
<Fields>
You can pass any props from Autocomplete
to FieldAutocomplete
.
You can pass any props from TextField
to FieldAutocomplete
except onChange
, select
, SelectProps
.
Additional props from React Hook Form
:
name: string
- name is required and unique. Input name also supports dot and bracket syntax, which allows you to easily create nested form fields. Read more
control?: Control
- control object is from invoking useForm. it's optional if you are using FormContext.required?: string | ValidationOptionObject<boolean>
validate?: Validate | Record<string, Validate>
Addtional props:
disableErrorMessage?: boolean
- Hide error message when truedisableLabel?:boolean
- Hide label when trueFieldAutocomplete has a default renderInput implementation, which just a TextField with error message, All TextField props will forwarded to TextField. You can override renderInput if needed.
(params: RenderInputParams) => (
<TextField
fullWidth
required={!!required}
label={!naked ? label ?? getInputLabelFromName(name) : undefined}
helperText={!naked ? error?.message ?? helperText : undefined}
error={!!error}
variant={variant as any}
{...params}
{...other}
/>
);
// Autocomplete
<FieldAutocomplete name="gender" options={['male', 'female']} />
<FieldAutocomplete name="gender" options={['male', 'female']} required />
<FieldAutocomplete
name="gender"
options={['male', 'female', 'other']}
validate={v=> v === 'other' || 'Only other is allowed'}
/>
You can pass any props from RadioGroup
to FieldRadioGroup
.
Additional props from React Hook Form
:
name: string
- name is required and unique. Input name also supports dot and bracket syntax, which allows you to easily create nested form fields. Read more
control?: Control
- control object is from invoking useForm. it's optional if you are using FormContext.required?: string | ValidationOptionObject<boolean>
Addtional props:
label?: string
- Form LabeldisableErrorMessage?: boolean
- Hide error message when trueoptions: (string | { value: string; label?: string })[]
- self describedhelperText?: string
- @see TextField#helperTextdisabled?: boolean
- @see TextField#disabled// TODO
You can pass any props from <form />
.
Additional props:
form?: FormContextValues
- If you pass the form object got from invoking useForm()
. It will wrap a FormContext for youdebug?: boolean
- TODOinterface Form extends React.FormHTMLAttributes<HTMLFormElement> {
form?: FormContextValues;
debug?: boolean;
}
function Form({ form, ...other }: Form) {
const component = <form noValidate {...other} />;
return form ? <FormContext {...form}>{component}</FormContext> : component;
}
You can pass any props from Grid
to Fields
except container
and item
.
spacing=2
default valuexs=12
default value.// All field now wrapped with <Grid item xs={12} md={6}/> You can override this by pass breakpoints to individual `Field`
<Fields md={6}>
<Field name="department" md={12} />
<Field name="firstName" />
<Field name="lastName" />
<FieldNumber name="age" md={4} />
<FieldNumber name="salary" md={4} />
<Field name="phone" md={4} />
<Field name="note" />
</Fields>
A button with loading indicator and disabled while submitting
You can pass any props from Button
to Submit
Additional props from React Hook Form
:
control?: Control
- control object is from invoking useForm. it's optional if you are using FormContext.Addtional props:
loading?: boolean
- Disable button and show loading indicator when true, it's optional if you are using FormContextconst form = useForm();
<Form
form={form}
onSubmit={form.handleSubmit(async () => {
// sleep
await new Promise(resolve => setTimeout(resolve, 2000));
})}
>
<Submit />
</Form>;
In order to make your form looks good, you should customize material-ui with your theme.
Here is the default theme we used in storybook example
createMuiTheme({
props: {
MuiFilledInput: {
disableUnderline: true,
},
MuiTextField: {
margin: 'none',
size: 'small',
variant: 'filled',
},
MuiFormHelperText: {
variant: 'filled',
},
MuiInputLabel: {
shrink: true,
variant: 'filled',
},
MuiFormControl: {
margin: 'none',
variant: 'filled',
},
},
overrides: {
MuiInputBase: {
input: {
'&$disabled': {
cursor: 'not-allowed',
},
},
},
MuiFilledInput: {
root: {
borderRadius: 4,
},
},
},
});
FAQs
A set of wrapper components to facilitate using Material-UI with React Hook Form
The npm package material-ui-hook-form receives a total of 2 weekly downloads. As such, material-ui-hook-form popularity was classified as not popular.
We found that material-ui-hook-form demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
require(esm) backported to Node.js 20, easing the transition to ESM-only packages and reducing complexity for developers as Node 18 nears end-of-life.
Security News
PyPI now supports iOS and Android wheels, making it easier for Python developers to distribute mobile packages.
Security News
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.