<?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: Duffman</title>
    <description>The latest articles on DEV Community by Duffman (@duffmancc).</description>
    <link>https://dev.to/duffmancc</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%2F854942%2F6f4ec066-1221-46b2-9e2d-9b42e8bfae5b.jpeg</url>
      <title>DEV Community: Duffman</title>
      <link>https://dev.to/duffmancc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/duffmancc"/>
    <language>en</language>
    <item>
      <title>Composition vs Compound Components in React</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Tue, 14 Apr 2026 08:58:38 +0000</pubDate>
      <link>https://dev.to/duffmancc/composition-vs-compound-components-in-react-2ffp</link>
      <guid>https://dev.to/duffmancc/composition-vs-compound-components-in-react-2ffp</guid>
      <description>&lt;p&gt;In React, reusable UI usually follows two patterns: &lt;strong&gt;composition components&lt;/strong&gt; and &lt;strong&gt;compound components&lt;/strong&gt;. They are closely related, but they differ mainly in how state is handled and how the API is exposed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composition Components (no Context)
&lt;/h2&gt;

&lt;p&gt;This is the most straightforward approach. You build UI by combining components and passing data through props.&lt;/p&gt;

&lt;p&gt;Everything is explicit: each component receives what it needs directly from its parent.&lt;/p&gt;

&lt;p&gt;This makes the system very flexible and easy to reuse, since every part is independent. You can take a subcomponent and use it anywhere without constraints.&lt;/p&gt;

&lt;p&gt;The downside is that as the UI grows, you often end up with prop drilling and a lot of wiring code. Sharing behavior between related parts also becomes harder because there is no shared state mechanism.&lt;/p&gt;

&lt;p&gt;In short: simple, explicit, and flexible, but can become verbose in complex UIs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Airbnb&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;./Airbnb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Card&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ImageWrapper&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Heart&lt;/span&gt; &lt;span class="na"&gt;like&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isFavorite&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onClick&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="o"&gt;=&amp;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;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Recomendation&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ImageWrapper&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Content&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Title&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Valoration&lt;/span&gt; &lt;span class="na"&gt;average&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;average&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;reviews&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reviews&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Title&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Description&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Price&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;nights&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nights&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Cancelation&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Content&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Card&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;👉 Try it in practice: &lt;a href="https://www.reactchallenges.com/challenges/airbnb-card-composition-component" rel="noopener noreferrer"&gt;Composition Components Challenge&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Compound Components (with Context)
&lt;/h2&gt;

&lt;p&gt;This pattern introduces shared state using React Context. Instead of passing props through every level, a parent component provides state and child components consume it directly.&lt;/p&gt;

&lt;p&gt;This creates a tighter relationship between components. From the outside, the API becomes very clean because users don’t need to manage all the props manually.&lt;/p&gt;

&lt;p&gt;It works especially well for structured UI systems where components are meant to work together (like cards, modals, tabs, etc.).&lt;/p&gt;

&lt;p&gt;The trade-off is that the relationship becomes implicit. Subcomponents depend on a parent provider and are not really meant to be used in isolation. Debugging can also be slightly less obvious because the data flow is hidden inside Context.&lt;/p&gt;

&lt;p&gt;In short: more structured, cleaner API, but less flexible and more coupled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Airbnb&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;./Airbnb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Card&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ImageWrapper&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Image&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Heart&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Recomendation&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ImageWrapper&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Content&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Title&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Valoration&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Title&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Description&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Price&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Cancelation&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Content&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Card&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;👉 Try it in practice: &lt;a href="https://www.reactchallenges.com/challenges/airbnb-card-compound-component-context" rel="noopener noreferrer"&gt;Compound Components Challenge&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Export styles
&lt;/h2&gt;

&lt;p&gt;There are two common ways to expose these components.&lt;/p&gt;

&lt;p&gt;Named exports give maximum flexibility and are easy to tree-shake, but they don’t communicate relationships between components very well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&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;Card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ImageWrapper&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Image&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;./Airbnb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Card&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&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="nc"&gt;ImageWrapper&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="nc"&gt;Image&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="nc"&gt;ImageWrapper&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="nc"&gt;Card&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;Namespaced exports group everything under a single object, which makes the structure much clearer and is often preferred for compound components or design systems. The trade-off is slightly more verbosity and sometimes less optimal tree-shaking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Airbnb&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;./Airbnb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Card&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;el&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ImageWrapper&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Image&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ImageWrapper&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="nc"&gt;Airbnb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When to use each
&lt;/h2&gt;

