<?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>Forem: Vinitpal Singh Arora</title>
    <description>The latest articles on Forem by Vinitpal Singh Arora (@vinitpal_arora).</description>
    <link>https://forem.com/vinitpal_arora</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%2F234288%2Fa7101211-62be-45e8-b387-497cb2de2348.jpg</url>
      <title>Forem: Vinitpal Singh Arora</title>
      <link>https://forem.com/vinitpal_arora</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vinitpal_arora"/>
    <language>en</language>
    <item>
      <title>Shift from React to Next.js and Remix</title>
      <dc:creator>Vinitpal Singh Arora</dc:creator>
      <pubDate>Wed, 25 Jun 2025 13:36:10 +0000</pubDate>
      <link>https://forem.com/vinitpal_arora/shift-from-react-to-nextjs-and-remix-53g4</link>
      <guid>https://forem.com/vinitpal_arora/shift-from-react-to-nextjs-and-remix-53g4</guid>
      <description>&lt;h2&gt;
  
  
  1️⃣ Introduction: The Evolution of React Apps
&lt;/h2&gt;

&lt;p&gt;Following my previous blog, we saw how React dominated frontend development for years, introducing concepts like Component-based Architecture, Virtual DOM for performance optimization, and a Declarative Programming Model.&lt;/p&gt;

&lt;p&gt;React introduced the era of Single Page Applications (SPAs), bringing both advantages and drawbacks:&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros of React SPAs:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smooth UX:&lt;/strong&gt; Fast, app-like navigation by avoiding full page reloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Development:&lt;/strong&gt; Component-based architecture promotes reusability and maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich Interactivity:&lt;/strong&gt; Client-side rendering enables dynamic, responsive interfaces.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2️⃣ The Pain Points That Led to Next.js &amp;amp; Remix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SEO Challenges:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Client-Side Rendering (CSR): Difficult for search engines to index.&lt;/li&gt;
&lt;li&gt;Meta Tag Management: Complex without tools like React Helmet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance Issues:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Initial Load Time: Large JavaScript bundles delayed rendering.&lt;/li&gt;
&lt;li&gt;Hydration Overhead: Resource-intensive event listener attachment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Routing and Analytics:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic Routing: Confused crawlers and analytics tools.&lt;/li&gt;
&lt;li&gt;URL Management: Required extra setup for crawlable URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Client-side Data Fetching:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Loading States and Waterfall Effect: Sequential data fetching delays rendering.&lt;/li&gt;
&lt;li&gt;Complexity Managing States: Increased code complexity handling various states.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Need for Better DX (Developer Experience):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;File-Based Routing: Manual configurations became unwieldy.&lt;/li&gt;
&lt;li&gt;Server-side Logic: Separate backend setups needed even for small API changes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3️⃣ Enter Next.js: React, but Smarter
&lt;/h2&gt;

&lt;p&gt;Next.js, introduced by Vercel in 2016, enhanced React by addressing limitations in SEO, performance, and developer experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Next.js Innovations:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multiple Rendering Strategies:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-Side Rendering (SSR): React rendered on servers for instant content visibility and better SEO.&lt;/li&gt;
&lt;li&gt;Static Site Generation (SSG): Pre-generating static HTML pages at build time for faster performance.&lt;/li&gt;
&lt;li&gt;Incremental Static Regeneration (ISR): Updates static pages incrementally after deployment, balancing dynamic content with static speed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Full-Stack Capabilities:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in API routes under &lt;code&gt;pages/api/&lt;/code&gt;, removing the need for separate backend setups.&lt;/li&gt;
&lt;li&gt;Edge Functions: Run lightweight serverless functions at global edge locations for faster responses.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;App Router (Next.js 13+):&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports React Server Components, drastically reducing client-side JavaScript.&lt;/li&gt;
&lt;li&gt;Enables HTML streaming and Suspense for quicker load times.&lt;/li&gt;
&lt;li&gt;Server Actions: Simplify form submissions and server-side interactions directly in components.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Next.js became widely adopted by platforms like TikTok and Netflix, especially due to seamless deployment via Vercel.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ Remix: Back to Web Fundamentals
&lt;/h2&gt;

