<?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: Bruno Xavier</title>
    <description>The latest articles on Forem by Bruno Xavier (@xavierbruno).</description>
    <link>https://forem.com/xavierbruno</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%2F594645%2Fe47bedd6-ddb8-403a-8f23-0fdc670fe01a.png</url>
      <title>Forem: Bruno Xavier</title>
      <link>https://forem.com/xavierbruno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/xavierbruno"/>
    <language>en</language>
    <item>
      <title>Organizing a Legacy React Project Without Blocking Delivery</title>
      <dc:creator>Bruno Xavier</dc:creator>
      <pubDate>Mon, 30 Mar 2026 00:23:59 +0000</pubDate>
      <link>https://forem.com/xavierbruno/organizing-a-legacy-react-project-without-blocking-delivery-3ji0</link>
      <guid>https://forem.com/xavierbruno/organizing-a-legacy-react-project-without-blocking-delivery-3ji0</guid>
      <description>&lt;p&gt;Rewriting everything from scratch often looks like the cleanest solution. In reality, it is usually the most expensive, slowest, and riskiest option. What consistently works in production environments is incremental &lt;strong&gt;refactoring driven by impact&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Diagnose before changing anything&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before reorganizing folders or introducing patterns, identify where the real cost is.&lt;/p&gt;

&lt;p&gt;Common signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Components with 200–500+ lines&lt;/li&gt;
&lt;li&gt;Business logic mixed with rendering&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useEffect&lt;/code&gt; handling multiple responsibilities&lt;/li&gt;
&lt;li&gt;Duplicated logic across the codebase&lt;/li&gt;
&lt;li&gt;Implicit dependencies (scattered global state)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this mapping, refactoring becomes superficial.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Define a minimum standard and stop the bleed&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before fixing legacy code, prevent it from growing.&lt;/p&gt;

&lt;p&gt;A simple baseline already improves consistency:&lt;/p&gt;

&lt;p&gt;Components → UI only&lt;br&gt;
Hooks → logic and state&lt;br&gt;
Services → API communication&lt;/p&gt;

&lt;p&gt;Rule: &lt;strong&gt;new code must follow the standard&lt;/strong&gt;, even if old code does not.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;3. Structure by feature, not by type&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Legacy projects often use a “by type” structure (&lt;code&gt;components/&lt;/code&gt;, &lt;code&gt;utils/&lt;/code&gt;, etc.), which increases coupling.&lt;/p&gt;

&lt;p&gt;A feature-based structure scales better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
  features/
    users/
      components/
      hooks/
      services/
    dashboard/
  shared/
    components/
    hooks/
    utils/
  app/
    routes/
    providers/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces cross-dependencies and improves ownership by domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. Incremental refactoring (the only viable strategy)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Avoid large, batch refactors. The risk rarely justifies the cost.&lt;/p&gt;

&lt;p&gt;Effective approach:&lt;/p&gt;

&lt;p&gt;If you touch code → improve that part&lt;br&gt;
If you see duplication → extract it&lt;br&gt;
If logic is mixed → move it into a hook&lt;/p&gt;

&lt;p&gt;Small, continuous improvements compound over time.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;5. Separate responsibilities clearly&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One of the main issues in legacy code is mixed responsibilities.&lt;/p&gt;

&lt;p&gt;Typical example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&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;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// complex logic&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* UI + logic */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&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;Refactored:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// hook&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useDashboardData&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;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// component&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&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;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDashboardData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DashboardView&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&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;The gain is not aesthetic—it is &lt;strong&gt;lower coupling and higher predictability.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;6. Centralize side effects&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Legacy projects often suffer from duplicated requests and inconsistent state.&lt;/p&gt;

&lt;p&gt;Standardizing with tools like React Query (TanStack) or SWR provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic caching&lt;/li&gt;
&lt;li&gt;Data synchronization&lt;/li&gt;
&lt;li&gt;Less manual &lt;code&gt;useEffect&lt;/code&gt; logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: fewer bugs and less boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;7. Test where it matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Full coverage in legacy systems is rarely efficient.&lt;/p&gt;

&lt;p&gt;Prioritize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hooks (business logic)&lt;/li&gt;
&lt;li&gt;Services (rules and integrations)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lower priority:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pure UI components&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;8. Strategy comparison&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0y02ua4vsopfi430bbd.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%2Fj0y02ua4vsopfi430bbd.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Organizing a legacy React project is not about achieving perfect architecture. It is about &lt;strong&gt;continuously reducing complexity without stopping delivery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clear separation of responsibilities, feature-based structure, and incremental refactoring consistently deliver the best results with the lowest risk.&lt;/p&gt;

&lt;p&gt;Over time, this transforms unpredictable code into a system that is easier to maintain, test, and scale.&lt;/p&gt;