&lt;p&gt;Use composition when components are independent and you want full flexibility with explicit data flow.&lt;/p&gt;

&lt;p&gt;Use compound components when the UI pieces are strongly related, share state, and benefit from a controlled and clean API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Composition is about &lt;strong&gt;flexibility and explicitness&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Compound components are about &lt;strong&gt;structure and shared state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Both are just different ways of organizing the same idea: composition in React.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>🚀 𝗡𝗲𝘄 𝗖𝗵𝗮𝗹𝗹𝗲𝗻𝗴𝗲 𝗼𝗻 𝗥𝗲𝗮𝗰𝘁 𝗖𝗵𝗮𝗹𝗹𝗲𝗻𝗴𝗲𝘀: 𝗔𝗶𝗿𝗯𝗻𝗯 𝗖𝗮𝗿𝗱 𝘄𝗶𝘁𝗵 𝗖𝗼𝗺𝗽𝗼𝘂𝗻𝗱 𝗖𝗼𝗺𝗽𝗼𝗻𝗲𝗻𝘁𝘀 + 𝗖𝗼𝗻𝘁𝗲𝘅𝘁</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Mon, 13 Apr 2026 08:44:26 +0000</pubDate>
      <link>https://dev.to/duffmancc/--5bdk</link>
      <guid>https://dev.to/duffmancc/--5bdk</guid>
      <description>&lt;p&gt;A new intermediate challenge is now live focused on one of the most powerful &lt;strong&gt;React patterns&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🧩 𝗖𝗼𝗺𝗽𝗼𝘂𝗻𝗱 𝗖𝗼𝗺𝗽𝗼𝗻𝗲𝗻𝘁𝘀&lt;br&gt;
🌐 𝗥𝗲𝗮𝗰𝘁 𝗖𝗼𝗻𝘁𝗲𝘅𝘁&lt;br&gt;
♻️ 𝗥𝗲𝘂𝘀𝗮𝗯𝗹𝗲 𝗖𝗼𝗺𝗽𝗼𝗻𝗲𝗻𝘁 𝗔𝗿𝗰𝗵𝗶𝘁𝗲𝗰𝘁𝘂𝗿𝗲&lt;/p&gt;

&lt;p&gt;In this challenge, you'll build a fully functional Airbnb-style card component using the Compound Components pattern powered by &lt;strong&gt;Context&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal is to create a flexible API where subcomponents share state implicitly through a provider — just like production-grade UI libraries.&lt;/p&gt;

&lt;p&gt;This challenge will help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand how compound components scale&lt;/li&gt;
&lt;li&gt;Use Context to avoid prop drilling&lt;/li&gt;
&lt;li&gt;Design clean and extensible component APIs&lt;/li&gt;
&lt;li&gt;Think in terms of composition over configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect if you're moving beyond basic components and want to write more maintainable, real-world React code.&lt;/p&gt;

&lt;p&gt;Try it here 👇&lt;br&gt;
&lt;a href="https://www.reactchallenges.com/challenges/airbnb-card-compound-component-context" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/airbnb-card-compound-component-context&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;𝗙𝗲𝗲𝗱𝗯𝗮𝗰𝗸 𝗶𝘀 𝗮𝗹𝘄𝗮𝘆𝘀 𝘄𝗲𝗹𝗰𝗼𝗺𝗲.&lt;/p&gt;

&lt;p&gt;💬 What advanced React patterns would you like to practice next?&lt;/p&gt;

&lt;p&gt;💾 Save this for your React learning path&lt;br&gt;
♻ Repost to help other developers&lt;br&gt;
👥 Share with your frontend team&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>🚀 New React Challenge: Play Soroban</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Fri, 20 Mar 2026 11:21:02 +0000</pubDate>
      <link>https://dev.to/duffmancc/new-react-challenge-play-soroban-3bk9</link>
      <guid>https://dev.to/duffmancc/new-react-challenge-play-soroban-3bk9</guid>
      <description>&lt;p&gt;Test your React skills with this &lt;strong&gt;interactive Soroban-style game&lt;/strong&gt;!&lt;br&gt;&lt;br&gt;