&lt;p&gt;Remix emerged in late 2021, emphasizing traditional web principles alongside React’s UI strengths.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Remix Innovations:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nested Routing:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hierarchical, independent data fetching routes, improving UI updates without full-page reloads.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Web Fundamentals &amp;amp; Progressive Enhancement:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses native browser behaviors (, standard HTTP requests), ensuring functionality even without JavaScript.&lt;/li&gt;
&lt;li&gt;Leveraging native web APIs (Fetch, FormData), reducing the learning curve and improving compatibility.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Loaders and Actions:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loaders: Server-side data fetching, eliminating client-side waterfalls and simplifying state management.&lt;/li&gt;
&lt;li&gt;Actions: Direct server-side handling of form submissions, smoothly blending server and client experiences.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Full-Stack Simplicity:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrated routing, data fetching, mutations, and error handling in one cohesive framework.&lt;/li&gt;
&lt;li&gt;Adaptable across multiple deployment platforms (Node.js, Cloudflare Workers, etc.).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;I liked Remix for creating highly interactive applications prioritizing accessibility and resilience.&lt;/p&gt;




&lt;h2&gt;
  
  
  5️⃣ Is React "Just a Library" Now?
&lt;/h2&gt;

&lt;p&gt;React began as just a UI library. Now, the ecosystem favors frameworks like Next.js and Remix.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React Core Team officially deprecated Create React App (CRA) in 2025.&lt;/li&gt;
&lt;li&gt;Frameworks provide built-in solutions (routing, SEO, server-rendering).&lt;/li&gt;
&lt;li&gt;React continues evolving, powering frameworks with advanced features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learning core React concepts first remains valuable, but frameworks are essential for modern development.&lt;/p&gt;




&lt;h2&gt;
  
  
  6️⃣ When to Choose Next.js vs. Remix
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Next.js if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You need flexible static and dynamic rendering (blogs, marketing sites, e-commerce).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You prioritize extensive community support, integrations, and scalability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your project fits nicely within the Vercel deployment ecosystem.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remix if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Your app requires rich interactivity, frequent user interactions, and real-time experiences (dashboards, social media platforms).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Progressive enhancement, resilience, and native browser standards matter to you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You prefer server-first development and want deployment flexibility (Node.js, edge environments).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both frameworks are capable. Choose based on project priorities.&lt;/p&gt;




&lt;h2&gt;
  
  
  7️⃣ Conclusion:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should developers learn React first, or jump straight into frameworks?
&lt;/h3&gt;

&lt;p&gt;My two cents. Learn core React first. &lt;/p&gt;

&lt;p&gt;The React team deprecated CRA on February 14, 2025, pushing developers toward frameworks. Understanding fundamentals (components, props, hooks) empowers smooth transition to frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  My favorite?
&lt;/h3&gt;

&lt;p&gt;I personally prefer &lt;strong&gt;Remix&lt;/strong&gt; 💖. Its server-first approach, intuitive nested routing, and progressive enhancement elegantly blend modern capabilities with traditional web simplicity. Remix handles both JS-enabled and no-JS scenarios beautifully, with fast loader/action patterns and built-in error handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S. Have you tried Remix? Share your experiences in the comments! 👇&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>nextjs</category>
      <category>remix</category>
    </item>
    <item>
      <title>5 Common React Mistakes</title>
      <dc:creator>Vinitpal Singh Arora</dc:creator>
      <pubDate>Sun, 27 Apr 2025 18:28:43 +0000</pubDate>
      <link>https://forem.com/vinitpal_arora/5-common-react-mistakes-3kca</link>
      <guid>https://forem.com/vinitpal_arora/5-common-react-mistakes-3kca</guid>
      <description>&lt;p&gt;So I had the opportunity to give a talk at &lt;a href="https://www.linkedin.com/posts/vinitpal-singh_devfest2024-techtalks-growthjourney-activity-7279114559259369472-JPaH?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAC0o7pUBK9hF0X1-KVMUs-7JMhcpU6KDxE8" rel="noopener noreferrer"&gt;IIIT Raipur&lt;/a&gt;&lt;br&gt;
There I addressed common mistakes freshers and experienced devs both make in React. &lt;/p&gt;

&lt;p&gt;Since React is most widely used library, these subtle issues can hurt performance, maintainability, or scalability if left unchecked.&lt;/p&gt;

&lt;p&gt;Below are &lt;strong&gt;some code examples&lt;/strong&gt; of common React mistakes and their fixes.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Using Array Index as Key in Lists vs Unique IDs
&lt;/h2&gt;

