<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged react-hook-form</title>
<link>https://coderlegion.com/tag/react-hook-form</link>
<description>Powered by Question2Answer</description>
<item>
<title>Get Started with React Hook Form</title>
<link>https://coderlegion.com/7429/get-started-with-react-hook-form</link>
<description>&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Hi, guys!&lt;/p&gt;
&lt;p&gt;Recently, I spent some time improving my React skills. And the feeling that I will never know enough never goes away, but that is another talk. Just know it is perfectly normal to feel this way.&lt;/p&gt;
&lt;p&gt;This is how I found out about React Hook Form. Ok, actually, it wasn't first time I heard about it, but now I just decided to learn more about it. So I just read their docs a little bit and decided I will share the knowledge with you. &lt;/p&gt;
&lt;p&gt;I won't dive too deep into the subject. The goal is to get as familiar as possible with this library.&lt;/p&gt;
&lt;p&gt;So let's get started!&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-is-react-hook-form-and-why-should-you-use-it-&quot;&gt;What is React Hook Form and Why Should You Use It?&lt;/h3&gt;
&lt;p&gt;It is a light library that helps you manage forms easily in React.&lt;/p&gt;
&lt;p&gt;What it offers:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Light&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Provides an intuitive experience, with rich features, all of these while staying light and not relying on other dependencies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It reduces the amount of code, it reduces the number of re-renders, due to its use of uncontrolled components by default and offers faster mounting and reduced validation computations. Because the form components don't update the state with every keystroke, the components and its children don't re-render.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;React Hook Form leverages existing HTML markup and makes form validation easy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It provides an &lt;code&gt;errors object&lt;/code&gt; which you can use to retrieve errors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Loading State&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Methods like &lt;code&gt;isSubmitting&lt;/code&gt;, &lt;code&gt;isLoading&lt;/code&gt;, &lt;code&gt;isValidating&lt;/code&gt; makes managing loading state more intuitive.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;installation-and-basic-usage&quot;&gt;Installation and Basic Usage&lt;/h3&gt;
&lt;p&gt;React Hook Form is easy to setup. Start by using the following command in your terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install react-hook-form
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Imagine how you do it normally without React Hook Form:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { useState } from 'react';

