<?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: ReactChallenges</title>
    <description>The latest articles on Forem by ReactChallenges (@reactchallenges).</description>
    <link>https://forem.com/reactchallenges</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%2Fe450946a-3098-4715-8d06-0892ab9ac221.png</url>
      <title>Forem: ReactChallenges</title>
      <link>https://forem.com/reactchallenges</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/reactchallenges"/>
    <language>en</language>
    <item>
      <title>🥋 New coding katas are now live on ReactChallenges</title>
      <dc:creator>ReactChallenges</dc:creator>
      <pubDate>Fri, 01 May 2026 11:27:07 +0000</pubDate>
      <link>https://forem.com/reactchallenges/new-coding-katas-are-now-live-on-reactchallenges-i83</link>
      <guid>https://forem.com/reactchallenges/new-coding-katas-are-now-live-on-reactchallenges-i83</guid>
      <description>&lt;p&gt;We’ve just released a new section on ReactChallenges: &lt;strong&gt;coding katas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike traditional coding challenges, these are not focused on rankings, scores, or competition. Instead, they are designed for &lt;strong&gt;deliberate practice&lt;/strong&gt;—short, focused exercises that help you improve specific skills through repetition.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  What are katas?
&lt;/h2&gt;

&lt;p&gt;Katas are small, self-contained coding exercises. Each one targets a specific concept or pattern so you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Practice the same idea multiple times&lt;/li&gt;
&lt;li&gt;Strengthen your mental models&lt;/li&gt;
&lt;li&gt;Improve fluency in React and JavaScript&lt;/li&gt;
&lt;li&gt;Build consistency over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no leaderboard, no timer pressure, and no comparison with others.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this approach?
&lt;/h2&gt;

&lt;p&gt;Most platforms optimize for competition.&lt;/p&gt;

&lt;p&gt;This one doesn’t.&lt;/p&gt;

&lt;p&gt;The goal of katas is to reduce noise and focus on what actually makes you better at coding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repetition over novelty&lt;/li&gt;
&lt;li&gt;Understanding over speed&lt;/li&gt;
&lt;li&gt;Clarity over complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’ve used competitive platforms before, this is intentionally different.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who are they for?
&lt;/h2&gt;

&lt;p&gt;These katas are especially useful if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want to reinforce JavaScript fundamentals&lt;/li&gt;
&lt;li&gt;Prefer structured, low-pressure practice&lt;/li&gt;
&lt;li&gt;Are preparing for interviews or real-world development&lt;/li&gt;
&lt;li&gt;Want to build consistency in your coding routine&lt;/li&gt;
&lt;/ul&gt;

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




&lt;p&gt;Less noise. More repetition. Better understanding.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>New way of passing ref to child in React 19</title>
      <dc:creator>ReactChallenges</dc:creator>
      <pubDate>Thu, 30 Apr 2026 16:07:17 +0000</pubDate>
      <link>https://forem.com/reactchallenges/new-way-of-passing-ref-to-child-in-react-19-22ja</link>
      <guid>https://forem.com/reactchallenges/new-way-of-passing-ref-to-child-in-react-19-22ja</guid>
      <description>&lt;p&gt;If you have worked with refs in React, you probably know they have always felt a bit different from the rest of the API. Useful, yes—but also slightly awkward.&lt;/p&gt;

&lt;p&gt;With React 19, that changes. Passing a ref to a child component is now much more natural because &lt;strong&gt;ref can be handled like a normal prop&lt;/strong&gt;. That means less boilerplate, cleaner components, and a simpler mental model.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;try this yourself, the &lt;a href="https://www.reactchallenges.com/challenges/passing-refs-in-react-19" rel="noopener noreferrer"&gt;Passing Refs in React 19&lt;/a&gt; challenge on our platform lets you practice exactly this pattern.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How refs work (and why they were awkward)
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;ref&lt;/code&gt; is just a way to keep a direct reference to something rendered by React, usually a DOM element. You normally use refs when you need to do something imperative: focus an input, scroll an element into view, measure size or position, or trigger methods like opening a modal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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;inputRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;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="nx"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;focus&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;Focus input&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputRef&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;/&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;The parent owns the button, and the parent decides when the input should be focused. Because of that, the ref also belongs in the parent. The rule is simple: &lt;strong&gt;the ref should live wherever the action is controlled&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But what happens when the ref is inside the child?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Input&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;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&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;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now only the Input component can use that ref. The parent cannot call &lt;code&gt;.focus()&lt;/code&gt;, scroll to it, measure it, or control it from outside. The ref becomes private—sometimes fine, but often not what you need.&lt;/p&gt;