&lt;p&gt;I know it has been addressed to you many times, but still its the #1 issue I see in any react repo.&lt;/p&gt;

&lt;p&gt;Using the array index as a React list key, this is a lazy shortcut that can break ordering and cause inefficient updates. React’s diff algorithm relies on stable keys; using indexes can &lt;strong&gt;confuse the diff&lt;/strong&gt;, leading to unexpected UI behavior and more re-renders. &lt;/p&gt;

&lt;p&gt;In the example below, moving or removing list items would mess up React’s tracking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 🚫 Before: Index as key (bad practice)&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;BadList&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;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Apple&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="s1"&gt;Banana&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="s1"&gt;Cherry&lt;/span&gt;&lt;span class="dl"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&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;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&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;fruit&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;/li&amp;gt;  {/&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;Index&lt;/span&gt; &lt;span class="nx"&gt;used&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;}
&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;/ul&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;Use a unique identifier for each list item’s key. Here, use an &lt;code&gt;id&lt;/code&gt; property for each fruit. This makes the UI &lt;strong&gt;stable on updates&lt;/strong&gt;, as React can reliably identify items. No more phantom re-renders or out-of-sync list items.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ After: Unique ID as key (good practice)&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GoodList&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;fruits&lt;/span&gt; &lt;span class="o"&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a1&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;Apple&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b2&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;Banana&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c3&lt;/span&gt;&lt;span class="dl"&gt;'&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="s1"&gt;Cherry&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&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;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;fruit&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&amp;gt;  {/&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;Stable&lt;/span&gt; &lt;span class="nx"&gt;unique&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;}
&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;/ul&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;h2&gt;
  
  
  2. Deriving State with &lt;code&gt;useEffect&lt;/code&gt; vs Computing on the Fly
&lt;/h2&gt;

&lt;p&gt;This component filters a list based on a search term and mistakenly uses &lt;code&gt;useEffect&lt;/code&gt; + &lt;code&gt;useState&lt;/code&gt; to store the filtered list. Every time &lt;code&gt;searchTerm&lt;/code&gt; changes, an effect runs to update &lt;code&gt;filteredFruits&lt;/code&gt; state. &lt;/p&gt;

&lt;p&gt;This indirection is overkill, it introduces extra state and complexity, and can even cause timing issues (the UI updates after the effect)​&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 🚫 Before: Unnecessary effect and state for derived data&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FruitList&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;searchTerm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSearchTerm&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;filteredFruits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFilteredFruits&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="nx"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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="c1"&gt;// Filter list whenever searchTerm changes&lt;/span&gt;
    &lt;span class="nf"&gt;setFilteredFruits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchTerm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&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="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;searchTerm&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;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; 
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;searchTerm&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onChange&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setSearchTerm&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="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Search...&lt;/span&gt;&lt;span class="dl"&gt;"&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;ul&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;filteredFruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&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;item&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;/li&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&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;/&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;Instead of this, Calculate the filtered list directly during render, based on the current state. Remove the &lt;code&gt;filteredFruits&lt;/code&gt; state and the effect entirely. Now &lt;code&gt;filteredFruits&lt;/code&gt; is a simple variable recomputed on each render. This is &lt;strong&gt;simpler, immediately up-to-date, and less error-prone&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ After: Derive filtered list directly, no extra state&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FruitList&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;searchTerm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSearchTerm&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;filteredFruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchTerm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&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="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; 
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;searchTerm&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onChange&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setSearchTerm&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="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Search...&lt;/span&gt;&lt;span class="dl"&gt;"&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;ul&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;filteredFruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&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;item&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;/li&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&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;/&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;h2&gt;
  
  
  3. Unmemoized Callback Causing Re-renders vs &lt;code&gt;useCallback&lt;/code&gt; Memoization
&lt;/h2&gt;

&lt;p&gt;In this parent-child setup, the parent passes an inline callback prop to the child. Each time the parent re-renders (e.g. when &lt;code&gt;count&lt;/code&gt; changes), it &lt;strong&gt;creates a new function&lt;/strong&gt; for &lt;code&gt;handleClick&lt;/code&gt;. Even if the child is wrapped in &lt;code&gt;React.memo&lt;/code&gt;, that new function prop forces the child to re-render every time. &lt;/p&gt;