const Form = () =&amp;gt; {
  const [ name, setName ] = useState('');

  return (
    &amp;lt;form&amp;gt;
      &amp;lt;input onChange={() =&amp;gt; setName(e.target.value)} value={name} /&amp;gt;
    &amp;lt;/form&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is fine, right? It is a very small form, won't create any problems, hopefully. But what if it scales? What if instead of one input you get 10? Imagine you have to manage that huge form state, together with loading and error handling. And think about performance and the amount of code written. The number of re-renders will be huge, maybe the app will be sluggish. &lt;/p&gt;
&lt;p&gt;And this is how it comes to the rescue. Let's demonstrate some basic usage:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { useForm } from &quot;react-hook-form&quot;;

export default function App() {
  const { register, handleSubmit } = useForm();
  const onSubmit = (data) =&amp;gt; console.log(data);

  return (
    /* &quot;handleSubmit&quot; will validate inputs before invoking &quot;onSubmit&quot; */
    &amp;lt;form onSubmit={handleSubmit(onSubmit)}&amp;gt;
     {/* register your input into the hook by invoking the &quot;register&quot; function */}
     &amp;lt;input {...register(&quot;example&quot;)} /&amp;gt;
     &amp;lt;input type=&quot;submit&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you call &lt;code&gt;useForm()&lt;/code&gt;, the function returns a number of useful functions. We will talk about some of them in the next sections, but two of the most important ones are &lt;code&gt;register&lt;/code&gt; and &lt;code&gt;handleSubmit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;register&lt;/strong&gt; function, as the name implies, will register your input into the hook and will apply validation rules to it. What does it mean? It means you now don't need &lt;code&gt;useState&lt;/code&gt; and &lt;code&gt;onChange&lt;/code&gt; and &lt;code&gt;value&lt;/code&gt; to manage your input state. It is managed by React Hook Form, but leveraging uncontrolled components.&lt;/p&gt;
&lt;p&gt;When you actually use it inside an input, the syntax is this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;input {...register(&quot;name&quot;), validations} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It accepts two parameters. The first one will be a string and it's going to be a name of your choosing. Keep in mind that this is like applying a &lt;code&gt;name attribute&lt;/code&gt; on a HTML tag and you are going to use this name with other useForm() functions as well. The second attribute is an object with validations, which we'll discuss in the next section. So you could have something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { useForm } from &quot;react-hook-form&quot;;

export default function App() {
  const { register, handleSubmit } = useForm();
  const onSubmit = (data) =&amp;gt; console.log(data);

  return (
    &amp;lt;form onSubmit={handleSubmit(onSubmit)}&amp;gt;
     &amp;lt;input {...register(&quot;firstName&quot;, { reguired: true, maxLength: 20 })} /&amp;gt;
     &amp;lt;input type=&quot;submit&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;handleSubmit&lt;/strong&gt; will receive your form data only if input validation ended successfuly. It accepts two callbacks, one for success and one for errors.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { useForm } from &quot;react-hook-form&quot;;

export default function App() {
  const { register, handleSubmit } = useForm();
  const onSubmit = (data) =&amp;gt; console.log(data);
  const onError = (errors) =&amp;gt; console.log(errors);

  return (
    &amp;lt;form onSubmit={handleSubmit(onSubmit, onError)}&amp;gt;
      &amp;lt;input {...register(&quot;firstName&quot;)} /&amp;gt;
      &amp;lt;input {...register(&quot;lastName&quot;)} /&amp;gt;
      &amp;lt;input type=&quot;email&quot; {...register(&quot;email&quot;)} /&amp;gt;
      &amp;lt;input type=&quot;submit&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;validations-error-handling-and-loading&quot;&gt;Validations, Error Handling and Loading&lt;/h3&gt;
&lt;p&gt;React Hook Form aligns with HTML standard for form validations. This means it supports rules like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;required&lt;/li&gt;
&lt;li&gt;min&lt;/li&gt;
&lt;li&gt;max&lt;/li&gt;
&lt;li&gt;minLength&lt;/li&gt;
&lt;li&gt;maxLength&lt;/li&gt;
&lt;li&gt;pattern&lt;/li&gt;
&lt;li&gt;validate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's see how it works:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { useForm } from &quot;react-hook-form&quot;;

export default function App() {
  const { register, handleSubmit } = useForm();
  const onSubmit = (data) =&amp;gt; console.log(data);

  return (
    &amp;lt;form onSubmit={handleSubmit(onSubmit)}&amp;gt;
     &amp;lt;input {...register(&quot;firstName&quot;, { reguired: true, maxLength: 20, minLength: 1 })} /&amp;gt;
     &amp;lt;input type=&quot;number&quot; {...register(&quot;age&quot;, { required: true, min: 18, max: 99 })} /&amp;gt;
     &amp;lt;input type=&quot;number&quot; {...register(&quot;experience&quot;), { pattern: /\d/ }}
     &amp;lt;input type=&quot;number&quot; {...register(&quot;lastName&quot;), {
       validate: { (lastName) =&amp;gt; if (!lastName) =&amp;gt; 'Last name is required' }
     }} 
     &amp;lt;input type=&quot;submit&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While some of them are naturally logical and intuitive, the &lt;code&gt;validate&lt;/code&gt; rule asks for some explanations. It is an object where you can insert as many validation methods (functions) as you need. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;register('fieldName', {
  validate: {
    // 1. First Validation Function
    mustBeAdult: (value) =&amp;gt; value &amp;gt;= 18 || &quot;Must be 18 or older&quot;,
    // 2. Second Validation Function
    isEvenNumber: (value) =&amp;gt; value % 2 === 0 || &quot;Must be an even number&quot;,
    // 3. Third Validation Function
    notZero: (value) =&amp;gt; value !== 0 || &quot;Cannot be zero&quot;,
  },
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;How does error handling work with validate rule? The validation functions run in the order they are defined and if a validation function returns true, validation passes for that rule.&lt;/p&gt;
&lt;p&gt;If a function returns a string like &quot;Must be 18 or older&quot;, that string is treated as the error message, and validation stops for that field immediately and will display the error message from the first function that fails.&lt;/p&gt;
&lt;p&gt;There are other rules for validations inside register function as well. Read more about them &lt;a rel=&quot;nofollow&quot; href=&quot;https://react-hook-form.com/docs/useform/register&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To &lt;strong&gt;handle errors&lt;/strong&gt; in React Hook Form is easy. You first have to destructure the useForm() hook and get the &lt;code&gt;formState&lt;/code&gt;, which you will then destructure to get &lt;code&gt;errors&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { useForm } from 'react-hook-form';

const Form = () =&amp;gt; {
  const { register, handleSubmit, formState: {errors} } = useForm();

 return (
    &amp;lt;form onSubmit={handleSubmit(onSubmit)}&amp;gt;
     &amp;lt;input {...register(&quot;firstName&quot;, { reguired: 'Name required', maxLength: { value: 20, message: 'No more than 20' }} )} /&amp;gt;
     {errors.firstName.message &amp;amp;&amp;amp; &amp;lt;p&amp;gt;{errors}&amp;lt;/p&amp;gt;}
     &amp;lt;input type=&quot;number&quot; {...register(&quot;age&quot;, { required: true, min: { value: 18, message: 'At least 18' }, max: 99 })} /&amp;gt;
     {errors.age.message &amp;amp;&amp;amp; &amp;lt;p&amp;gt;{errors}&amp;lt;/p&amp;gt;}
     &amp;lt;input type=&quot;submit&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The syntax for writing errors is something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;{...register(&quot;age&quot;, { required: true, min: { value: 18, message: 'At least 18' }})}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And instead of &lt;code&gt;required: true&lt;/code&gt;, you can also give this property a string value, which will act as an error message. Now if the field is not filled you will see 'Name required' under it. Notice that when you register your input, the errors object will get a key that will match the name you registered the input with. And that key will be an object which will hold the 'message' property. That is how you can smartly access the errors for every field. No headache required. So in our case:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;  errors.firstName.message
  errors.age.message
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The formState also holds other useful properties. Check them all &lt;a rel=&quot;nofollow&quot; href=&quot;https://react-hook-form.com/docs/useform/formstate&quot;&gt;here&lt;/a&gt;. We'll also discuss here some of them that are related to loading state: &lt;strong&gt;isSubmitting&lt;/strong&gt;, &lt;strong&gt;isLoading&lt;/strong&gt;, &lt;strong&gt;isValidating&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;All of these three are booleans. And you guessed right, isSubmitting is true during the time the form is submitting. You might use it when you want to disable a submit button during form submission. isLoading only works with default async values and it is true when the form is loading these values. Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const { formState: { isLoading, isSubmitting } } = useForm({
  defaultValues: async () =&amp;gt; await fetch('/api');
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We didn't say anything about default values in useForm as props yet. But it is easy to understand. It's like using defaultValue in React. However, as the documentation recommends:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;The defaultValues prop populates the entire form with default values. It supports both synchronous and asynchronous assignment of default values. While you can set an input's default value using defaultValue or defaultChecked (as detailed in the official React documentation), it is recommended to use defaultValues for the entire form.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So you will use isLoading if you have default values that are async, in other words, if those values, that you want as defaults for your inputs, take time until they are loaded into your form.&lt;/p&gt;
&lt;p&gt;The last one, isValidating is going to be true during validation, otherwise false. Example for all:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { useForm } from &quot;react-hook-form&quot;;
import { useState } from 'react';

export default function App() {
  const [ value, setValue ] = useState();
  const { register, handleSubmit, formState: {errors, isSubmitting, isLoading, isValidating},
  } = useForm({
    defaultValues: async () =&amp;gt; await someValue().then((value) =&amp;gt; setValue(value)); 
  });
  const onSubmit = (data) =&amp;gt; console.log(data);

  return (
    &amp;lt;form onSubmit={handleSubmit(onSubmit)}&amp;gt;
       {isValidating? &amp;lt;p&amp;gt;Validating your form...&amp;lt;/p&amp;gt; : &amp;lt;p&amp;gt;Validated successfuly!&amp;lt;/p&amp;gt;}
      {isLoading? &amp;lt;p&amp;gt;The value is loading&amp;lt;/p&amp;gt; : &amp;lt;p&amp;gt;{value}&amp;lt;/p&amp;gt;}
      &amp;lt;input {...register(&quot;test&quot;)} /&amp;gt;
      &amp;lt;button disabled={isSubmitting? true : false}&amp;gt;{isSubmitting? 'Submitting...' : 'Submit'}&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;useform-functions-and-props&quot;&gt;UseForm Functions and Props&lt;/h3&gt;
&lt;p&gt;When you call &lt;strong&gt;useForm()&lt;/strong&gt;, you make available a useful set of properties and methods. Some of them we already discussed, like register, formState, handleSubmit. Some others are &lt;code&gt;unregister&lt;/code&gt;, &lt;code&gt;setErrors&lt;/code&gt;, &lt;code&gt;watch&lt;/code&gt;, &lt;code&gt;setValue&lt;/code&gt;, &lt;code&gt;reset&lt;/code&gt;, &lt;code&gt;setFocus&lt;/code&gt;. And there are other more. &lt;/p&gt;
&lt;p&gt;Note that all these returned functions from useForm have some other options as their second parameters. Chech the &lt;a rel=&quot;nofollow&quot; href=&quot;https://react-hook-form.com/docs/useform&quot;&gt;documentation&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;Now let's say a thing or two about these form above for now, just to get the hang of it.&lt;/p&gt;
&lt;p&gt;You will want to use &lt;strong&gt;unregister&lt;/strong&gt; when you need to programmatically remove a field's data and validation rules from the form state. Imagine you have some fields in your app that are conditionally rendered. Imagine a field that is not rendered if a checkbox is not checked, being conditionally rendered. Without unregistering this field, even if the field is not there visually, it exists as state and validation. When you submit the form, the form is also submitted with data from this field, that you didn't even use. You can expect some problems in your app if you don't unregister.&lt;/p&gt;
&lt;p&gt;You can do this programatically using useEffect. This is a cleanup that will run whenever the component will unmount. So this how you remove the field's state and data.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const { unregister } = useForm();

useEffect(() =&amp;gt; {
  return () =&amp;gt; {
    unregister(&quot;fieldName&quot;);
  };
}, [unregister]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, there is another approach, a more modern one, that implies enabling &lt;strong&gt;automatic unregistration&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Just like using defaultValues prop, this is another prop in useForm that clean up the field state when the component unmounts and makes your code much cleaner. Note that this is false by default.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const methods = useForm({
  // Set this option to true
  shouldUnregister: true, 
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;setErrors&lt;/strong&gt; and &lt;strong&gt;setValue&lt;/strong&gt; are both valuable when you need to programatically set other errors that are maybe not validation related, such as network errors or so and when you want to set a value, when clicking a button, for example. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const { unregister } = useForm();

// pretend it's a network error
if (networkError) {
  setError('name of the field', { type: string, message: 'Network error'});
}

// pretend you clicked a button to change an input value 
if (buttonClicked) {
  setValue('name of the field', value);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;reset&lt;/strong&gt; function allows you to reset the whole form state. It accepts options which allow for partial reset. &lt;em&gt;setFocus&lt;/em&gt; allow to set focus on a field programatically. It accept a string value, which is going to be the name of the field you want to focus on and some options as an object.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;watch&lt;/strong&gt; function lets you subscribe to input changes. Keep in mind that this will activate re-rendering. You can watch a sinlge field, multiple fields of your choice or the entire form.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// single field
const form = watch();

// multiple fields
const names = watch([ 'firstName', 'lastName' ]);

// entire form
const name = watch(&quot;name&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;useForm()&lt;/strong&gt; accepts props. We have already seen some of them earlier, like &lt;strong&gt;defaultValues&lt;/strong&gt;, &lt;strong&gt;shouldUnsubscribe&lt;/strong&gt;. But there are many others: disabled, errors, values. And also there some specific ones that are related to validation libraries, like zod and yup, which are called &lt;strong&gt;resolvers&lt;/strong&gt;. You can read more about them &lt;a rel=&quot;nofollow&quot; href=&quot;https://react-hook-form.com/docs/useform&quot;&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;implementation-with-zod-typescript&quot;&gt;Implementation with Zod + TypeScript&lt;/h3&gt;
&lt;p&gt;We have seen that React Hook Form also accepts validations by default. If you want to go even further, you can make use of Zod and TypeScript. These are modern ways of validating user inputs and make your app more robust.&lt;/p&gt;
&lt;p&gt;You can create a Zod schema and apply it to the hook. This is how:&lt;br&gt;
First you have to install the resolvers.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm i @hookform/resolvers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then you import it, create the schema and use it in the props of &lt;strong&gt;useForm()&lt;/strong&gt; hook;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { zodResolver } from '@hookform/resolvers/zod;

interface schema {
  firstName: string,
  lastName: string
}

const { register, handleSubmit } = useForm&amp;lt;schema&amp;gt;({
  resolver: zodResolver(schema)
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will validate your input against the schema and return with either errors or a valid result.&lt;/p&gt;
&lt;p&gt;React Hook Form doesn't only support Zod. It also supports schema-based form validation with Yup, Superstruct or Joi.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I hope I made React Form Hook at least a bit more easier to start with. Now you've got the basics down... Next step is to go a little deeper according to your needs.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://react-hook-form.com/get-started&quot;&gt;&lt;strong&gt;Check out the official documentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As for more mature developers, what do you think about React Hook Form?&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;connect-with-me&quot;&gt;Connect with me&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;I am open for work, for collaborations, for freelancing or just tech related discussions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So for anything, just let me know, leave me a message and I'll get in touch as soon as possible!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Follow me and see my work on &lt;strong&gt;Github&lt;/strong&gt;: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/alexandru-ene-dev&quot;&gt;alexandru-ene-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Let's be friends on: &lt;strong&gt;LinkedIn&lt;/strong&gt;: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/alexandru-ene-dev&quot;&gt;alexandru-ene-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Let's chat on &lt;strong&gt;Discord&lt;/strong&gt;: alexandru.ene.dev&lt;/li&gt;
&lt;li&gt;Find me also on &lt;strong&gt;Dev.to&lt;/strong&gt;: &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/alexandru-ene-dev&quot;&gt;alexandru-ene-dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please, do tell me if you have any sugestions for new content or how to improve it. Your feedback is important to me!&lt;/p&gt;
&lt;p&gt;Thank you so much for reading and I will see you in the next one soon! Happy coding! :)&lt;/p&gt;
</description>
<category>Java</category>
<guid isPermaLink="true">https://coderlegion.com/7429/get-started-with-react-hook-form</guid>
<pubDate>Mon, 17 Nov 2025 11:22:30 +0000</pubDate>
</item>
</channel>
</rss>