A sequence of numbers appears on the screen, and after it ends, you need to verify the calculated sum.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Try This Challenge?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🧠 Practice &lt;strong&gt;state management&lt;/strong&gt; and &lt;strong&gt;React hooks&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;⏱️ Handle &lt;strong&gt;timed interactions&lt;/strong&gt; and &lt;strong&gt;dynamic rendering&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;🎯 Improve problem-solving in &lt;strong&gt;fun, bite-sized challenges&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Here
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://www.reactchallenges.com/challenges/play-soroban" rel="noopener noreferrer"&gt;Play Soroban Challenge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Your feedback is always welcome!&lt;br&gt;&lt;br&gt;
💬 Comment which &lt;strong&gt;React challenge&lt;/strong&gt; you’d like to see next.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>Level Up Your React Knowledge with Quizzes 🧩</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Mon, 09 Mar 2026 15:37:03 +0000</pubDate>
      <link>https://dev.to/duffmancc/level-up-your-react-knowledge-with-quizzes-258</link>
      <guid>https://dev.to/duffmancc/level-up-your-react-knowledge-with-quizzes-258</guid>
      <description>&lt;p&gt;A new feature has been added to &lt;strong&gt;&lt;a href="https://www.reactchallenges.com" rel="noopener noreferrer"&gt;ReactChallenges.com&lt;/a&gt;&lt;/strong&gt;: interactive quizzes designed to help developers test and reinforce their React knowledge.&lt;/p&gt;

&lt;p&gt;They are especially useful for developers preparing for &lt;strong&gt;React interviews&lt;/strong&gt; or anyone who wants to quickly validate their understanding of key concepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quiz Topics
&lt;/h2&gt;

&lt;p&gt;The quizzes are currently organized into three main sections:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Core Concepts
&lt;/h3&gt;

&lt;p&gt;Fundamental React topics such as component structure, JSX, state and props, event handling, forms, lists, and common design patterns used to structure React applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  🪝 Hooks &amp;amp; Side Effects
&lt;/h3&gt;

&lt;p&gt;Concepts related to React hooks and managing side effects, including state management with hooks, refs, context, reducers, and best practices for writing reusable custom hooks.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Rendering &amp;amp; Performance
&lt;/h3&gt;

&lt;p&gt;Advanced topics focused on how React renders and updates the UI, including rendering behavior, reconciliation, hydration, concurrency features, Suspense, and performance optimization techniques.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why quizzes?
&lt;/h2&gt;

&lt;p&gt;Reading documentation is useful, but &lt;strong&gt;actively testing knowledge&lt;/strong&gt; helps reinforce concepts much faster.&lt;/p&gt;

&lt;p&gt;These quizzes aim to simulate the types of questions commonly encountered in &lt;strong&gt;technical interviews and real-world scenarios&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try them here
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://www.reactchallenges.com/quizzes" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/quizzes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 New FREE React Challenge: New way of data fetching</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Mon, 09 Feb 2026 12:14:14 +0000</pubDate>
      <link>https://dev.to/duffmancc/new-free-react-challenge-new-way-of-data-fetching-4g55</link>
      <guid>https://dev.to/duffmancc/new-free-react-challenge-new-way-of-data-fetching-4g55</guid>
      <description>&lt;p&gt;Our latest &lt;strong&gt;React Challenge&lt;/strong&gt; is live, and it’s all about taking your data fetching skills to the next level!  &lt;/p&gt;

&lt;p&gt;In this challenge, you'll &lt;strong&gt;replace the traditional &lt;code&gt;useState&lt;/code&gt;/&lt;code&gt;useEffect&lt;/code&gt; flow&lt;/strong&gt; with the &lt;strong&gt;new Suspense-driven &lt;code&gt;use()&lt;/code&gt; approach&lt;/strong&gt;—all while keeping the same UI behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Overview
&lt;/h2&gt;

&lt;p&gt;Build a simple React page that fetches &lt;strong&gt;Rick and Morty characters&lt;/strong&gt; using &lt;code&gt;use()&lt;/code&gt;. The goal is to make your data flow more &lt;strong&gt;declarative&lt;/strong&gt;, cleaner, and easier to maintain.  &lt;/p&gt;