&lt;p&gt;And here's where the friction came in. Before React 19, ref was treated differently from normal props. You could not simply write &lt;code&gt;&amp;lt;Input ref={inputRef} /&amp;gt;&lt;/code&gt; unless that component used &lt;code&gt;forwardRef&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;forwardRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Props&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;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ref&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;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked, but it came with real costs: extra wrapper syntax, &lt;strong&gt;ref behaving differently from props&lt;/strong&gt;, more complex TypeScript types, and awkward composition with &lt;code&gt;memo&lt;/code&gt; or HOCs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What React 19 changes
&lt;/h2&gt;

&lt;p&gt;Now you can write this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;forwardRef&lt;/code&gt;. No special wrapper. No separate mental model.&lt;/p&gt;

&lt;p&gt;The main benefit is &lt;strong&gt;consistency&lt;/strong&gt;. Before, ref felt like a special exception in React. Now it follows the same idea as everything else: if the parent needs access to something, pass it down. That makes components easier to understand, easier to teach, and reduces noise in codebases full of tiny wrapper components whose only purpose was forwarding refs.&lt;/p&gt;

&lt;p&gt;This also helps with advanced patterns. Sometimes you don't want to expose a DOM node—you want to expose methods. For example, a modal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Modal&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;ref&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;open&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setOpen&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="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useImperativeHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&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="na"&gt;open&lt;/span&gt;&lt;span class="p"&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;setOpen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="p"&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;setOpen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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="nx"&gt;open&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Modal&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Used like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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;modalRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;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="nx"&gt;modalRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&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;Open modal&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Modal&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;modalRef&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;/&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;This pattern still works, but now the component itself is cleaner.&lt;/p&gt;

&lt;p&gt;Refs were never difficult because of what they do. They were difficult because &lt;strong&gt;React treated them differently&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;React 19 removes that friction. A ref is usually owned by the component that needs to use it—most of the time, the parent. The child simply receives that ref and connects it to something useful.&lt;/p&gt;

&lt;p&gt;Now that ref behaves like a normal prop, the whole pattern feels much more natural. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to solidify this concept, try the &lt;a href="https://www.reactchallenges.com/challenges/passing-refs-in-react-19" rel="noopener noreferrer"&gt;Passing Refs in React 19&lt;/a&gt; challenge—it takes just a few minutes.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>useref</category>
    </item>
    <item>
      <title>🚀 New Free React Challenge: New Way of Passing Ref</title>
      <dc:creator>ReactChallenges</dc:creator>
      <pubDate>Mon, 27 Apr 2026 20:54:44 +0000</pubDate>
      <link>https://forem.com/reactchallenges/new-free-react-challenge-new-way-of-passing-ref-29h5</link>
      <guid>https://forem.com/reactchallenges/new-free-react-challenge-new-way-of-passing-ref-29h5</guid>
      <description>&lt;p&gt;A new free challenge is now available on &lt;strong&gt;&lt;a href="https://www.reactchallenges.com/" rel="noopener noreferrer"&gt;ReactChallenges.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React 19&lt;/strong&gt; introduced a cleaner way to work with refs across components, reducing the need for &lt;code&gt;forwardRef&lt;/code&gt; in many common scenarios.&lt;/p&gt;

&lt;p&gt;This new exercise helps you practice that pattern with a real UI example.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll build
&lt;/h2&gt;