&lt;p&gt;In short, the child can’t take advantage of memoization because the prop reference is unstable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 🚫 Before: New handleClick function on every render&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;onClick&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="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="nx"&gt;onClick&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;Click&lt;/span&gt; &lt;span class="nx"&gt;me&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="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Parent&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="c1"&gt;// This function is re-created on every Parent render:&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&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="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="s1"&gt;Clicked&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="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;Child&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="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&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;Use &lt;code&gt;useCallback&lt;/code&gt; to memoize the handler function. Now &lt;code&gt;handleClick&lt;/code&gt; will stay the &lt;strong&gt;same reference&lt;/strong&gt; between renders (it only re-creates if its dependencies change). With a stable function prop, the memoized child no longer re-renders when the parent’s other state (&lt;code&gt;count&lt;/code&gt;) updates. This &lt;strong&gt;prevents needless child renders&lt;/strong&gt; and improves performance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ After: useCallback to preserve function identity&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;onClick&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="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="nx"&gt;onClick&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;Click&lt;/span&gt; &lt;span class="nx"&gt;me&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="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Parent&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="c1"&gt;// Memoize handleClick so it isn't recreated each render:&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&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;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;Clicked&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="p"&gt;[]);&lt;/span&gt;  &lt;span class="c1"&gt;// no dependencies -&amp;gt; same function every time&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;Child&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="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&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;I know its confusing, To explain this even more:&lt;/p&gt;

&lt;p&gt;In the original, every render made a brand new &lt;code&gt;handleClick&lt;/code&gt; function, so React treated the &lt;code&gt;&amp;lt;Child&amp;gt;&lt;/code&gt;’s prop as changed on each render. The child re-rendered constantly (defeating &lt;code&gt;React.memo&lt;/code&gt; and wasting time)​. &lt;/p&gt;

&lt;p&gt;The updated code wraps &lt;code&gt;handleClick&lt;/code&gt; in &lt;code&gt;useCallback&lt;/code&gt;, which &lt;strong&gt;caches the function&lt;/strong&gt; so that React sees the same function instance on each render. As a result, the child component doesn’t re-render unless it actually needs to.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Monolithic Component vs Modular Component Architecture
&lt;/h2&gt;

&lt;p&gt;This component tries to do &lt;strong&gt;everything at once&lt;/strong&gt;, it fetches user data &lt;em&gt;and&lt;/em&gt; renders the UI. It violates separation of concerns and will become hard to maintain or extend. Before you know it, this file will increase to more than 3000 lines. Completely unmanageable.&lt;/p&gt;

&lt;p&gt;In this &lt;code&gt;UserList&lt;/code&gt; example below, the component both loads data in an effect and renders the list. This tightly coupled approach doesn’t scale; the component is doing multiple jobs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 🚫 Before: Single component doing data-fetching and UI&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserList&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsers&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="nf"&gt;useEffect&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;fetchUsers&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;setUsers&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;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="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;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&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;ul&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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;UserItem&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&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;/ul&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;Always Split the logic into a &lt;strong&gt;container&lt;/strong&gt; component and a &lt;strong&gt;presentational&lt;/strong&gt; component. In the below snippet.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UserListContainer&lt;/code&gt; handles fetching data and state, then renders &lt;code&gt;UserList&lt;/code&gt; (presentational) purely with props. &lt;code&gt;UserList&lt;/code&gt; becomes a simple, stateless UI component. This modular approach is more scalable – each piece has a single responsibility. We avoid deeply nested or bloated components by dividing the work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ After: Separate container (data logic) and presentational (UI) components&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserListContainer&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsers&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="nf"&gt;useEffect&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;fetchUsers&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;setUsers&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;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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserList&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;;  /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;hand&lt;/span&gt; &lt;span class="nx"&gt;off&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;UI&lt;/span&gt; &lt;span class="nx"&gt;component&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;UserList&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;users&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="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;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&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;ul&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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;UserItem&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&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;/ul&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;h2&gt;
  
  
  5. Ignoring Errors in Async Calls vs Proper Error Handling
&lt;/h2&gt;

&lt;p&gt;This React effect fetches data but completely ignores errors. If the network request fails or returns an error status, the code does nothing, no catch, no user feedback.&lt;/p&gt;