&lt;p&gt;You’ll keep the &lt;strong&gt;same skeleton loading UI&lt;/strong&gt; and character cards, but under the hood, your components will &lt;strong&gt;suspend until the data is ready&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fetch the character list from &lt;code&gt;https://rickandmortyapi.com/api/character/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;React Suspense&lt;/strong&gt; with &lt;code&gt;use()&lt;/code&gt; to read a &lt;strong&gt;stable promise&lt;/strong&gt; (no &lt;code&gt;useEffect&lt;/code&gt; + &lt;code&gt;useState&lt;/code&gt; fetching).&lt;/li&gt;
&lt;li&gt;Display the provided &lt;strong&gt;skeleton UI&lt;/strong&gt; while data is pending.&lt;/li&gt;
&lt;li&gt;Render &lt;strong&gt;character cards&lt;/strong&gt; after the data resolves.&lt;/li&gt;
&lt;li&gt;Maintain the &lt;strong&gt;existing layout and styling&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create the fetch promise &lt;strong&gt;outside the component&lt;/strong&gt; so it remains stable across renders.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;CharactersSkeleton&lt;/code&gt; as the &lt;strong&gt;Suspense fallback&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Simulated latency is optional—you can remove it or adjust its duration without affecting the tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important:&lt;/strong&gt; Tests will fail if you use &lt;code&gt;useEffect&lt;/code&gt;; the focus is on &lt;code&gt;use()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Tests
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Renders the app title
&lt;/li&gt;
&lt;li&gt;Shows skeleton while loading
&lt;/li&gt;
&lt;li&gt;Renders characters after loading
&lt;/li&gt;
&lt;li&gt;Uses React &lt;code&gt;use()&lt;/code&gt; instead of &lt;code&gt;useEffect&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;This challenge is perfect for developers who want to &lt;strong&gt;modernize their React data fetching&lt;/strong&gt; and get hands-on experience with &lt;strong&gt;suspense-first rendering&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reactchallenges.com/challenges/new-way-data-fetching" rel="noopener noreferrer"&gt;🔥 Start the Challenge Now&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>🚀 Reflex Click Game: a tiny React challenge to practice timers and state</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Mon, 02 Feb 2026 16:27:10 +0000</pubDate>
      <link>https://dev.to/duffmancc/reflex-click-game-a-tiny-react-challenge-to-practice-timers-and-state-1lcg</link>
      <guid>https://dev.to/duffmancc/reflex-click-game-a-tiny-react-challenge-to-practice-timers-and-state-1lcg</guid>
      <description>&lt;p&gt;If you want a quick React challenge that hits the essentials—state, effects, timers, and UI feedback—this one is for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a reflex click game where:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A circle switches between red and green at random intervals&lt;/li&gt;
&lt;li&gt;Clicking green increases the score&lt;/li&gt;
&lt;li&gt;Clicking red ends the game&lt;/li&gt;
&lt;li&gt;A timer counts down to 0&lt;/li&gt;
&lt;li&gt;You win by reaching the target score before time runs out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this is a great mini‑project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real practice with useEffect and cleanup&lt;/li&gt;
&lt;li&gt;Timer logic + random intervals&lt;/li&gt;
&lt;li&gt;Conditional rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key skills you’ll use&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React state management&lt;/li&gt;
&lt;li&gt;Effect cleanup and timing&lt;/li&gt;
&lt;li&gt;Controlled UI updates&lt;/li&gt;
&lt;li&gt;Basic game logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Ready to play (and build)?&lt;br&gt;
&lt;a href="https://www.reactchallenges.com/challenges/reflex-click-game" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/reflex-click-game&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>🚀 New React Challenge: Tetris II</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Mon, 19 Jan 2026 12:10:28 +0000</pubDate>
      <link>https://dev.to/duffmancc/new-react-challenge-tetris-ii-1aab</link>
      <guid>https://dev.to/duffmancc/new-react-challenge-tetris-ii-1aab</guid>
      <description>&lt;p&gt;This is the second part of the Tetris challenge series. In this version, the user interface, game loop, and React components are already implemented for you. &lt;/p&gt;