</description>
      <category>react</category>
      <category>frontend</category>
      <category>legacy</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Magic (and Gotchas) of Vue.js Reactivity: How It Knows Exactly What to Update</title>
      <dc:creator>Bruno Xavier</dc:creator>
      <pubDate>Fri, 27 Mar 2026 01:10:43 +0000</pubDate>
      <link>https://forem.com/xavierbruno/the-magic-and-gotchas-of-vuejs-reactivity-how-it-knows-exactly-what-to-update-hkh</link>
      <guid>https://forem.com/xavierbruno/the-magic-and-gotchas-of-vuejs-reactivity-how-it-knows-exactly-what-to-update-hkh</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;The Magic (and Gotchas) of Vue.js Reactivity: How It Knows Exactly What to Update&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you've used Vue.js, you've probably experienced that "wow" moment: you change a variable and the UI updates automatically. No setState, no massive useEffect chains, no manual subscriptions. It feels like magic.&lt;/p&gt;

&lt;p&gt;But it's not magic — it's a beautifully engineered reactivity system. And behind that simplicity lies one of the most interesting technical implementations in modern frontend frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Makes Vue's Reactivity So Special?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Unlike React, which relies on Virtual DOM diffing and explicit hooks, &lt;strong&gt;Vue 3&lt;/strong&gt; uses native &lt;strong&gt;JavaScript Proxies&lt;/strong&gt; (ES6) to create automatic dependency tracking.&lt;br&gt;
Here's the trick in simple terms:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;When you &lt;strong&gt;read&lt;/strong&gt; a reactive property (e.g. count.value), Vue secretly registers that the current effect (component render, watcher, or computed) depends on it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you &lt;strong&gt;change&lt;/strong&gt; that property, Vue only notifies the effects that actually depend on it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is called &lt;strong&gt;fine-grained reactivity&lt;/strong&gt; — surgical updates without re-rendering entire components unnecessarily.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Practical Example with ref() and reactive()&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;vue&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reactive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watchEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// ref() is used for primitives or when you want .value&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// reactive() turns the entire object into a Proxy&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reactive&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bruno&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// watchEffect runs immediately and tracks dependencies automatically&lt;/span&gt;
&lt;span class="nf"&gt;watchEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`User &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is at level &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Counter: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Reactive changes&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;                    &lt;span class="c1"&gt;// only updates what depends on count&lt;/span&gt;
  &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;           &lt;span class="c1"&gt;// only updates what depends on level&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Notice something? We didn’t have to tell Vue what to watch. It figured it out by itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;The Curiosity Behind the Curtain&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Vue’s reactivity system is so well isolated that you can actually use it standalone with the &lt;a class="mentioned-user" href="https://dev.to/vue"&gt;@vue&lt;/a&gt;/reactivity package — no Vue components required.&lt;br&gt;
Internally:&lt;/p&gt;

&lt;p&gt;reactive(obj) returns a &lt;strong&gt;Proxy&lt;/strong&gt; that intercepts get and set operations.&lt;br&gt;
While an "active effect" is running (component render, watchEffect, computed, etc.), every property read registers the current effect as a dependent.&lt;br&gt;
Every write triggers only the relevant effects.&lt;/p&gt;

&lt;p&gt;It’s a modern, automatic &lt;strong&gt;Observer Pattern&lt;/strong&gt; that is incredibly efficient.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;The Gotchas Every Vue Developer Discovers (Usually the Hard Way)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The magic isn’t perfect. Here are some interesting quirks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. reactive() only works with objects&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reactive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ❌ Doesn't work! Use ref() for primitives&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Destructuring breaks reactivity&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reactive&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;   &lt;span class="c1"&gt;// count is now a plain number!&lt;/span&gt;

&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="c1"&gt;// ❌ This does NOTHING reactive!&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix: Use toRefs() or always access via state.count.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adding new properties after creation
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reactive&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bruno&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="c1"&gt;// ✅ This works! Vue tracks property additions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, operations like Object.assign() or delete can sometimes lose reactivity. Best practice: stick to direct property access or use shallowReactive when needed.&lt;br&gt;
Why This Matters in 2026&lt;br&gt;
With Vue 3.5+ bringing even better performance optimizations (especially for large arrays and reduced memory usage), understanding reactivity helps you write naturally performant code without excessive memoization.&lt;br&gt;
It also makes &lt;strong&gt;composables&lt;/strong&gt; incredibly powerful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// A reusable composable that automatically tracks dependencies&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useMousePosition&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;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// The watchEffect inside tracks dependencies automatically&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ** Final Thoughts: Vue Makes Reactivity "Boringly Easy"**
&lt;/h2&gt;

&lt;p&gt;The biggest curiosity about Vue.js is how it took something complex (dependency tracking and optimized updates) and made it feel &lt;strong&gt;obvious&lt;/strong&gt;.&lt;br&gt;
You don’t have to think about when your component should update. You just declare your state, and Vue takes care of the rest — with elegance, great performance, and a surprisingly small bundle size.&lt;br&gt;
If you're still using the Options API or transitioning to Composition API, take some time to play with watchEffect, shallowRef, and understand how Proxies work under the hood. The feeling of control is addictive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about you?&lt;/strong&gt;&lt;br&gt;
What was the biggest &lt;strong&gt;"magic moment"&lt;/strong&gt; — or the most surprising &lt;strong&gt;gotcha&lt;/strong&gt; — you’ve encountered with Vue’s reactivity system?&lt;br&gt;
Drop it in the comments below! 👇&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