&lt;p&gt;The app could silently break or just never show anything, leaving both developers and users in the dark. For example, below we fetch data and set state, but any failure is uncaught (a rejected promise will likely log an error to console, but our UI/state won’t respond):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 🚫 Before: No error handling for fetch&lt;/span&gt;
&lt;span class="nf"&gt;useEffect&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;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setData&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;// .catch(...) is missing – errors are ignored&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;Always handle errors from async calls. Here we wrap the fetch in a try/catch (using async/await for clarity). If an error occurs (network failure or non-OK response), we catch it and update an &lt;code&gt;error&lt;/code&gt; state. In a real app, you’d also set a loading state and probably show a message to the user. The key is that &lt;strong&gt;errors are not swallowed&lt;/strong&gt;, we handle them gracefully:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ After: Handle errors with try/catch and state&lt;/span&gt;
&lt;span class="nf"&gt;useEffect&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="k"&gt;try&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;res&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="s1"&gt;/api/data&lt;/span&gt;&lt;span class="dl"&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;res&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="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Request failed with &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;res&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="s2"&gt;`&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;res&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="nf"&gt;setData&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;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// capture the error in state&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;fetchData&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;The original code naively assumes the fetch will always succeed. In reality, network or server errors happen, and failing to handle them is irresponsible. If the request failed, the before code would just do nothing, the user would see a loading spinner forever or an empty UI, and no error message.&lt;/p&gt;

&lt;p&gt;That's why, we should at least update the UI (for example, stop a spinner and show an error message, or add a contact support button so customer can report to you) instead of hanging. In short, always handle promise rejections or thrown errors from async calls; your users (and your future self) will thank you when things go wrong.&lt;/p&gt;

&lt;p&gt;At the end, I just want to say, none of these mistakes alone will break your app. But together, they &lt;strong&gt;quickly pile up technical debt&lt;/strong&gt;. Fixing these patterns early saves you from future headaches and helps you build a codebase that’s actually worth scaling.&lt;/p&gt;

&lt;p&gt;Thanks a lot for reading this far!&lt;br&gt;&lt;br&gt;
Feel free to connect with me on &lt;a href="https://www.linkedin.com/in/vinitpal-singh/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;. 😄&lt;/p&gt;

&lt;h3&gt;
  
  
  A question for you
&lt;/h3&gt;

&lt;p&gt;Have you seen (or made 👀) any of these mistakes before?&lt;br&gt;
Which one cost you the most pain later?&lt;br&gt;
Share your experiences in the comments below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>History of web dev</title>
      <dc:creator>Vinitpal Singh Arora</dc:creator>
      <pubDate>Fri, 28 Mar 2025 20:11:32 +0000</pubDate>
      <link>https://forem.com/vinitpal_arora/history-of-web-dev-4cc</link>
      <guid>https://forem.com/vinitpal_arora/history-of-web-dev-4cc</guid>
      <description>&lt;p&gt;It's crazy how web development has changed from past 35 years. In every 10yrs, multiple changes happened and many things became obsolete so fast.&lt;/p&gt;

&lt;p&gt;I was having this talk with a friend last week and I thought why not start with this as my first blog post.&lt;/p&gt;

&lt;p&gt;After a reaaally long procrastination. Here is my brief rundown on how web development has changed over the time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Foundation Era (1990 - 1995) Birth of WWW
&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%2F9v3un493pem7onkmc7vj.jpg" 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%2F9v3un493pem7onkmc7vj.jpg" alt="Tim Berners Lee" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Picture this: It’s 1990. Tim Berners-Lee and Robert Cailliau are cooking up something in the CERN labs that would change the world forever. the &lt;strong&gt;World Wide Web&lt;/strong&gt;. &lt;br&gt;
By the end of the year, they had built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first web browser
&lt;/li&gt;
&lt;li&gt;HTML to structure pages
&lt;/li&gt;
&lt;li&gt;HTTP to transfer those pages
&lt;/li&gt;
&lt;li&gt;The first web server, hosted on a NeXT computer with a handwritten label screaming:
👉 &lt;em&gt;"This machine is a server. DO NOT POWER IT DOWN!!"&lt;/em&gt;
&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%2Fdaagdapagojdzvd5qak1.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%2Fdaagdapagojdzvd5qak1.png" alt="Do not power it down" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Developers wrote raw HTML in basic text editors without syntax highlighting or autocompletion. There were only &lt;strong&gt;18 HTML tags&lt;/strong&gt; to play with, and styling? Forget it! CSS wasn’t even a thing yet.&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%2Fghuq0t19w02k2bf7sh0k.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%2Fghuq0t19w02k2bf7sh0k.png" alt="meme 1" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deployment was manual. Developers uploaded files via FTP and prayed they looked okay in the browser. Content, presentation, and logic were all jumbled together, and version control was… making backup copies with dates in the file names. 😅&lt;/p&gt;