&lt;p&gt;Your goal is to focus purely on the game logic by completing the utility functions in &lt;code&gt;utils.ts&lt;/code&gt;. You will implement piece generation, movement, collision detection, and row clearing to make the game functional.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/tetris-ii" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/tetris-ii&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>🚀 New React Challenge: Tetris</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Thu, 08 Jan 2026 22:37:29 +0000</pubDate>
      <link>https://dev.to/duffmancc/new-react-challenge-tetris-25ee</link>
      <guid>https://dev.to/duffmancc/new-react-challenge-tetris-25ee</guid>
      <description>&lt;p&gt;I’ve just published a new challenge on reactchallenges.com, and this time it’s a classic: &lt;strong&gt;Tetris&lt;/strong&gt; 🧩&lt;/p&gt;

&lt;p&gt;This challenge focuses on real-world React problems like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Game loops and timing&lt;/li&gt;
&lt;li&gt;State management&lt;/li&gt;
&lt;li&gt;Collision detection&lt;/li&gt;
&lt;li&gt;Performance considerations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s also worth mentioning that this is the kind of challenge that has appeared in technical interviews at well-known companies, and it’s generally considered a difficult one — not because of obscure tricks, but because it requires solid fundamentals, clean architecture, and careful thinking.&lt;/p&gt;

&lt;p&gt;Perfect if you want to test yourself against a truly non-trivial React problem.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/tetris" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/tetris&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>New Free React Challenge: Countdown ⏱️</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Mon, 22 Dec 2025 17:59:09 +0000</pubDate>
      <link>https://dev.to/duffmancc/new-free-react-challenge-countdown-1b67</link>
      <guid>https://dev.to/duffmancc/new-free-react-challenge-countdown-1b67</guid>
      <description>&lt;p&gt;Build a real countdown timer using useState and useEffect, and deal with state, side effects, and precise time updates.&lt;/p&gt;

&lt;p&gt;Designed for beginners, but with the kind of edge cases you actually find in production.&lt;/p&gt;

