<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joris</title>
    <description>The latest articles on DEV Community by Joris (@jorisre).</description>
    <link>https://dev.to/jorisre</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F468555%2Fbba1f98f-7c29-4c2b-b3b4-cc74b11e4410.jpg</url>
      <title>DEV Community: Joris</title>
      <link>https://dev.to/jorisre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jorisre"/>
    <language>en</language>
    <item>
      <title>What's new in React Hook Form's resolvers V2</title>
      <dc:creator>Joris</dc:creator>
      <pubDate>Wed, 03 Mar 2021 10:31:21 +0000</pubDate>
      <link>https://dev.to/jorisre/what-s-new-in-react-hook-form-s-resolvers-v2-2a5o</link>
      <guid>https://dev.to/jorisre/what-s-new-in-react-hook-form-s-resolvers-v2-2a5o</guid>
      <description>&lt;p&gt;Released in the 2020's summer, &lt;a href="https://github.com/react-hook-form/resolvers" rel="noopener noreferrer"&gt;@hookform/resolvers&lt;/a&gt; is an optional module that allows you to validate &lt;a href="https://react-hook-form.com/" rel="noopener noreferrer"&gt;React Hook Form&lt;/a&gt;'s values with your favorite validation library. So far, we support 5 validation libraries: &lt;a href="https://github.com/jquense/yup" rel="noopener noreferrer"&gt;Yup&lt;/a&gt;, &lt;a href="https://github.com/colinhacks/zod" rel="noopener noreferrer"&gt;Zod&lt;/a&gt;, &lt;a href="https://ealush.com/vest/" rel="noopener noreferrer"&gt;Vest&lt;/a&gt;, &lt;a href="https://joi.dev/" rel="noopener noreferrer"&gt;Joi&lt;/a&gt;, and &lt;a href="https://docs.superstructjs.org/" rel="noopener noreferrer"&gt;Superstruct&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  V2 summary
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;📋 React Hook Form V7&lt;/li&gt;
&lt;li&gt;📦  Compliant bundles: CommonJS, ESM &amp;amp; UMD&lt;/li&gt;
&lt;li&gt;✨ Async/sync validation&lt;/li&gt;
&lt;li&gt;🏎 Faster validation: validate only changed fields&lt;/li&gt;
&lt;li&gt;🎛 Manage errored fields&lt;/li&gt;
&lt;li&gt;🏋🏻‍♀️ Reduce package size&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  React Hook Form V7
&lt;/h2&gt;

&lt;p&gt;Recently, we announced the V7 of React Hook Form, if you haven't read it you can have a look here:  &lt;a href="https://dev.to/bluebill1049/what-s-coming-in-react-hook-form-version-7-4bfa"&gt;What's coming in React Hook Form - Version 7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The new resolver API is based on the React Hook Form's V7 architecture. This results in resolver getting power lifted with the new &lt;code&gt;options&lt;/code&gt; param.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- resolver: (values: any, context?: object) =&amp;gt; Promise&amp;lt;ResolverResult&amp;gt; | ResolverResult
&lt;/span&gt;&lt;span class="gi"&gt;+ resolver: (
+   values: any,
+   context: object | undefined,
+   options: {
+     criteriaMode?: 'firstError' | 'all',
+     names?: string[],
+     fields: { [name]: Field } // Support nested fields
+   }
+ ) =&amp;gt; Promise&amp;lt;ResolverResult&amp;gt; | ResolverResult
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;options&lt;/code&gt; argument will enable developers to write better custom logic: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;optimize your schema validation with field-level validation&lt;/li&gt;
&lt;li&gt;have better insight on which field is getting validated&lt;/li&gt;
&lt;li&gt;custom focus management&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compliant bundles: CommonJS, ESM &amp;amp; UMD
&lt;/h2&gt;

&lt;p&gt;This is probably one of the biggest challenges that we have been facing. Our issues board is pretty much occupied with related issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6ijvx4iol0rf64o5l0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6ijvx4iol0rf64o5l0g.png" alt="Bundle's issues"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The issue is related to our module output that cannot satisfy both CommonJs and ESM format. To solve this problem, we had a couple of options on the table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Split into multiple packages&lt;/li&gt;
&lt;li&gt;Convert into a single module&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, all of them do comes with drawbacks, whether in terms of build, developer experience, or simply performance. To solve these issues, I have been heavily inspired by the &lt;a href="https://preactjs.com/" rel="noopener noreferrer"&gt;Preact&lt;/a&gt;'s work on how to ship their packages. We are using the &lt;a href="https://nodejs.org/api/packages.html" rel="noopener noreferrer"&gt;&lt;code&gt;exports&lt;/code&gt; field&lt;/a&gt; which satisfies all bundle formats.&lt;/p&gt;