&lt;p&gt;But things started looking up in 1994 when &lt;strong&gt;CSS&lt;/strong&gt; was proposed, giving hope for separating content from design. Then, in 1995, Brendan Eich gave us &lt;strong&gt;JavaScript&lt;/strong&gt;, which brought basic interactivity to the web. Game-changer!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fun Fact:  Brendan Eich created JavaScript for Netscape Navigator 2. Initially developed in just &lt;strong&gt;ten days&lt;/strong&gt; and originally called Mocha (later LiveScript, then JavaScript)&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Enhancement Era (1996-2005): Dynamic Content and Design Control
&lt;/h2&gt;

&lt;p&gt;As the web matured into its second half-decade, things got more dynamic and interactive.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSS&lt;/strong&gt; gained traction, allowing developers to move away from ugly table-based layouts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP, ASP, and CGI scripts&lt;/strong&gt; made server-side programming possible, allowing for user authentication, database connections, and dynamic content.
&lt;/li&gt;
&lt;li&gt;But, cross-browser compatibility? A nightmare! Developers had to write different code for Internet Explorer, Netscape, and others, a frustrating time for sure.&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%2F0n52nrb0wbu73u5v8fjd.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%2F0n52nrb0wbu73u5v8fjd.png" alt="meme 2" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework Revolution (2006-2015): JavaScript Ascendance
&lt;/h2&gt;

&lt;p&gt;By the mid-2000s, developers were tired of browser quirks and clunky interfaces. Enter &lt;strong&gt;jQuery&lt;/strong&gt; in 2006, with its motto:&lt;br&gt;&lt;br&gt;
👉 &lt;em&gt;“Write less, do more.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It simplified DOM manipulation and abstracted away browser inconsistencies. Life was good!&lt;/p&gt;

&lt;p&gt;Then after 2008, many big players entered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V8 Engine (2008)&lt;/strong&gt;: Google’s lightning-fast JS engine changed the game, enabling JavaScript to run on servers via Node.js.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AngularJS (2010)&lt;/strong&gt;: Introduced concepts like two-way data binding and dependency injection, making complex front-end apps possible.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React (2013)&lt;/strong&gt;: Facebook’s answer to the chaos, bringing component-based architecture and virtual DOM magic.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vue.js (2014)&lt;/strong&gt;: Struck a balance between simplicity and power, attracting devs who wanted something less complex than Angular or React.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developer tools also leveled up, with Chrome DevTools making it easier to debug JavaScript and analyze performance. Life as a web developer finally felt a bit more manageable!&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%2Fhlefh9y5fpt9geiigfgb.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%2Fhlefh9y5fpt9geiigfgb.png" alt="meme 3" width="748" height="978"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modern Component Era (2016-2025): Specialization and Optimization
&lt;/h2&gt;

&lt;p&gt;From 2016 onward, web development entered a phase where &lt;strong&gt;component-based architectures&lt;/strong&gt; became the undisputed king. This era wasn’t just about building cool UIs. It was about &lt;strong&gt;specialization and optimization&lt;/strong&gt; to tame the growing complexity of modern apps.&lt;/p&gt;

&lt;p&gt;In 2016, &lt;strong&gt;Angular 2&lt;/strong&gt; dropped, and it was a complete rewrite. Angular ditched the old-school AngularJS vibes and fully embraced &lt;strong&gt;TypeScript&lt;/strong&gt; with a more modular, component-driven approach. &lt;/p&gt;

&lt;p&gt;React and Vue didn’t just sit around either. They matured like fine wine, with better tooling, bigger communities, and rock-solid ecosystem support. &lt;strong&gt;React Hooks (2019)&lt;/strong&gt; shook things up by offering a more functional, elegant way to manage state and side effects. It was a game-changer that made class components feel ancient overnight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Svelte (2019)&lt;/strong&gt; threw the virtual DOM out the window and went for a &lt;strong&gt;compile-time approach&lt;/strong&gt; to reactivity. Smaller bundles, faster runtime — it was like the cool kid who didn’t follow the usual rules but still aced the game.&lt;/p&gt;

