<?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: Miguel Miranda</title>
    <description>The latest articles on DEV Community by Miguel Miranda (@mirchez).</description>
    <link>https://dev.to/mirchez</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%2F1844289%2Fc3e2d20b-848c-45d3-b184-3dc469a419d4.jpg</url>
      <title>DEV Community: Miguel Miranda</title>
      <link>https://dev.to/mirchez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mirchez"/>
    <language>en</language>
    <item>
      <title>Master React Forms with Controlled and Uncontrolled Components</title>
      <dc:creator>Miguel Miranda</dc:creator>
      <pubDate>Thu, 26 Jun 2025 19:17:52 +0000</pubDate>
      <link>https://dev.to/mirchez/master-react-forms-with-controlled-and-uncontrolled-components-fo1</link>
      <guid>https://dev.to/mirchez/master-react-forms-with-controlled-and-uncontrolled-components-fo1</guid>
      <description>&lt;h2&gt;
  
  
  Why Should You Understand This?
&lt;/h2&gt;

&lt;p&gt;When you start working with forms in React, sooner or later you face this question:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Should I use a controlled or uncontrolled component?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It might seem like a minor technical decision, but understanding this difference impacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How you manage form state&lt;/li&gt;
&lt;li&gt;How easily you can validate user input&lt;/li&gt;
&lt;li&gt;How well your application scales&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's explore why this matters, how each type works, and when to choose one over the other.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem💥
&lt;/h2&gt;

&lt;p&gt;Suppose you're building a contact form. Everything works fine until you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate the input as the user types&lt;/li&gt;
&lt;li&gt;Reset the fields from your code&lt;/li&gt;
&lt;li&gt;Submit the form with complex logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's when the key difference appears:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Do you want React to control the input or not?&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 Controlled Components
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;controlled component&lt;/strong&gt; is one whose value is managed by React's &lt;code&gt;state&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Every time the user types, an &lt;code&gt;onChange&lt;/code&gt; event is triggered, updating the state and causing React to re-render with the new value.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;useState&lt;/span&gt; &lt;span class="p"&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;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FormControlled&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&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;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Name:&lt;/span&gt;&lt;span class="dl"&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="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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Enter your name"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;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;h3&gt;
  
  
  🔑 Key Points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ React always knows what's in the input&lt;/li&gt;