&lt;p&gt;In the meanwhile, we have been running the &lt;code&gt;beta&lt;/code&gt; for a few months now and it hasn't triggered any issues, which is great news!&lt;/p&gt;

&lt;p&gt;Resolvers imports example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;yupResolver&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hookform/resolvers/yup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;zodResolver&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hookform/resolvers/zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;vestResolver&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hookform/resolvers/vest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;joiResolver&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hookform/resolvers/joi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;superstructResolver&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hookform/resolvers/superstruct&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Async/Sync validation
&lt;/h2&gt;

&lt;p&gt;One of the most asked features is to be able to choose how to validate values: &lt;code&gt;asynchronous&lt;/code&gt; or &lt;code&gt;synchronous&lt;/code&gt; validation. &lt;/p&gt;

&lt;p&gt;We made it possible In the V2, this can be achieved by passing the mode option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;useForm&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;resolver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;zodResolver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;schemaOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sync&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;async&lt;/code&gt; is the default mode. The validation mode depends on the validation’s library used. See the compatibility table below:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Async&lt;/th&gt;
&lt;th&gt;Sync&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yup&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zod&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joi&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vest&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Superstruct&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Faster validation: validate only changed fields
&lt;/h2&gt;

&lt;p&gt;The new resolver will enable you to validate only changed fields. This can be achieved by making a custom resolver and improve validation time in a relatively large form. You can achieve that by using a library like &lt;a href="https://ealush.com/vest/#/./exclusion?id=only-running-specific-tests-including" rel="noopener noreferrer"&gt;Vest&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The new third argument of resolver looks like that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nl"&gt;criteriaMode&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;firstError&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
     &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;Field&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// Support nested fields&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A basic custom resolver example:&lt;br&gt;
&lt;iframe src="https://codesandbox.io/embed/react-hook-form-optimized-custom-resolver-2pyrh"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom focus management
&lt;/h2&gt;

&lt;p&gt;Accessibility is an important aspect of a form validation library, and we are taking focus management as one of the priorities. For example, the user will automatically get focused on an error input during submit. However, there is not much room for users to customize that focus behavior, and here is the change that we made in resolvers to give you control on how and when to focus a particular input. We believe that exposing the &lt;code&gt;ref&lt;/code&gt; to the end-users will give them the freedom on focus management.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/react-hook-form-error-focus-management-example-lpipb"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Reduce package size
&lt;/h2&gt;

&lt;p&gt;We care about performance and package size so much, that every byte counts. The V2 is going to lose some weight! We worked and optimized each resolver to reduce their bundle size. Here is the great result:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Async&lt;/th&gt;
&lt;th&gt;New size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yup resolver&lt;/td&gt;
&lt;td&gt;-23%&lt;/td&gt;
&lt;td&gt;541 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zod resolver&lt;/td&gt;
&lt;td&gt;-28%&lt;/td&gt;
&lt;td&gt;467 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joi resolver&lt;/td&gt;
&lt;td&gt;-25%&lt;/td&gt;
&lt;td&gt;525 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vest resolver&lt;/td&gt;
&lt;td&gt;-46%&lt;/td&gt;
&lt;td&gt;419 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Superstruct resolver&lt;/td&gt;
&lt;td&gt;-75%&lt;/td&gt;
&lt;td&gt;269 B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I hope you all enjoy the change and improvement that we have baked into the new resolvers and looking forward to the future for more improvements over the library.&lt;/p&gt;

&lt;p&gt;Install and try that new version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-hook-form@beta @hookform/resolvers@beta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository url: &lt;a href="https://github.com/react-hook-form/resolvers" rel="noopener noreferrer"&gt;https://github.com/react-hook-form/resolvers&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All the &lt;a href="https://react-hook-form.com/about-us/" rel="noopener noreferrer"&gt;React Hook Form team&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;To &lt;a href="https://twitter.com/bluebill1049" rel="noopener noreferrer"&gt;bluebill1049&lt;/a&gt; for the help to write that blog post&lt;/li&gt;
&lt;li&gt;All the contributors&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;❤️ Thank you for backing and sponsoring the project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zx8172xvy2rmk96dujv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zx8172xvy2rmk96dujv.jpeg" alt="Sponsors"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>form</category>
    </item>
  </channel>
</rss>