&lt;p&gt;By 2020, frameworks like &lt;strong&gt;Solid&lt;/strong&gt; and &lt;strong&gt;HTMX&lt;/strong&gt; started exploring fresh approaches to interactivity, pushing the boundaries of what web apps could do. These innovations weren’t just alternatives — they were rewriting the rules of frontend development.&lt;/p&gt;

&lt;p&gt;This era also saw build tools level up. &lt;strong&gt;Webpack&lt;/strong&gt; became the go-to bundler, not just for JavaScript but for CSS, images, and everything in between.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Babel&lt;/strong&gt; made sure devs could write modern JS without worrying about compatibility, seamlessly transpiling ES6+ to older browser-friendly versions.&lt;/p&gt;

&lt;p&gt;But the real MVP was &lt;strong&gt;TypeScript&lt;/strong&gt;. It exploded in popularity, helping devs catch errors early and making large codebases far easier to manage. Static typing became a must-have rather than a nice-to-have.&lt;/p&gt;

&lt;p&gt;Web development didn’t stop at code. It &lt;strong&gt;embraced DevOps&lt;/strong&gt; head-on.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; made it possible to run apps consistently across dev, testing, and production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; handled scaling and managing containerized apps like a boss.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI/CD pipelines&lt;/strong&gt; became the industry norm, automating testing and deployments with tools like &lt;strong&gt;GitHub Actions, GitLab CI, and Jenkins&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This automation meant fewer deployment errors and faster, more reliable releases. Teams could iterate and push updates without sweating about breaking production. &lt;/p&gt;

&lt;p&gt;By the 2020s, &lt;strong&gt;JAMstack (JavaScript, APIs, and Markup)&lt;/strong&gt; and &lt;strong&gt;serverless architectures&lt;/strong&gt; flipped the web development game yet again. JAMstack apps combined the &lt;strong&gt;speed and security of static sites&lt;/strong&gt; with the &lt;strong&gt;power of APIs&lt;/strong&gt; and client-side JavaScript.&lt;/p&gt;

&lt;p&gt;Static site generators like &lt;strong&gt;Next.js, Gatsby, and Nuxt.js&lt;/strong&gt; made it possible to build blazing-fast apps that could still handle dynamic functionality through APIs. The best of both worlds! &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%2F31em6z5k06jkbu9qsif6.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%2F31em6z5k06jkbu9qsif6.png" alt="meme 5" width="800" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Reflections on 35 Years of Web Development
&lt;/h2&gt;

&lt;p&gt;After three and a half decades of web development, we’ve gone from basic HTML pages to mind-blowing interactive web apps that rival native app experiences. But through all the chaos and change, some things never budged:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTML, CSS, and JavaScript&lt;/strong&gt; remain the backbone of the web.
&lt;/li&gt;
&lt;li&gt;Cross-browser issues, performance optimization, and security challenges? Still here, but with fancier tools to manage them.
&lt;/li&gt;
&lt;li&gt;The developer experience went from editing plain text files to using integrated environments packed with real-time feedback, automated testing, and powerful debugging tools.&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%2Fwxsmivv1zul2zehzk2id.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%2Fwxsmivv1zul2zehzk2id.png" alt="meme 4" width="800" height="997"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The biggest transformation?&lt;br&gt;&lt;br&gt;
We’ve moved from &lt;strong&gt;document-centric&lt;/strong&gt; websites that just displayed information to &lt;strong&gt;application-centric&lt;/strong&gt; web apps that deliver rich, interactive experiences.&lt;br&gt;&lt;br&gt;
Modern web apps don’t just show data, they &lt;em&gt;think&lt;/em&gt;, &lt;em&gt;react&lt;/em&gt;, and adapt to users like never before.&lt;/p&gt;

&lt;p&gt;As we look back, one thing is clear: &lt;strong&gt;web development is a never-ending cycle of innovation&lt;/strong&gt;. The principles of &lt;strong&gt;progressive enhancement, separation of concerns, and component-based architectures&lt;/strong&gt; have stood the test of time.&lt;/p&gt;

&lt;p&gt;So much has happened so quickly that I’m sure I’ve missed a lot of details.&lt;/p&gt;

&lt;p&gt;And I can’t help but wonder, the devs who actually &lt;strong&gt;lived through&lt;/strong&gt; those drastic changes must have a completely different perspective. So, if you were part of that wild ride, &lt;strong&gt;what was your favorite part?&lt;/strong&gt; Drop your thoughts below! 😃👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
