{"id":721,"date":"2019-02-23T18:24:31","date_gmt":"2019-02-23T18:24:31","guid":{"rendered":"http:\/\/upmostlymulti.onpressidium.com\/?p=721"},"modified":"2021-11-04T01:34:12","modified_gmt":"2021-11-04T06:34:12","slug":"using-custom-react-hooks-simplify-forms","status":"publish","type":"post","link":"http:\/\/upmostly.com\/tutorials\/using-custom-react-hooks-simplify-forms","title":{"rendered":"Using Custom React Hooks to Simplify Forms"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"530\" src=\"http:\/\/upmostly.com\/wp-content\/uploads\/custom-react-hooks-forms-1024x530.jpg\" alt=\"\" class=\"wp-image-769\" srcset=\"https:\/\/upmostly.com\/wp-content\/uploads\/custom-react-hooks-forms-1024x530.jpg 1024w, https:\/\/upmostly.com\/wp-content\/uploads\/custom-react-hooks-forms-300x155.jpg 300w, https:\/\/upmostly.com\/wp-content\/uploads\/custom-react-hooks-forms-768x397.jpg 768w, https:\/\/upmostly.com\/wp-content\/uploads\/custom-react-hooks-forms.jpg 1160w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Use custom React Hooks to build forms that require half the code to write, are reusable, and are much easier to&nbsp;read. Read on to learn more!<\/p>\n\n\n\n<div class=\"wp-block-button aligncenter is-style-outline is-style-outline--1\"><a class=\"wp-block-button__link has-vivid-cyan-blue-color has-text-color\" href=\"https:\/\/github.com\/Upmostly\/custom-react-hooks-forms\" target=\"_blank\" rel=\"noopener\">View Code<\/a><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">What We&#8217;re Building<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"570\" height=\"327\" src=\"http:\/\/upmostly.com\/wp-content\/uploads\/react-hooks-forms-final.gif\" alt=\"A login form built using React and React Hooks\" class=\"wp-image-755\"\/><figcaption>Our final form powered by a custom React hook<\/figcaption><\/figure>\n\n\n\n<p>Forms are always mistaken as something that&#8217;s&nbsp;easy to build. Think about it, we use forms every single day when we use web apps, from login-forms to search boxes.<\/p>\n\n\n\n<p>Therefore, because forms are so prevalent, what could be so hard about dropping a simple form into a page?<\/p>\n\n\n\n<p><strong>Us. Human-beings.<\/strong><\/p>\n\n\n\n<p>Humans are notoriously bad at using  forms. Give us a register page and we&#8217;ll find a way to break it and end up blaming the website developer.<\/p>\n\n\n\n<p>Forms require validation rules, formatting, accessibility options, the perfect layout, and complete browser support.<\/p>\n\n\n\n<p>That&#8217;s a lot for developers to handle. It&#8217;s not unheard of for a simple form to use an insane amount of code behind it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting up the React App<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>If you have an existing React app, you can skip this section and go straight to <strong>Building the Login Form.<\/strong>&nbsp;<\/p><\/blockquote>\n\n\n\n<p>Start by opening a new terminal window and moving (cd&#8217;ing) to a directory of your choice. Next, we&#8217;re going to use the fantastic Create React App toolset to spin up an empty React project.<\/p>\n\n\n\n<p>Type this in your terminal and hit return:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Terminal<\/div><pre class=\"language-bash\"><code class=\"language-bash\"><div>npx create-react-app react-hooks-form<\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>Follow the instructions in the <a rel=\"noreferrer noopener\" aria-label=\"Follow the instructions in the Create React App Github repository. We can move on once you have your brand-new empty React project running in your browser. (opens in a new tab)\" href=\"https:\/\/github.com\/facebook\/create-react-app\" target=\"_blank\">Create React App Github repository<\/a>. We can move on once you have your brand-new empty React project running in your browser.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>I&#8217;m using the Bulma CSS library in this tutorial. You don&#8217;t have to though, as it&#8217;s only used for styling the Form component.<\/p><\/blockquote>\n\n\n\n<p>To install Bulma, type the following into your terminal and hit return:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Terminal<\/div><pre class=\"language-bash\"><code class=\"language-bash\"><div><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> --save bulma<\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>Before we start throwing React Hooks at  forms,  we should first do some spring cleaning. (I always do this whenever I spin up a new React project using Create React App).<\/p>\n\n\n\n<p>Open up <strong><span class=\"has-inline-color has-vivid-red-color\">App.js<\/span>.<\/strong> Delete everything inside it apart from the outer div tag inside the <strong>App<\/strong> function, every import apart from the main React import.<\/p>\n\n\n\n<p>It&#8217;ll look something like this:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">App.js<\/div><pre class=\"language-jsx\"><code class=\"language-jsx\"><div><span class=\"token keyword\">import<\/span> React <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">App<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">{<\/span>\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>App<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n     \n    <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span>\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">default<\/span> App<span class=\"token punctuation\">;<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>If you want to use Bulma, we need to import it in&nbsp;<span class=\"has-inline-color has-vivid-red-color\"><strong>index.js<\/strong><\/span>.<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">index.js<\/div><pre class=\"language-javascript\"><code class=\"language-javascript\"><div><span class=\"token keyword\">import<\/span> React <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">import<\/span> ReactDOM <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react-dom'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">import<\/span> <span class=\"token string\">'.\/index.css'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">import<\/span> App <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/App'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">import<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">as<\/span> serviceWorker <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/serviceWorker'<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token comment\">\/\/ Importing the Bulma CSS library<\/span>\n<span class=\"token keyword\">import<\/span> <span class=\"token string\">'bulma\/css\/bulma.css'<\/span><span class=\"token punctuation\">;<\/span>\n\nReactDOM<span class=\"token punctuation\">.<\/span><span class=\"token function\">render<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&lt;<\/span>App <span class=\"token operator\">\/<\/span><span class=\"token operator\">><\/span><span class=\"token punctuation\">,<\/span> document<span class=\"token punctuation\">.<\/span><span class=\"token function\">getElementById<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'root'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token comment\">\/\/ If you want your app to work offline and load faster, you can change<\/span>\n<span class=\"token comment\">\/\/ unregister() to register() below. Note this comes with some pitfalls.<\/span>\n<span class=\"token comment\">\/\/ Learn more about service workers: http:\/\/bit.ly\/CRA-PWA<\/span>\nserviceWorker<span class=\"token punctuation\">.<\/span><span class=\"token function\">unregister<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Building the Form Component<\/h2>\n\n\n\n<p>We need to build our Form component before we start creating  React Hooks to handle forms events.<\/p>\n\n\n\n<p>Create a new file under the <em>src<\/em> directory. Call it&nbsp;<strong><span class=\"has-inline-color has-vivid-red-color\">Form.js<\/span><\/strong>.<\/p>\n\n\n\n<p><g class=\"gr_ gr_6 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-ins doubleReplace replaceWithoutSep\" id=\"6\" data-gr-id=\"6\">Form<\/g> is going to be a <em>stateful<\/em> functional component. There&#8217;s no&nbsp;need to import Component from React now that Hooks  add <g class=\"gr_ gr_7 gr-alert gr_gramm gr_inline_cards gr_run_anim Grammar only-ins doubleReplace replaceWithoutSep\" id=\"7\" data-gr-id=\"7\">state<\/g> to functional components.<\/p>\n\n\n\n<p>Type the following code into <span class=\"has-inline-color has-vivid-red-color\"><strong>Form.js<\/strong><\/span>:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Form.js<\/div><pre class=\"language-jsx\"><code class=\"language-jsx\"><div><span class=\"token keyword\">import<\/span> React <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">Form<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">{<\/span>\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>section is-fullheight<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n      <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>container<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n        <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>column is-4 is-offset-4<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n          <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>box<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n            <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>form<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>field<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>label<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Email Address<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>control<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>input<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">required<\/span> <span class=\"token punctuation\">\/><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>field<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>label<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Password<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>control<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>input<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>password<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>password<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">required<\/span> <span class=\"token punctuation\">\/><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>submit<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>button is-block is-info is-fullwidth<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Login<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n            <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>form<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n          <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n        <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n      <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n    <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span>\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">default<\/span> Form<span class=\"token punctuation\">;<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>We haven&#8217;t hooked up any of the form <strong>onSubmit<\/strong> or input<strong> onChange <\/strong>event handlers yet because we want to get a working form in HTML first.<\/p>\n\n\n\n<p>Save <strong><span class=\"has-inline-color has-vivid-red-color\">Form.js<\/span><\/strong>. Jump back to <strong><span class=\"has-inline-color has-vivid-red-color\">App.js<\/span><\/strong> and import Form at the top of the file. Finally, add the <strong>&lt;Form \/&gt;<\/strong> component to the render function of App.<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">App.js<\/div><pre class=\"language-jsx\"><code class=\"language-jsx\"><div><span class=\"token keyword\">import<\/span> React <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">import<\/span> Form <span class=\"token keyword\">from<\/span> <span class=\"token string\">'.\/Form'<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">App<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">{<\/span>\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>App<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n      <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>Form<\/span> <span class=\"token punctuation\">\/><\/span><\/span><span class=\"token plain-text\">\n    <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span>\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">default<\/span> App<span class=\"token punctuation\">;<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>Save <strong><span class=\"has-inline-color has-vivid-red-color\">App.js<\/span><\/strong>. Let&#8217;s make sure our Form component works. Hop over to the running React app in your browser and you should see a nice looking login form.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"534\" height=\"331\" src=\"http:\/\/upmostly.com\/wp-content\/uploads\/react-hooks-forms-login.png\" alt=\"\" class=\"wp-image-740\" srcset=\"https:\/\/upmostly.com\/wp-content\/uploads\/react-hooks-forms-login.png 534w, https:\/\/upmostly.com\/wp-content\/uploads\/react-hooks-forms-login-300x186.png 300w\" sizes=\"auto, (max-width: 534px) 100vw, 534px\" \/><\/figure>\n\n\n\n<p>Great! Now the magic begins! \u2728<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creating the Custom React Hooks Forms Handler<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>If you haven&#8217;t explored React Hooks yet, check out our <a href=\"http:\/\/upmostly.com\/tutorials\/react-hooks-simple-introduction\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"If you haven&#039;t explored React Hooks yet, check out our Simple Introduction to React Hooks (opens in a new tab)\">Simple Introduction to React Hooks<\/a><\/p><\/blockquote>\n\n\n\n<p>Forms have two main types of event handlers:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>onSubmit &#8211; handles the form submission.<\/li><li>onChange &#8211; handles changing any of the form input values.<\/li><\/ul>\n\n\n\n<p>Every form has these event handlers, so let&#8217;s write a custom React Hook to handle our forms event handlers. It&#8217;s the perfect use case!<\/p>\n\n\n\n<p>Create a new file called&nbsp;<strong><span class=\"has-inline-color has-vivid-red-color\">useForm.js<\/span>.<\/strong>&nbsp;Custom React Hooks use a special naming convention of putting &#8216;use&#8217; <g class=\"gr_ gr_169 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"169\" data-gr-id=\"169\">infront<\/g> of the function name so that React knows that that file is a Hook.<\/p>\n\n\n\n<p>Add the code below inside useForm.js:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">useForm.js<\/div><pre class=\"language-javascript\"><code class=\"language-javascript\"><div><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> useState <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">useForm<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>callback<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">{<\/span>\n\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">[<\/span>values<span class=\"token punctuation\">,<\/span> setValues<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">handleSubmit<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>event<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>event<span class=\"token punctuation\">)<\/span> event<span class=\"token punctuation\">.<\/span><span class=\"token function\">preventDefault<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n      <span class=\"token function\">callback<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\n\n  <span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">handleChange<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span>event<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">{<\/span>\n    event<span class=\"token punctuation\">.<\/span><span class=\"token function\">persist<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n    <span class=\"token function\">setValues<\/span><span class=\"token punctuation\">(<\/span>values <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token operator\">...<\/span>values<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>event<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span> event<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span>value <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\n\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span>\n    handleChange<span class=\"token punctuation\">,<\/span>\n    handleSubmit<span class=\"token punctuation\">,<\/span>\n    values<span class=\"token punctuation\">,<\/span>\n  <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">default<\/span> useForm<span class=\"token punctuation\">;<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>We&#8217;re doing quite a lot above:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>We import the <strong><em>useState<\/em><\/strong> Hook from React to keep track of the form values.<\/li><li>Next we create a new function called <strong><em>useForm<\/em><\/strong>, which takes one parameter, callback. Callback is the function that&#8217;s passed into the custom Hook from the component. It gets called whenever the form submits.<\/li><li>We&#8217;re setting up one state variable and one setter function called values and <strong><em>setValues<\/em><\/strong>.<\/li><li>Then we create a function called <strong><em>handleSubmit<\/em><\/strong> which takes an event. It prevents the default action of that event (refreshing the page after the event has been called). Afterwards, it just calls callback();<\/li><li>We create a function called <strong><em>handleChange<\/em><\/strong> which also takes an event. <\/li><li>Finally, we return <strong><em>handleChange<\/em><\/strong>, <strong>handleSubmit<\/strong> and values from the custom Hook so our component has access to them.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Connecting the Form Component to the Custom useForm Hook.<\/h2>\n\n\n\n<p>For the custom React Hooks forms handler to work, we need to actually import it into the<strong><span class=\"has-inline-color has-vivid-red-color\"> Form.js<\/span><\/strong> file.<\/p>\n\n\n\n<p>Open up <strong><span class=\"has-inline-color has-vivid-red-color\">Form.js<\/span><\/strong> and import the custom hook at the top. Then, initialize it underneath the function declaration:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Form.js<\/div><pre class=\"language-javascript\"><code class=\"language-javascript\"><div><span class=\"token operator\">...<\/span>\n\n<span class=\"token keyword\">import<\/span> useForm <span class=\"token keyword\">from<\/span> <span class=\"token string\">\".\/useForm\"<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">Form<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">{<\/span>\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> values<span class=\"token punctuation\">,<\/span> handleChange<span class=\"token punctuation\">,<\/span> handleSubmit <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useForm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n  \n<span class=\"token operator\">...<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>We&#8217;re destructuring the object that&#8217;s returned from our <strong><em>useForm <\/em><\/strong>custom React Hook so we can use values, <strong><em>handleChange<\/em><\/strong>, and <strong><em>handleSubmit<\/em><\/strong>.<\/p>\n\n\n\n<p>Now,&nbsp; all that&#8217;s left for us to do is use these inside of our form HTML element.<\/p>\n\n\n\n<p>Add an <strong>onSubmit<\/strong> attribute to the form HTML element, and call <strong><em>handleSubmit<\/em><\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Form.js<\/div><pre class=\"language-jsx\"><code class=\"language-jsx\"><div><span class=\"token operator\">...<\/span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>form<\/span> <span class=\"token attr-name\">onSubmit<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleSubmit<span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n\n...<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>Now find the email input and add an onChange and value attribute to it:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Form.js<\/div><pre class=\"language-jsx\"><code class=\"language-jsx\"><div><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>input<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>values<span class=\"token punctuation\">.<\/span>email<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">required<\/span> <span class=\"token punctuation\">\/><\/span><\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>Do the same for the password input element:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Form.js<\/div><pre class=\"language-jsx\"><code class=\"language-jsx\"><div><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>input<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>password<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>password<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>values<span class=\"token punctuation\">.<\/span>password<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">required<\/span> <span class=\"token punctuation\">\/><\/span><\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>We&#8217;re not done yet! <\/p>\n\n\n\n<p>The last thing we need to do is add a <strong><em>login<\/em><\/strong> function to the Form component and pass this into the useForm custom Hook as the callback parameter.<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Form.js<\/div><pre class=\"language-javascript\"><code class=\"language-javascript\"><div><span class=\"token operator\">...<\/span>\n\n<span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> values<span class=\"token punctuation\">,<\/span> handleChange<span class=\"token punctuation\">,<\/span> handleSubmit <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useForm<\/span><span class=\"token punctuation\">(<\/span>login<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">function<\/span> <span class=\"token function\">login<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n  console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span>values<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token operator\">...<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>Your final <strong><span class=\"has-inline-color has-vivid-red-color\">Form.js <\/span><\/strong>component that uses React Hooks for forms event handling should look like this:<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Form.js<\/div><pre class=\"language-jsx\"><code class=\"language-jsx\"><div><span class=\"token keyword\">import<\/span> React <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">import<\/span> useForm <span class=\"token keyword\">from<\/span> <span class=\"token string\">\".\/useForm\"<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">const<\/span> <span class=\"token function-variable function\">Form<\/span> <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=><\/span> <span class=\"token punctuation\">{<\/span>\n  <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> values<span class=\"token punctuation\">,<\/span> handleChange<span class=\"token punctuation\">,<\/span> handleSubmit <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token function\">useForm<\/span><span class=\"token punctuation\">(<\/span>login<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\n  <span class=\"token keyword\">function<\/span> <span class=\"token function\">login<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span>values<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span>\n\n  <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>section is-fullheight<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n      <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>container<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n        <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>column is-4 is-offset-4<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n          <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>box<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n            <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>form<\/span> <span class=\"token attr-name\">onSubmit<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleSubmit<span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>field<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>label<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Email Address<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>control<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>input<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>values<span class=\"token punctuation\">.<\/span>email<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">required<\/span> <span class=\"token punctuation\">\/><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>field<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>label<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Password<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>control<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>input<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>password<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>password<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>values<span class=\"token punctuation\">.<\/span>password<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">required<\/span> <span class=\"token punctuation\">\/><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>submit<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>button is-block is-info is-fullwidth<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Login<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n            <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>form<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n          <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n        <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n      <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n    <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span>\n  <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">default<\/span> Form<span class=\"token punctuation\">;<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>Save everything, open the app running in your browser and give your new form a spin!<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"570\" height=\"327\" src=\"http:\/\/upmostly.com\/wp-content\/uploads\/react-hooks-forms-final.gif\" alt=\"\" class=\"wp-image-755\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Wrapping Up<\/h2>\n\n\n\n<p>Sure, it doesn&#8217;t look like much on the front-end, but when you think about how much code you&#8217;ve saved yourself by using a custom React Hook for your forms management, it&#8217;s staggering!<\/p>\n\n\n\n<p>Here&#8217;s the same Form component written as a class Component instead of a functional stateful component.<\/p>\n\n\n\n<div class=\"wp-block-cgb-block-codeplus\"><div class=\"upmostly-block better-code-block\"><div class=\"dark\"><div class=\"code-editor-header\">Form.js as a Class Component<\/div><pre class=\"language-jsx\"><code class=\"language-jsx\"><div><span class=\"token keyword\">import<\/span> React<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span> Component <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">'react'<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Form<\/span> <span class=\"token keyword\">extends<\/span> <span class=\"token class-name\">Component<\/span> <span class=\"token punctuation\">{<\/span>\n  <span class=\"token function\">constructor<\/span><span class=\"token punctuation\">(<\/span>props<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">super<\/span><span class=\"token punctuation\">(<\/span>props<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n    <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\n      email<span class=\"token punctuation\">:<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\n      password<span class=\"token punctuation\">:<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span>\n\n  <span class=\"token function\">handleChange<\/span><span class=\"token punctuation\">(<\/span>event<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">setState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\n      <span class=\"token punctuation\">[<\/span>event<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span> event<span class=\"token punctuation\">.<\/span>target<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span>\n\n  <span class=\"token function\">login<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> email<span class=\"token punctuation\">,<\/span> password <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>state<span class=\"token punctuation\">;<\/span>\n    console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token string\">`<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>email<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">, <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>password<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span>\n\n  <span class=\"token function\">render<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> email<span class=\"token punctuation\">,<\/span> password <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>state<span class=\"token punctuation\">;<\/span>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>section is-fullheight<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n        <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>container<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n          <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>column is-4 is-offset-4<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n            <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>box<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>form<\/span> <span class=\"token attr-name\">onSubmit<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>login<span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>field<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>label<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Email Address<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>control<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                    <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>input<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>email<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>email <span class=\"token operator\">||<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">required<\/span> <span class=\"token punctuation\">\/><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>field<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>label<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>label<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Password<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>label<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>control<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                    <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>input<\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>input<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>password<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">name<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>password<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">onChange<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>handleChange<span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">value<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span>password <span class=\"token operator\">||<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">}<\/span><\/span> <span class=\"token attr-name\">required<\/span> <span class=\"token punctuation\">\/><\/span><\/span><span class=\"token plain-text\">\n                  <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n                <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button<\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>submit<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">className<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>button is-block is-info is-fullwidth<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">Login<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n              <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>form<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n            <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n          <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n        <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span><span class=\"token plain-text\">\n      <\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">><\/span><\/span>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">export<\/span> <span class=\"token keyword\">default<\/span> Form<span class=\"token punctuation\">;<\/span><\/div><\/code><\/pre><\/div><\/div><\/div>\n\n\n\n<p>Our functional component using React Hooks for our forms is 39 lines of code. The code above is 54. You can <a href=\"http:\/\/upmostly.com\/tutorials\/react-hooks-simple-introduction\" target=\"_blank\" data-type=\"URL\" data-id=\"http:\/\/upmostly.com\/tutorials\/react-hooks-simple-introduction\" rel=\"noreferrer noopener\">learn more about React hooks here<\/a> and the <a href=\"http:\/\/upmostly.com\/tutorials\/react-functional-vs-class-components\" target=\"_blank\" data-type=\"URL\" data-id=\"http:\/\/upmostly.com\/tutorials\/react-functional-vs-class-components\" rel=\"noreferrer noopener\">main differences between React class-based and functional components here<\/a>.<\/p>\n\n\n\n<p>Plus, our custom React Hooks Forms handler is reusable! You can plug that baby into any number of forms!<\/p>\n\n\n\n<p>As always, if you have any issues or questions, I&#8217;d love to hear from you in the comments below.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Use custom React Hooks to build forms that require half the code to write, are reusable, and are much easier to read. Read on to learn more!<\/p>\n","protected":false},"author":8,"featured_media":769,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[34,40,4,36,35],"class_list":["post-721","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-advanced-react-tutorials","tag-popular-tutorials","tag-react","tag-react-forms","tag-react-hooks"],"acf":[],"_links":{"self":[{"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/posts\/721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/comments?post=721"}],"version-history":[{"count":5,"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/posts\/721\/revisions"}],"predecessor-version":[{"id":3820,"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/posts\/721\/revisions\/3820"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/media\/769"}],"wp:attachment":[{"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/media?parent=721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/categories?post=721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/upmostly.com\/wp-json\/wp\/v2\/tags?post=721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}