&lt;li&gt;✅ Ideal for real-time validation and complex forms&lt;/li&gt;
&lt;li&gt;❌ More code, potentially slower with heavy inputs (e.g., large &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ⚡ Uncontrolled Components
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;uncontrolled component&lt;/strong&gt; uses a reference (&lt;code&gt;ref&lt;/code&gt;) to access its value. React does not manage the value — the DOM handles it directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Libraries like Stripe Elements, TinyMCE, or even an embedded YouTube video player are not designed for React. They:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Render directly to the DOM (outside React's control)&lt;/li&gt;
&lt;li&gt;Expect the DOM to be ready before they mount&lt;/li&gt;
&lt;li&gt;Use their own internal systems to listen to events and update their content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try to control these kinds of inputs with React’s value and onChange, you may run into conflicts — or it may simply not work at all.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;useRef&lt;/span&gt; &lt;span class="p"&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;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FormUncontrolled&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Name:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nameRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;nameRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Enter your name"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;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;h3&gt;
  
  
  🔑 Key Points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Less code and faster for simple inputs&lt;/li&gt;
&lt;li&gt;✅ Useful for integrating external libraries (e.g., DOM APIs or legacy forms)&lt;/li&gt;
&lt;li&gt;❌ Harder to validate or control in real time&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧪 Real-World Applications
&lt;/h2&gt;

&lt;p&gt;Suppose you're building a &lt;strong&gt;login form&lt;/strong&gt; with real-time validation. Controlled components are perfect here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But if you're integrating something like &lt;strong&gt;Stripe Elements&lt;/strong&gt;, where the input is rendered by their API, you’ll need to use an &lt;strong&gt;uncontrolled&lt;/strong&gt; component with &lt;code&gt;ref&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📸 Visual Illustration
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7ahrbhbgpll21tr3knqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7ahrbhbgpll21tr3knqs.png" alt="Controlled components follow the flow React → state → view, while uncontrolled components go DOM → access via ref" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚔️ Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Controlled&lt;/th&gt;
&lt;th&gt;Uncontrolled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who manages the value?&lt;/td&gt;
&lt;td&gt;React (&lt;code&gt;useState&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;DOM (&lt;code&gt;ref&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time validation&lt;/td&gt;
&lt;td&gt;✅ Easy&lt;/td&gt;
&lt;td&gt;❌ Harder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Library integration&lt;/td&gt;
&lt;td&gt;❌ Sometimes tricky&lt;/td&gt;
&lt;td&gt;✅ More straightforward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;More code required&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;❌ Can be slower&lt;/td&gt;
&lt;td&gt;✅ Faster for simple inputs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ When to Use Each
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Best Option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forms with validation&lt;/td&gt;
&lt;td&gt;Controlled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simple forms or performance concerns&lt;/td&gt;
&lt;td&gt;Uncontrolled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration with external libraries&lt;/td&gt;
&lt;td&gt;Uncontrolled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dynamic form logic or state syncing&lt;/td&gt;
&lt;td&gt;Controlled&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;This isn't just React trivia...&lt;br&gt;
It’s &lt;strong&gt;key to building forms that scale&lt;/strong&gt;, are predictable, and provide a great user experience.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;General Rule:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you need validation, dynamic updates, or syncing with state → &lt;strong&gt;controlled&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
If you need simplicity or work with external tools → &lt;strong&gt;uncontrolled&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;👋 If you found this article interesting or want to get in touch, I’m active on X @mirchezz&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>react</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>React State: How It Powers Dynamic UIs 🚀</title>
      <dc:creator>Miguel Miranda</dc:creator>
      <pubDate>Mon, 09 Jun 2025 00:43:02 +0000</pubDate>
      <link>https://dev.to/mirchez/react-state-how-it-powers-dynamic-uis-2934</link>
      <guid>https://dev.to/mirchez/react-state-how-it-powers-dynamic-uis-2934</guid>
      <description>&lt;h2&gt;
  
  
  1. The Problem: Keeping track of UI changes (analogy)
&lt;/h2&gt;

&lt;p&gt;Imagine you’re managing a restaurant.&lt;br&gt;&lt;br&gt;
You have a whiteboard showing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many free tables are left.&lt;/li&gt;
&lt;li&gt;Which dishes are available.&lt;/li&gt;
&lt;li&gt;The current queue of orders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the staff &lt;strong&gt;forgets to update the board&lt;/strong&gt;, customers will see incorrect information.&lt;/p&gt;

&lt;p&gt;The same happens in a web app: the UI must stay &lt;strong&gt;in sync&lt;/strong&gt; with the underlying data.&lt;/p&gt;




&lt;h3&gt;
  
  
  The problem in React apps
&lt;/h3&gt;

&lt;p&gt;Modern UIs are &lt;strong&gt;event-driven&lt;/strong&gt;: users click, type, submit, navigate.&lt;br&gt;&lt;br&gt;
APIs respond asynchronously.&lt;/p&gt;

&lt;p&gt;Without a &lt;strong&gt;predictable way to manage state&lt;/strong&gt;, your components can become &lt;strong&gt;out of sync&lt;/strong&gt; — showing stale or incorrect data.&lt;/p&gt;

&lt;p&gt;React’s declarative model needs state to drive re-renders correctly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqkx1tnle7is0l64dim5c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqkx1tnle7is0l64dim5c.png" alt="A waiter looking at an outdated whiteboard (representing an out-of-sync UI)" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. A Better Solution: State &amp;amp; &lt;code&gt;useState&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In React, &lt;strong&gt;State&lt;/strong&gt; is the source of truth for a component.&lt;/p&gt;

&lt;p&gt;When state changes → React triggers a &lt;strong&gt;re-render&lt;/strong&gt;, updating the UI to reflect the current state.&lt;/p&gt;




&lt;h3&gt;
  
  
  How &lt;code&gt;useState&lt;/code&gt; works
&lt;/h3&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;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Current&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;Increment&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Think of it as...&lt;/p&gt;

&lt;p&gt;📝 A reactive variable:&lt;br&gt;&lt;br&gt;
When &lt;code&gt;count&lt;/code&gt; changes → React automatically re-renders this component.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key principles
&lt;/h3&gt;

&lt;p&gt;✅ Declare state with &lt;code&gt;useState(initialValue)&lt;/code&gt;&lt;br&gt;&lt;br&gt;
✅ Update state via the setter (&lt;code&gt;setCount&lt;/code&gt;)&lt;br&gt;&lt;br&gt;
✅ State changes trigger &lt;strong&gt;reactive re-renders&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ UI always reflects the current state&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fj5iuij6svuh1acsterr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fj5iuij6svuh1acsterr0.png" alt="A user clicking a button and seeing a number update live on screen (reactive UI)" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Why It Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ensures UI &amp;amp; data stay in sync&lt;/li&gt;
&lt;li&gt;Drives reactive UIs with automatic updates&lt;/li&gt;
&lt;li&gt;Core to React’s model: state → UI&lt;/li&gt;
&lt;li&gt;Enables user interactions: forms, counters, filters, modals, etc.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common pitfalls
&lt;/h2&gt;

&lt;p&gt;❌ Overusing global state when local &lt;code&gt;useState&lt;/code&gt; would suffice&lt;br&gt;&lt;br&gt;
❌ Mutating state directly instead of using the setter&lt;br&gt;&lt;br&gt;
❌ Putting too much state in a parent → unnecessary re-renders of child components&lt;br&gt;&lt;br&gt;
❌ Forgetting that state updates are &lt;strong&gt;async&lt;/strong&gt; (batching)&lt;/p&gt;




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

&lt;p&gt;State is the foundation of React’s reactivity.&lt;br&gt;
It allows your components to respond to user actions and external events seamlessly.&lt;/p&gt;

&lt;p&gt;Mastering state management is key to building robust, scalable and dynamic React applications.&lt;/p&gt;

&lt;p&gt;If your UI needs to change — you’ll be working with state!&lt;/p&gt;




&lt;p&gt;👋 If you found this article interesting or want to get in touch, I’m active on X &lt;a href="https://x.com/mirchezz" rel="noopener noreferrer"&gt;@mirchezz&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Webhooks 101: Let the Server Notify You</title>
      <dc:creator>Miguel Miranda</dc:creator>
      <pubDate>Wed, 28 May 2025 00:02:31 +0000</pubDate>
      <link>https://dev.to/mirchez/webhooks-101-let-the-server-notify-you-5cnb</link>
      <guid>https://dev.to/mirchez/webhooks-101-let-the-server-notify-you-5cnb</guid>
      <description>&lt;h2&gt;
  
  
  1. The Problem: "Are we there yet?" (Polling explained)
&lt;/h2&gt;

&lt;p&gt;Last week, I was implementing authentication in a project and got stuck at a point where I couldn't save a newly logged-in user. So, I tried something that isn't considered a good practice in development: I implemented a polling system that runs every ten seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Polling?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F6tteoyf2o83uxznhm2m0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6tteoyf2o83uxznhm2m0.png" alt="web-polling" width="696" height="771"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Polling is when your app keeps asking an API:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Do you have anything new for me?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problems with this are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unnecessary network traffic.&lt;/li&gt;
&lt;li&gt;Wasted server resources.&lt;/li&gt;
&lt;li&gt;Delays in reacting to actual changes.&lt;/li&gt;
&lt;li&gt;Not great for optimization.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. A Better Alternative: Webhooks (Event-driven communication)
&lt;/h2&gt;

&lt;p&gt;Now imagine instead of asking over and over, the server &lt;em&gt;tells&lt;/em&gt; you the moment something happens.&lt;/p&gt;

&lt;p&gt;That’s exactly what &lt;strong&gt;Webhooks&lt;/strong&gt; do.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Webhooks Work
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Your app &lt;strong&gt;registers a webhook URL&lt;/strong&gt; with the source system.&lt;/li&gt;
&lt;li&gt;When an event occurs (e.g., a payment), the source system sends a &lt;strong&gt;&lt;code&gt;POST&lt;/code&gt; request&lt;/strong&gt; to your webhook endpoint.&lt;/li&gt;
&lt;li&gt;Your system processes the event immediately — no delays, no questions asked.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Think of it like receiving a &lt;strong&gt;push notification&lt;/strong&gt;, instead of constantly refreshing the page.&lt;/p&gt;

&lt;p&gt;🛍️ &lt;strong&gt;Real-world example&lt;/strong&gt; (eCommerce):&lt;/p&gt;

&lt;p&gt;You can use webhooks to get notified when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A customer completes a purchase&lt;/li&gt;
&lt;li&gt;A cart is abandoned&lt;/li&gt;
&lt;li&gt;Inventory is updated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ftf7c33856yssun4bnli4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ftf7c33856yssun4bnli4.png" alt="web-hooks" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Webhook Example in TypeScript (Next.js App Router)
&lt;/h2&gt;

&lt;p&gt;Here's a simple and functional webhook endpoint using &lt;strong&gt;TypeScript&lt;/strong&gt; with &lt;strong&gt;Next.js 13+ (App Router)&lt;/strong&gt;. This code handles incoming events like &lt;code&gt;user.created&lt;/code&gt; and &lt;code&gt;user.deleted&lt;/code&gt; from an external service (like Clerk or Stripe).&lt;/p&gt;

&lt;h3&gt;
  
  
  📁 File: &lt;code&gt;/app/api/webhook/route.ts&lt;/code&gt;
&lt;/h3&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;NextRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// This function handles POST requests coming to /api/webhook&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Parse the incoming JSON payload&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Extract the event type and the actual data&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Log the event for debugging purposes&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Received event: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Handle different event types based on your provider (e.g. Clerk, Stripe)&lt;/span&gt;
    &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user.created&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;// Save the new user to your database or take any other action&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Saving new user:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user.deleted&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;// Remove the user from your database&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Deleting user:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;// Log unhandled events for further inspection&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unhandled event type:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Return a success response&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Webhook received&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Catch any errors that occur during processing&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error handling webhook:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid request&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's pretty easy to implement. This is what happens after the webhook sends information to the registered URL when an event occurs in the external service.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why It Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency&lt;/strong&gt;: No need for repetitive API calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time updates&lt;/strong&gt;: React as soon as something happens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Reduce load and improve performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Webhooks let systems communicate &lt;strong&gt;only when it matters&lt;/strong&gt;, not every few seconds.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;If you're building systems that need to react to changes from external sources, Webhooks are the modern, scalable way to do it.&lt;/p&gt;

&lt;p&gt;They’re simple, fast, and extremely useful in today's event-driven world.&lt;/p&gt;




&lt;p&gt;👋 If you found this article interesting or want to get in touch, I’m active on X &lt;a href="https://x.com/mirchezz" rel="noopener noreferrer"&gt;@mirchezz&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>typescript</category>
      <category>eventdriven</category>
    </item>
    <item>
      <title>HTTP? 🤔 The Web's Unsung Hero Explained</title>
      <dc:creator>Miguel Miranda</dc:creator>
      <pubDate>Sat, 17 May 2025 21:46:22 +0000</pubDate>
      <link>https://dev.to/mirchez/http-the-webs-unsung-hero-explained-2afl</link>
      <guid>https://dev.to/mirchez/http-the-webs-unsung-hero-explained-2afl</guid>
      <description>&lt;h2&gt;
  
  
  🌍 A Bit of History — Where HTTP Came From
&lt;/h2&gt;

&lt;p&gt;Back in 1989, Tim Berners-Lee invented the World Wide Web (WWW). But it wasn’t just websites — it was &lt;strong&gt;a system of protocols&lt;/strong&gt;, and one of them was &lt;strong&gt;HTTP&lt;/strong&gt;: the &lt;strong&gt;HyperText Transfer Protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;HTTP was designed as a simple way to send hypertext (HTML) documents between computers. This allowed the user to experience a more dynamic and interactive way to access information.&lt;/p&gt;

&lt;p&gt;Since then, HTTP has evolved (currently at HTTP/3), but its &lt;strong&gt;core idea hasn’t changed&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.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%2Fcyv732ad5klodb7w3mey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fcyv732ad5klodb7w3mey.png" alt="Image of server and client conecting" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Let the client ask, and let the server answer."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That basic principle powers nearly every web app today. Without HTTP, the internet would not look, feel, or behave as it does.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Request vs response:&lt;/strong&gt;  &lt;/p&gt;
&lt;h2&gt;
  
  
  📡 What Is an HTTP Request and Response?
&lt;/h2&gt;

&lt;p&gt;When your browser opens a website, it sends an &lt;strong&gt;HTTP request&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
The server replies with an &lt;strong&gt;HTTP response&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  🟦 Request Structure
&lt;/h3&gt;

&lt;p&gt;An HTTP request typically includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start line&lt;/strong&gt;: Method (GET, POST, PUT, DELETE), path, protocol version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Headers&lt;/strong&gt;: Info like content type, length, user-agent, tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Body&lt;/strong&gt;: Optional — used in methods like POST or PUT to send information to the server.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🟨 Response Structure
&lt;/h3&gt;

&lt;p&gt;A server sends back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start line&lt;/strong&gt;: Protocol version + status code like so: &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;1xx - Informational&lt;/p&gt;

&lt;p&gt;2xx – Success &lt;/p&gt;

&lt;p&gt;3xx – Redirection&lt;/p&gt;

&lt;p&gt;4xx – Client Error&lt;/p&gt;

&lt;p&gt;5xx – Server Error&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Headers&lt;/strong&gt;: Metadata like content-type, caching rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Body&lt;/strong&gt;: Often contains the HTML or JSON payload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 &lt;strong&gt;Request vs Response diagram:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.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%2F03gj42u7br2x56qoke8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F03gj42u7br2x56qoke8t.png" alt="Request-Response HTTP diagram" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  💻 Example: Making an HTTP Request in TypeScript
&lt;/h2&gt;

&lt;p&gt;Let’s say we want to send a POST request with JSON to an API:&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.example.com/data&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&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="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Miguel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;miguel@example.com&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Request failed with status:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&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="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response data:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&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;As we can see the fetch sent a Post Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ name: "Miguel", email: "miguel@example.com" }),
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This includes, of course the three main parts of a HTTP request.&lt;/p&gt;




&lt;h2&gt;
  
  
  📶 TCP/IP Model (Where’s HTTP?)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fiddvszvqo03iiwwf5fth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fiddvszvqo03iiwwf5fth.png" alt="HTTP in TCP/IP" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HTTP sits at the Application layer of the TCP/IP model:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application&lt;/strong&gt;     ← HTTP lives here 🌐&lt;br&gt;
&lt;strong&gt;Transport&lt;/strong&gt;      ← TCP handles the delivery 📦&lt;br&gt;
&lt;strong&gt;Internet&lt;/strong&gt;       ← IP takes care of addresses 📮&lt;br&gt;
&lt;strong&gt;Link&lt;/strong&gt;            ← Ethernet/WiFi physically connects ⚡&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Things to Keep in Mind:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HTTP is a stateless protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each request is independent. The server doesn’t remember the last thing you asked. &lt;/li&gt;
&lt;li&gt;The connection is not bidirectional meaning the server cannot send request by himself to the client.&lt;/li&gt;
&lt;li&gt;If you want persistent connections, you need tools like WebSockets, which are also another type of protocol we use daily, like in videogames, videocalls or chats.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧠 &lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;br&gt;
HTTP may feel invisible, but it’s everywhere. It silently handles the exchange of information between browser and server.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP" rel="noopener noreferrer"&gt;MDN Web Docs – HTTP Overview&lt;/a&gt; – The most complete and reliable documentation for web protocols.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API" rel="noopener noreferrer"&gt;MDN Web Docs – fetch() API&lt;/a&gt; – Official reference for making HTTP requests in JavaScript and TypeScript.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👋 If you found this article interesting or want to get in touch, I’m active on X &lt;a href="https://x.com/mirchezz" rel="noopener noreferrer"&gt;@mirchezz&lt;/a&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
