Your Button component should default to type="button"
Published on in JavaScript, React and TypeScript
A <button> element defaults to type="submit"
which can cause accidental form submissions.
Make type="button" the default in your Button component
to make your life easier.
Table of contents
type="button" vs type="submit"
A <button> element without a type attribute
defaults to type="submit".
Clicking a submit button associated with a <form>
submits the form
unless event.preventDefault() is called.
A <button> element with type="button" on the other hand
does nothing by default when clicked.
Calling event.preventDefault() does nothing
because there's no default action to prevent.
Setting your Button component to default to type="button"
allows you to not worry about:
- accidental form submissions
- having to remember call
event.preventDefault().
Also, using <Button type="submit"> makes it explicit that it's a submit button.
Example with React and TypeScript
type Props = React.ButtonHTMLAttributes<HTMLButtonElement> & { type?: 'submit' }
const Button = ({ children, type, ...props }: Props) => (
<button {...props} type={type || 'button'}>
{children}
</button>
)
// Usage:
<Button /> // Defaults to `type="button"`
<Button type="submit" />
The type prop's value in React.ButtonHTMLAttributes<HTMLButtonElement>
is "submit" | "button" | "reset" | undefined.
I'm restricting the value to "submit" | undefined,
so that only type="submit" is allowed.
(Omitting the prop is also allowed.)
type="button"is not allowed because it's the default, so it would be unnecessary noise.type="reset"is not allowed because reset buttons (i.e. buttons that empty the whole form) are so stupid. 🤡 Not on my watch!