&lt;p&gt;A simple issue modal where users can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the modal&lt;/li&gt;
&lt;li&gt;Automatically focus the textarea when it appears&lt;/li&gt;
&lt;li&gt;Close it with &lt;strong&gt;Cancel&lt;/strong&gt; or &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you'll learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to create a ref in the parent component&lt;/li&gt;
&lt;li&gt;How to pass a ref directly to a child component in React 19&lt;/li&gt;
&lt;li&gt;How to control focus from outside the child component&lt;/li&gt;
&lt;li&gt;How this compares to the previous &lt;code&gt;forwardRef&lt;/code&gt; pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Refs are often needed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modals&lt;/li&gt;
&lt;li&gt;Search inputs&lt;/li&gt;
&lt;li&gt;Forms&lt;/li&gt;
&lt;li&gt;Custom UI primitives&lt;/li&gt;
&lt;li&gt;Accessibility improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React 19 makes these interactions cleaner and easier to implement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the challenge
&lt;/h2&gt;

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

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>frontendchallenge</category>
    </item>
    <item>
      <title>Composition vs Compound Components in React</title>
      <dc:creator>ReactChallenges</dc:creator>
      <pubDate>Tue, 14 Apr 2026 08:58:38 +0000</pubDate>
      <link>https://forem.com/reactchallenges/composition-vs-compound-components-in-react-2ffp</link>
      <guid>https://forem.com/reactchallenges/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;blockquote&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;/blockquote&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;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;

&lt;blockquote&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;/blockquote&gt;

</description>
      <category>architecture</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>🚀 𝗡𝗲𝘄 𝗖𝗵𝗮𝗹𝗹𝗲𝗻𝗴𝗲 𝗼𝗻 𝗥𝗲𝗮𝗰𝘁 𝗖𝗵𝗮𝗹𝗹𝗲𝗻𝗴𝗲𝘀: 𝗔𝗶𝗿𝗯𝗻𝗯 𝗖𝗮𝗿𝗱 𝘄𝗶𝘁𝗵 𝗖𝗼𝗺𝗽𝗼𝘂𝗻𝗱 𝗖𝗼𝗺𝗽𝗼𝗻𝗲𝗻𝘁𝘀 + 𝗖𝗼𝗻𝘁𝗲𝘅𝘁</title>
      <dc:creator>ReactChallenges</dc:creator>
      <pubDate>Mon, 13 Apr 2026 08:44:26 +0000</pubDate>
      <link>https://forem.com/reactchallenges/--5bdk</link>
      <guid>https://forem.com/reactchallenges/--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>ReactChallenges</dc:creator>
      <pubDate>Fri, 20 Mar 2026 11:21:02 +0000</pubDate>
      <link>https://forem.com/reactchallenges/new-react-challenge-play-soroban-3bk9</link>
      <guid>https://forem.com/reactchallenges/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>ReactChallenges</dc:creator>
      <pubDate>Mon, 09 Mar 2026 15:37:03 +0000</pubDate>
      <link>https://forem.com/reactchallenges/level-up-your-react-knowledge-with-quizzes-258</link>
      <guid>https://forem.com/reactchallenges/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>ReactChallenges</dc:creator>
      <pubDate>Mon, 09 Feb 2026 12:14:14 +0000</pubDate>
      <link>https://forem.com/reactchallenges/new-free-react-challenge-new-way-of-data-fetching-4g55</link>
      <guid>https://forem.com/reactchallenges/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>ReactChallenges</dc:creator>
      <pubDate>Mon, 02 Feb 2026 16:27:10 +0000</pubDate>
      <link>https://forem.com/reactchallenges/reflex-click-game-a-tiny-react-challenge-to-practice-timers-and-state-1lcg</link>
      <guid>https://forem.com/reactchallenges/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>ReactChallenges</dc:creator>
      <pubDate>Mon, 19 Jan 2026 12:10:28 +0000</pubDate>
      <link>https://forem.com/reactchallenges/new-react-challenge-tetris-ii-1aab</link>
      <guid>https://forem.com/reactchallenges/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>ReactChallenges</dc:creator>
      <pubDate>Thu, 08 Jan 2026 22:37:29 +0000</pubDate>
      <link>https://forem.com/reactchallenges/new-react-challenge-tetris-25ee</link>
      <guid>https://forem.com/reactchallenges/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>ReactChallenges</dc:creator>
      <pubDate>Mon, 22 Dec 2025 17:59:09 +0000</pubDate>
      <link>https://forem.com/reactchallenges/new-free-react-challenge-countdown-1b67</link>
      <guid>https://forem.com/reactchallenges/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>
  </channel>
</rss>