&lt;p&gt;30 minutes. No tutorials. Just React.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/countdown" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/countdown&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>🚀 New React Challenge: Build a Timed Quiz</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Fri, 19 Dec 2025 13:11:42 +0000</pubDate>
      <link>https://dev.to/duffmancc/new-react-challenge-build-a-timed-quiz-16ca</link>
      <guid>https://dev.to/duffmancc/new-react-challenge-build-a-timed-quiz-16ca</guid>
      <description>&lt;p&gt;Test your &lt;strong&gt;React skills&lt;/strong&gt; by creating a quiz with randomized questions, a global timer, and step-based navigation using the provided components (&lt;code&gt;Question&lt;/code&gt;, &lt;code&gt;Timer&lt;/code&gt;, &lt;code&gt;QuizHeader&lt;/code&gt;, &lt;code&gt;Intro&lt;/code&gt;, &lt;code&gt;Result&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;💡 Simulates real test conditions: time limits, step progression, and precise scoring. Once done, create more questions to keep practicing!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reactchallenges.com/challenges/react-quiz" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/react-quiz&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>🚀 New React Challenge: Digital Segment Clock</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Wed, 10 Dec 2025 12:49:39 +0000</pubDate>
      <link>https://dev.to/duffmancc/new-react-challenge-digital-segment-clock-2dg0</link>
      <guid>https://dev.to/duffmancc/new-react-challenge-digital-segment-clock-2dg0</guid>
      <description>&lt;p&gt;Level up your React skills with our latest beginner-friendly challenge! Build a real-time digital clock using seven-segment-style digits.&lt;/p&gt;

&lt;p&gt;No subscription required, &lt;strong&gt;completely free!&lt;/strong&gt; ✅&lt;/p&gt;

&lt;p&gt;Great for practicing state, effects, intervals, and Date object in React.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/digital-segment-clock" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/digital-segment-clock&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>🎮 7 React Game Challenges You Should Try This Month</title>
      <dc:creator>Duffman</dc:creator>
      <pubDate>Tue, 09 Dec 2025 09:15:24 +0000</pubDate>
      <link>https://dev.to/duffmancc/7-react-game-challenges-you-should-try-this-month-3f86</link>
      <guid>https://dev.to/duffmancc/7-react-game-challenges-you-should-try-this-month-3f86</guid>
      <description>&lt;p&gt;Want to level up your React skills while having fun? These 7 game challenges will put your hooks, state logic, and advanced patterns to the test in small but tricky projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣ Memory Card Game
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/memory-card-game" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/memory-card-game&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;📌 Level: Intermediate | ⏱ 60 min&lt;/strong&gt;&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%2Frkm03p1bzhtgyun5lfd3.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%2Frkm03p1bzhtgyun5lfd3.png" alt="Memory Card Game preview" width="800" height="921"&gt;&lt;/a&gt;&lt;br&gt;
Create a memory card game where cards are hidden, can be flipped, and you must find matches. Track user clicks and improve your state management skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  2️⃣ Minesweeper
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/minesweeper" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/minesweeper&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;📌 Level: Advanced | ⏱ 90 min&lt;/strong&gt;&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%2Fjlrmpjkyi0aplef6jekr.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%2Fjlrmpjkyi0aplef6jekr.png" alt="Minesweeper preview" width="800" height="722"&gt;&lt;/a&gt;&lt;br&gt;
Implement the classic Minesweeper in React. Use hooks to manage the board, mines, and click counters, practicing complex logic and hook reuse.&lt;/p&gt;

&lt;h2&gt;
  
  
  3️⃣ Wordle
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/wordle" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/wordle&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;📌 Level: Advanced | ⏱ 90 min&lt;/strong&gt;&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%2F9zwcqmxnacf0b9xweru5.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%2F9zwcqmxnacf0b9xweru5.png" alt="Wordle preview" width="800" height="1101"&gt;&lt;/a&gt;&lt;br&gt;
Recreate Wordle: guess the 5-letter word and color the tiles based on correctness. Great for practicing array handling and React effects.&lt;/p&gt;

&lt;h2&gt;
  
  
  4️⃣ Tic Tac Toe
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/tic-tac-toe" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/tic-tac-toe&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;📌 Level: Intermediate | ⏱ 60 min&lt;/strong&gt;&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%2F38m0cv5i90urbmksk2mv.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%2F38m0cv5i90urbmksk2mv.png" alt="Tic Tac Toe preview" width="800" height="678"&gt;&lt;/a&gt;&lt;br&gt;
The classic three-in-a-row game. Perfect for reviewing simple state and conditional rendering in React.&lt;/p&gt;

&lt;h2&gt;
  
  
  5️⃣ Connect Four
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/connect-four" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/connect-four&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;📌 Level: Advanced | ⏱ 60 min&lt;/strong&gt;&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%2Fyx7e614x4iqmg9xrpb5z.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%2Fyx7e614x4iqmg9xrpb5z.png" alt="Connect Four preview" width="800" height="882"&gt;&lt;/a&gt;&lt;br&gt;
Build a Connect Four game where players take turns dropping discs into a 6x7 grid. Excellent for practicing board logic and turn-based interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  6️⃣ Simon Says
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/simon-says" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/simon-says&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;📌 Level: Advanced | ⏱ 90 min&lt;/strong&gt;&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%2Ftgsl47mivfghrqv2gg0a.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%2Ftgsl47mivfghrqv2gg0a.png" alt="Simon Says preview" width="800" height="801"&gt;&lt;/a&gt;&lt;br&gt;
Create a Simon Says game in React. Users replicate color sequences that increase in difficulty. Perfect for practicing sequences, timing, and state management.&lt;/p&gt;

&lt;h2&gt;
  
  
  7️⃣ Color Game
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://www.reactchallenges.com/challenges/color-game" rel="noopener noreferrer"&gt;https://www.reactchallenges.com/challenges/color-game&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;📌 Level: Intermediate | ⏱ 45 min&lt;/strong&gt;&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%2Fwy9hez7igywbqozimucl.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%2Fwy9hez7igywbqozimucl.png" alt="Color Game preview" width="786" height="982"&gt;&lt;/a&gt;&lt;br&gt;
A simple color-guessing game: identify the slightly different square to level up before making a mistake. Quick, fun, and a great exercise for state updates and game logic.&lt;/p&gt;

&lt;p&gt;💡 All of these challenges are designed to help you practice React hooks, state management, and building interactive UIs. Some require a subscription, but they’re worth the effort if you want to sharpen your skills!&lt;/p&gt;

</description>
      <category>react</category>
      <category>devchallenge</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
  </channel>
</rss>
