<?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: Ryan John</title>
    <description>The latest articles on DEV Community by Ryan John (@smirk9581).</description>
    <link>https://dev.to/smirk9581</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3937044%2F674e6a20-1b72-4a23-96ea-e9fc0f1af994.jpeg</url>
      <title>DEV Community: Ryan John</title>
      <link>https://dev.to/smirk9581</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/smirk9581"/>
    <language>en</language>
    <item>
      <title>How does VuReact compile Vue 3's defineModel to React?</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Tue, 23 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/how-does-vureact-compile-vue-3s-definemodel-to-react-378n</link>
      <guid>https://dev.to/smirk9581/how-does-vureact-compile-vue-3s-definemodel-to-react-378n</guid>
      <description>&lt;p&gt;&lt;a href="https://vureact.top/en/guide/introduction.html" rel="noopener noreferrer"&gt;VuReact&lt;/a&gt; is a compiler toolchain for migrating from Vue to React — and for writing React with Vue 3 syntax.&lt;/p&gt;

&lt;p&gt;In this article, we will look at how Vue 3's &lt;code&gt;defineModel&lt;/code&gt; macro is compiled into React.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before We Start
&lt;/h2&gt;

&lt;p&gt;To keep the examples easy to read, this article follows a few simple conventions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All Vue and React snippets focus on core logic only, with full component wrappers and unrelated configuration omitted.&lt;/li&gt;
&lt;li&gt;The discussion assumes you are already familiar with the API shape and core behavior of Vue 3's &lt;code&gt;defineModel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;VuReact only supports the &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;default&lt;/code&gt;, &lt;code&gt;required&lt;/code&gt; options and a custom prop name.&lt;/li&gt;
&lt;li&gt;Array destructuring of the return value is not supported.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Compilation Mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vue &lt;code&gt;defineModel&lt;/code&gt; → &lt;code&gt;useVRef&lt;/code&gt; + &lt;code&gt;useUpdated&lt;/code&gt; for auto-sync
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;defineModel&lt;/code&gt; is a Vue 3 &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; macro that simplifies &lt;code&gt;v-model&lt;/code&gt; two-way binding declarations. Under the hood, Vue's compiler generates a &lt;code&gt;ref&lt;/code&gt; along with a &lt;code&gt;modelValue&lt;/code&gt; prop and an &lt;code&gt;update:modelValue&lt;/code&gt; event. VuReact compiles this into &lt;code&gt;useVRef&lt;/code&gt; (which turns a prop value into a reactive ref) paired with &lt;code&gt;useUpdated&lt;/code&gt; (which triggers the parent's &lt;code&gt;onUpdate:xxx&lt;/code&gt; callback when the value changes).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Declares a "state" prop consumed by the parent via v-model:state&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="nx"&gt;defineModel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Declares a "modelValue" prop (default: 'xxx') consumed via v-model&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useUpdated&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;@vureact/runtime-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IChildProps&lt;/span&gt; &lt;span class="o"&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&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;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;onUpdateState&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;onUpdateModelValue&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// "state" prop consumed by parent via onUpdateState&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="nx"&gt;useVRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&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;state&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// "modelValue" prop (default: 'xxx') consumed via onUpdateModelValue&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&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;modelValue&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Automatically notifies parent on value change&lt;/span&gt;
&lt;span class="nf"&gt;useUpdated&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdateState&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;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nf"&gt;useUpdated&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdateModelValue&lt;/span&gt;&lt;span class="p"&gt;?.(&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;modelValue&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the example shows, Vue's &lt;code&gt;defineModel&lt;/code&gt; is decomposed into three parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prop type declaration&lt;/strong&gt; — non-event fields in &lt;code&gt;IChildProps&lt;/code&gt; (&lt;code&gt;state?&lt;/code&gt;, &lt;code&gt;modelValue?&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event callback declaration&lt;/strong&gt; — &lt;code&gt;onUpdateXxx&lt;/code&gt; fields in &lt;code&gt;IChildProps&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime reactivity&lt;/strong&gt; — &lt;code&gt;useVRef&lt;/code&gt; wraps the initial prop value into a reactive ref, and &lt;code&gt;useUpdated&lt;/code&gt; watches the ref and automatically invokes the parent-provided callback.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With VuReact, directly mutating the ref's &lt;code&gt;.value&lt;/code&gt; inside the component triggers the parent's update — exactly like Vue's development experience.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;defineModel(name, options)&lt;/code&gt; → typed prop declaration with default
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;defineModel&lt;/code&gt; accepts a &lt;code&gt;name&lt;/code&gt; to specify the prop name and limited options (&lt;code&gt;type&lt;/code&gt;, &lt;code&gt;default&lt;/code&gt;, &lt;code&gt;required&lt;/code&gt;). VuReact converts these options into corresponding TypeScript type constraints and default-value handling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&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="nx"&gt;defineModel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;default&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="na"&gt;required&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IChildProps&lt;/span&gt; &lt;span class="o"&gt;=&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="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// required: true → non-optional type&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;onUpdateCount&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&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;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&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;count&lt;/span&gt; &lt;span class="o"&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;// default: 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option mapping rules&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;required: true&lt;/code&gt;&lt;/strong&gt; makes &lt;code&gt;count&lt;/code&gt; required (&lt;code&gt;count: number&lt;/code&gt;) instead of optional (&lt;code&gt;count?: number&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;default: 0&lt;/code&gt;&lt;/strong&gt; is implemented via the &lt;code&gt;??&lt;/code&gt; nullish coalescing operator, falling back to &lt;code&gt;0&lt;/code&gt; when the parent does not pass the prop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;type: Number&lt;/code&gt;&lt;/strong&gt; influences the generic type parameter (&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;) in the generated TypeScript definition.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Direct &lt;code&gt;.value&lt;/code&gt; assignment → auto-sync with parent
&lt;/h3&gt;

&lt;p&gt;In Vue, &lt;code&gt;defineModel&lt;/code&gt; returns a &lt;code&gt;ref&lt;/code&gt;; you read and write its &lt;code&gt;.value&lt;/code&gt;. VuReact preserves this &lt;code&gt;.value&lt;/code&gt; access pattern in the compiled React code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&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="nx"&gt;defineModel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;state&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// direct assignment&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&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;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&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;state&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;update&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;state&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// triggers props.onUpdateState automatically&lt;/span&gt;
&lt;span class="p"&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;value&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Compilation rules&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;useCallback&lt;/code&gt; wrapping&lt;/strong&gt; — functions that touch &lt;code&gt;state.value&lt;/code&gt; are wrapped with &lt;code&gt;useCallback&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correct dependency tracking&lt;/strong&gt; — &lt;code&gt;state.value&lt;/code&gt; is added to the dependency array.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parent sync&lt;/strong&gt; — &lt;code&gt;state.value = 'hello'&lt;/code&gt; simultaneously updates the component's local state and pushes the new value to the parent.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;v-model&lt;/code&gt; in templates → React controlled components
&lt;/h3&gt;

&lt;p&gt;Vue templates use &lt;code&gt;v-model&lt;/code&gt; to bind a &lt;code&gt;defineModel&lt;/code&gt; ref; VuReact compiles this into the standard React controlled-component pattern (&lt;code&gt;value&lt;/code&gt; + &lt;code&gt;onChange&lt;/code&gt;).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"modelValue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;Parent bound v-model is: {{ count }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"update"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Increment&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;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;Parent bound v-model is:&lt;span class="si"&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="si"&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;
&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="nx"&gt;update&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Increment&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;v-model&lt;/code&gt; conversion rules&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;value&lt;/code&gt; binding&lt;/strong&gt; — the ref's value is bound to the &lt;code&gt;value&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;onChange&lt;/code&gt; handler&lt;/strong&gt; — the ref is reassigned directly in the &lt;code&gt;onChange&lt;/code&gt; callback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic sync&lt;/strong&gt; — the reassignment triggers &lt;code&gt;useUpdated&lt;/code&gt;, which pushes the new value to the parent.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Unsupported &lt;code&gt;defineModel&lt;/code&gt; patterns
&lt;/h3&gt;

&lt;p&gt;VuReact explicitly does not support the following &lt;code&gt;defineModel&lt;/code&gt; usages and will skip them with an error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Array destructuring of the return value&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&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="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// Not supported (Vue 3.4+ experimental feature)&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;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&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;Vue 3.4+ supports destructuring the return value into &lt;code&gt;[model, modifiers]&lt;/code&gt; to access modifier status. VuReact does not support this syntax yet. Use the standard form instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&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="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// Supported form&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&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;&lt;strong&gt;2. &lt;code&gt;get&lt;/code&gt; / &lt;code&gt;set&lt;/code&gt; / &lt;code&gt;validator&lt;/code&gt; options&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&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="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// Not supported&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="nf"&gt;validator&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="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;Vue's &lt;code&gt;defineModel&lt;/code&gt; supports custom &lt;code&gt;get&lt;/code&gt;/&lt;code&gt;set&lt;/code&gt; accessors and a &lt;code&gt;validator&lt;/code&gt; function. VuReact does not support these options yet. Use &lt;code&gt;useVRef&lt;/code&gt; directly to implement custom logic if needed.&lt;/p&gt;




&lt;h3&gt;
  
  
  Full example
&lt;/h3&gt;

&lt;p&gt;Below is a complete single-file component using &lt;code&gt;defineModel&lt;/code&gt; and its compiled React output.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue (&lt;code&gt;input.vue&lt;/code&gt;):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&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="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// @vr-name: Child&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="nx"&gt;defineModel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineModel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;default&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="na"&gt;required&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="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;state&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello&lt;/span&gt;&lt;span class="dl"&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="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;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"modelValue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;Parent bound v-model is: &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"update"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Increment&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React (&lt;code&gt;output.tsx&lt;/code&gt;):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useUpdated&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;@vureact/runtime-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IChildProps&lt;/span&gt; &lt;span class="o"&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;onUpdateState&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;onUpdateModelValue&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;onUpdateCount&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&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;Child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IChildProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&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;state&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;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&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;modelValue&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&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;count&lt;/span&gt; &lt;span class="o"&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;update&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;state&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello&lt;/span&gt;&lt;span class="dl"&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="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;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="nf"&gt;useUpdated&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdateState&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;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="nf"&gt;useUpdated&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdateModelValue&lt;/span&gt;&lt;span class="p"&gt;?.(&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="nf"&gt;useUpdated&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdateCount&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="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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;input&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;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;Parent bound v-model is:&lt;span class="si"&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="si"&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;
      &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="nx"&gt;update&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Increment&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;/&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Related Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-model.html" rel="noopener noreferrer"&gt;https://vureact.top/en/guide/semantic-comparison/script/define-model.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Runtime: &lt;a href="https://runtime.vureact.top/en/guide/hooks/v-ref.html" rel="noopener noreferrer"&gt;useVRef&lt;/a&gt; / &lt;a href="https://runtime.vureact.top/en/guide/hooks/updated.html" rel="noopener noreferrer"&gt;useUpdated&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;https://github.com/vureact-js/core&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>VuReact | Vue to React Hybrid Migration Practice: Real Support Hub Case</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Mon, 15 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/vureact-vue-to-react-hybrid-migration-practice-real-support-hub-case-19m9</link>
      <guid>https://dev.to/smirk9581/vureact-vue-to-react-hybrid-migration-practice-real-support-hub-case-19m9</guid>
      <description>&lt;p&gt;This is a practical migration walkthrough for a multi-channel customer support admin app, designed to show VuReact’s hybrid and transformation capabilities in a realistic backend scenario.&lt;/p&gt;

&lt;p&gt;In this guide, you will learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to clone and launch the example repository&lt;/li&gt;
&lt;li&gt;how to inspect the project structure and find the key migration files quickly&lt;/li&gt;
&lt;li&gt;how to use &lt;code&gt;build&lt;/code&gt; and &lt;code&gt;watch&lt;/code&gt; to inspect the generated output&lt;/li&gt;
&lt;li&gt;how to start the React output and verify business flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Key hybrid technology stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue 3&lt;/li&gt;
&lt;li&gt;Vue Router 4&lt;/li&gt;
&lt;li&gt;Ant Design 6（React）&lt;/li&gt;
&lt;li&gt;Zustand（React）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try it online first, use these links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/vureact-js/example-customer-support-hub" rel="noopener noreferrer"&gt;https://github.com/vureact-js/example-customer-support-hub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live demo: &lt;a href="https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true" rel="noopener noreferrer"&gt;https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Preview: &lt;a href="https://skx7pn-5173.csb.app/" rel="noopener noreferrer"&gt;https://skx7pn-5173.csb.app/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project structure overview
&lt;/h2&gt;

&lt;p&gt;Before you start, get a high-level picture of the project layout. The source structure looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;customer-support-hub/
├─ package.json
├─ vureact.config.ts
├─ vite.config.ts
├─ index.html
└─ src/
   ├─ main.ts
   ├─ App.vue
   ├─ styles/
   │  └─ app.scss
   ├─ data/
   │  ├─ mock.ts
   │  └─ mock-api.ts
   ├─ store/
   │  └─ useAppStore.ts
   ├─ components/
   │  ├─ ConversationPanel.vue
   │  ├─ TicketFilterBar.vue
   │  ├─ TicketTimeline.vue
   │  └─ ...
   ├─ pages/
   │  ├─ Dashboard.vue
   │  ├─ TicketsList.vue
   │  ├─ TicketDetail.vue
   │  ├─ Customers.vue
   │  ├─ Agents.vue
   │  ├─ ConversationCenter.vue
   │  ├─ KnowledgeBase.vue
   │  ├─ SlaBoard.vue
   │  ├─ Settings.vue
   │  └─ auth/Login.vue
   └─ router/
      ├─ index.ts
      └─ routes.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three files are especially important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/main.ts&lt;/code&gt; is the source entry point that will be compiled into the React entry.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/router/index.ts&lt;/code&gt; is the routing adaptation entry.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/store/useAppStore.ts&lt;/code&gt; manages cross-page state and is one of the most important files for validating business flows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Clone the repo and install dependencies
&lt;/h2&gt;

&lt;p&gt;Clone the repository and install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/vureact-js/example-customer-support-hub.git
&lt;span class="nb"&gt;cd &lt;/span&gt;customer-support-hub
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, confirm that &lt;code&gt;package.json&lt;/code&gt; contains these scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vr:watch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vureact watch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vr:build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vureact build"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;this example follows a workflow where you maintain the Vue source and verify the React output&lt;/li&gt;
&lt;li&gt;the migration starts with getting the build loop working, not by editing the generated output&lt;/li&gt;
&lt;li&gt;if installation fails, first check Node.js, npm, and network connectivity&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success criteria
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt; completes without blocking errors&lt;/li&gt;
&lt;li&gt;the repository root recognizes &lt;code&gt;vureact.config.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;you can proceed to &lt;code&gt;npm run vr:build&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Run a full build cycle
&lt;/h2&gt;

&lt;p&gt;Run a complete build first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run vr:build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to keep seeing updated output while you edit source files, start watch mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run vr:watch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What to expect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;build statistics appear in the console&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;.vureact/react-app&lt;/code&gt; directory is generated at the project root&lt;/li&gt;
&lt;li&gt;the generated React output keeps a directory structure similar to the Vue source&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;this step is about verifying the compiler can consistently produce the React app, not about checking the UI yet&lt;/li&gt;
&lt;li&gt;if the output directory is missing, verify that &lt;code&gt;vureact.config.ts&lt;/code&gt; exists and is correct&lt;/li&gt;
&lt;li&gt;this example may apply post-build output adjustments, so rely on the final generated entry and stylesheet imports&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Troubleshooting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;if the build fails, inspect the source for syntax or configuration issues&lt;/li&gt;
&lt;li&gt;if the output folder is missing, confirm the command ran from the project root&lt;/li&gt;
&lt;li&gt;if watch mode doesn’t sync, check that the watcher process is still running&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success criteria
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.vureact/react-app&lt;/code&gt; is generated successfully&lt;/li&gt;
&lt;li&gt;repeated runs of &lt;code&gt;npm run vr:build&lt;/code&gt; produce stable output&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Understand the key files
&lt;/h2&gt;

&lt;p&gt;This step is not about reading every file in detail; it is about knowing which files to watch during migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Routing entry
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;src/router/index.ts&lt;/code&gt; should be your first stop because it defines how the app transitions from Vue routing into the React output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;configFile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/router/index.ts&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. State entry
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;src/store/useAppStore.ts&lt;/code&gt; manages session state, filter conditions, activity streams, and other cross-page data. When the state flow works, page interactions usually work too.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Page entry points
&lt;/h3&gt;

&lt;p&gt;The pages under &lt;code&gt;src/pages/&lt;/code&gt; define the main business surface you will validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Dashboard.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TicketsList.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TicketDetail.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Customers.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Agents.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KnowledgeBase.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SlaBoard.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Settings.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth/Login.vue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;inspect routing first, then state, then pages&lt;/li&gt;
&lt;li&gt;in migration scenarios, problems are more often caused by page/state interaction than by a single component&lt;/li&gt;
&lt;li&gt;if you can explain which page reads which state and which actions update it, validation becomes much easier&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: Start the React output
&lt;/h2&gt;

&lt;p&gt;Open the generated React project and start the dev server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; .vureact/react-app
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What to expect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;the Vite dev server starts successfully&lt;/li&gt;
&lt;li&gt;the browser opens to the login page first&lt;/li&gt;
&lt;li&gt;after logging in, you can access the customer support workspace&lt;/li&gt;
&lt;li&gt;changes to the Vue source continue to sync into the React output&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;this step verifies whether the generated output can run independently&lt;/li&gt;
&lt;li&gt;in a hybrid project, Vue source and React output exist in parallel but serve different roles&lt;/li&gt;
&lt;li&gt;treat the React output as generated artifacts for validation, not as the main source to edit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success criteria
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm run dev&lt;/code&gt; launches successfully&lt;/li&gt;
&lt;li&gt;the app navigates from login into the business interface&lt;/li&gt;
&lt;li&gt;source edits continue to reflect in the generated output&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5: Complete the business validation
&lt;/h2&gt;

&lt;p&gt;Once the app is running, validate it using this flow:&lt;/p&gt;

&lt;h3&gt;
  
  
  What you should be able to do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;sign in from the login page and enter the system&lt;/li&gt;
&lt;li&gt;open Dashboard, Tickets, Customers, KnowledgeBase, SlaBoard, and Settings pages&lt;/li&gt;
&lt;li&gt;filter, switch, and view ticket details in the ticket list&lt;/li&gt;
&lt;li&gt;view risk information on the customer page and observe state updates&lt;/li&gt;
&lt;li&gt;see risk status changes on the SLA board&lt;/li&gt;
&lt;li&gt;browse and search knowledge base content&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What to pay attention to
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;whether session state drives login and route guards correctly&lt;/li&gt;
&lt;li&gt;whether ticket filters refresh the list as expected&lt;/li&gt;
&lt;li&gt;whether activity records update when ticket actions occur&lt;/li&gt;
&lt;li&gt;whether SLA board data updates after &lt;code&gt;slaConfig&lt;/code&gt; changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Troubleshooting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;if the app returns to login after signing in, check route guards and session state first&lt;/li&gt;
&lt;li&gt;if list filters do not work, verify the filter state is written correctly to the store&lt;/li&gt;
&lt;li&gt;if the activity stream does not update, confirm the action calls the correct mock API&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success criteria
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;core flows for login, routing, filtering, details, SLA, and knowledge base all work&lt;/li&gt;
&lt;li&gt;you can clearly explain which state and actions each page depends on&lt;/li&gt;
&lt;li&gt;you have completed a full validation cycle from Vue source to React output&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This example is not about memorizing the file tree; it is about following the steps to complete a real migration cycle.&lt;/p&gt;

&lt;p&gt;If you complete clone, install, build, launch, and validate in that order, you have established the minimum VuReact workflow: get the build working first, then get the generated output running, then verify it through business flows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix: Troubleshooting references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;routing errors: &lt;a href="https://vureact.top/en/guide/router-adaptation.html" rel="noopener noreferrer"&gt;Router Adaptation Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;build warning guidance: &lt;a href="https://vureact.top/en/guide/specification.html" rel="noopener noreferrer"&gt;Compilation Specification&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;report issues:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/vureact-js/core/issues" rel="noopener noreferrer"&gt;Compiler Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vureact-js/vureact-router/issues" rel="noopener noreferrer"&gt;Router Issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>vue</category>
    </item>
    <item>
      <title>Vue to React Migration in Action: Real CRM Admin Case</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Fri, 12 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/vue-to-react-migration-in-action-real-crm-admin-case-5257</link>
      <guid>https://dev.to/smirk9581/vue-to-react-migration-in-action-real-crm-admin-case-5257</guid>
      <description>&lt;p&gt;This is a hands-on migration walkthrough designed to take you from a standard &lt;strong&gt;Vue 3 + Vue Router&lt;/strong&gt; admin project to a complete VuReact migration cycle.&lt;/p&gt;

&lt;p&gt;In this guide, you will learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to clone and install the example repository&lt;/li&gt;
&lt;li&gt;how to locate the key migration files through the project structure&lt;/li&gt;
&lt;li&gt;how to run the build and inspect the generated React output&lt;/li&gt;
&lt;li&gt;how to start the generated application and verify business flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try it online first, use the links below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/vureact-js/example-crm-admin-backend" rel="noopener noreferrer"&gt;https://github.com/vureact-js/example-crm-admin-backend&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live demo: &lt;a href="https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master" rel="noopener noreferrer"&gt;https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Preview: &lt;a href="https://r862dm-5173.csb.app" rel="noopener noreferrer"&gt;https://r862dm-5173.csb.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project structure overview
&lt;/h2&gt;

&lt;p&gt;Start by getting a high-level view of the admin project layout. The source tree looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crm-admin-backend/
├─ package.json
├─ vureact.config.ts
├─ vite.config.ts
├─ index.html
├─ public/
│  ├─ config.js
│  ├─ logo.png
│  └─ File
├─ git-shells/
│  ├─ git-sync-hub.sh
│  └─ git-sync-hub.en.sh
└─ src/
   ├─ main.ts
   ├─ App.vue
   ├─ styles/
   │  └─ app.scss
   ├─ data/
   │  ├─ mock.ts
   │  └─ mock-api.ts
   ├─ components/
   │  ├─ CustomerTable.vue
   │  ├─ ThemeCard.vue
   │  ├─ FilterBar.vue
   │  └─ ...
   ├─ pages/
   │  ├─ Dashboard.vue
   │  ├─ Customers.vue
   │  ├─ LeadsPipeline.vue
   │  ├─ TasksBoard.vue
   │  ├─ NotificationsCenter.vue
   │  ├─ ApprovalsCenter.vue
   │  ├─ Settings.vue
   │  └─ auth/
   │     ├─ Login.vue
   │     └─ Register.vue
   └─ router/
      ├─ index.ts
      └─ routes.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The files you should focus on first are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/main.ts&lt;/code&gt; — it controls how the source app entry is compiled into a React entry&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/router/index.ts&lt;/code&gt; — it determines how routing is wired into VuReact’s adapter layer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/data/mock-api.ts&lt;/code&gt; — it drives the simulated backend state changes used by the demo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/pages/&lt;/code&gt; — the pages here represent the main business flows you’ll verify&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Clone the repo and install dependencies
&lt;/h2&gt;

&lt;p&gt;Clone the repository and install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/vureact-js/example-crm-admin-backend.git
&lt;span class="nb"&gt;cd &lt;/span&gt;crm-admin-backend
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, make sure the &lt;code&gt;package.json&lt;/code&gt; scripts include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vr:watch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vureact watch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vr:build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vureact build"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This is a normal admin project, so it’s ideal for running the full source → output → launch → validation workflow.&lt;/li&gt;
&lt;li&gt;Unlike mixed Vue/React projects, this example is best for observing routing, pages, and state interactions in the generated React output.&lt;/li&gt;
&lt;li&gt;If installation fails, first check your Node.js version, npm setup, and network access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success criteria
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt; completes without blocking errors&lt;/li&gt;
&lt;li&gt;the repository root recognizes &lt;code&gt;vureact.config.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;you can proceed to &lt;code&gt;npm run vr:build&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Run a full build cycle
&lt;/h2&gt;

&lt;p&gt;Run a complete build first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run vr:build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to keep seeing updated output while editing source files, start watch mode instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run vr:watch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What to expect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;build statistics appear in the console&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;.vureact/react-app&lt;/code&gt; directory is generated at the project root&lt;/li&gt;
&lt;li&gt;the produced React output preserves a structure similar to the original Vue source&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;this step is about verifying the compiler can consistently generate the output, not about checking the UI yet&lt;/li&gt;
&lt;li&gt;if the output directory doesn’t appear, first review &lt;code&gt;vureact.config.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the project includes common admin patterns like routing, forms, lists, and dashboards, so a successful build makes later validation much clearer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Troubleshooting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;if the build fails, inspect the source for syntax or configuration issues&lt;/li&gt;
&lt;li&gt;if the output folder is missing, confirm the command ran from the project root&lt;/li&gt;
&lt;li&gt;if watch mode doesn’t sync, verify the watcher process is still running&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success criteria
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.vureact/react-app&lt;/code&gt; is generated successfully&lt;/li&gt;
&lt;li&gt;repeated runs of &lt;code&gt;npm run vr:build&lt;/code&gt; produce stable output&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Understand the key files
&lt;/h2&gt;

&lt;p&gt;This step helps you identify the entry points to watch during migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Routing entry
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;src/router/index.ts&lt;/code&gt; is one of the most important files. It handles route guards, page transitions, and the adapter entry, and it is often the first place to check during validation.&lt;/p&gt;

&lt;p&gt;When route adaptation is enabled, the config usually points explicitly to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;configFile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/router/index.ts&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Business state entry
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;src/data/mock-api.ts&lt;/code&gt; and &lt;code&gt;src/data/mock.ts&lt;/code&gt; define the demo state and actions for the backend scenario. Understanding these files makes it much easier to follow page interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Page entry points
&lt;/h3&gt;

&lt;p&gt;The main business validation surface lives under &lt;code&gt;src/pages/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Dashboard.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Customers.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LeadsPipeline.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TasksBoard.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NotificationsCenter.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ApprovalsCenter.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Settings.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth/Login.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth/Register.vue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;review routing first, then state, then pages&lt;/li&gt;
&lt;li&gt;for admin-style projects, issues are often caused by page navigation, guards, or state update flow rather than a single component&lt;/li&gt;
&lt;li&gt;if you can clearly explain which page reads which state and which actions update it, validation becomes straightforward&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: Start the generated React app
&lt;/h2&gt;

&lt;p&gt;Open the generated React project and start the dev server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; .vureact/react-app
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What to expect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vite dev server starts successfully&lt;/li&gt;
&lt;li&gt;the browser opens to the login page first&lt;/li&gt;
&lt;li&gt;after login, you can access the CRM main interface&lt;/li&gt;
&lt;li&gt;changes to the Vue source continue to sync into the React output&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key points
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;this step verifies that the generated output can run independently&lt;/li&gt;
&lt;li&gt;for a standard admin app, routing and page interaction are the first things to confirm&lt;/li&gt;
&lt;li&gt;treat the React output as generated artifacts for validation, not as the primary source to edit directly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success criteria
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm run dev&lt;/code&gt; launches successfully&lt;/li&gt;
&lt;li&gt;the app navigates from login into the business interface&lt;/li&gt;
&lt;li&gt;source edits continue to reflect in the generated output&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5: Complete the business validation
&lt;/h2&gt;

&lt;p&gt;Once the app is running, validate it using the following flow:&lt;/p&gt;

&lt;h3&gt;
  
  
  What you should be able to do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;sign in from the login page and enter the system&lt;/li&gt;
&lt;li&gt;open Dashboard, Customers, LeadsPipeline, TasksBoard, NotificationsCenter, ApprovalsCenter, and Settings pages&lt;/li&gt;
&lt;li&gt;perform filtering, keyword search, and single-item actions in the notifications center&lt;/li&gt;
&lt;li&gt;create, approve, reject, and review history in the approvals center&lt;/li&gt;
&lt;li&gt;observe approval updates in the leads pipeline&lt;/li&gt;
&lt;li&gt;observe blocking and collaboration notifications on the task board&lt;/li&gt;
&lt;li&gt;see summary data update on the dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What to pay attention to
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;whether route guards allow the login page but block business pages when appropriate&lt;/li&gt;
&lt;li&gt;whether actions in &lt;code&gt;mock-api&lt;/code&gt; drive page data changes&lt;/li&gt;
&lt;li&gt;whether lists, boards, and summary widgets update as state changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Troubleshooting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;if the app returns to login after signing in, check route guards and session state first&lt;/li&gt;
&lt;li&gt;if data does not refresh, confirm the page is calling the correct &lt;code&gt;mock-api&lt;/code&gt; functions&lt;/li&gt;
&lt;li&gt;if a board does not update, verify the state is written correctly and subscribed by the page&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success criteria
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;core flows for login, routing, notifications, approvals, leads, tasks, and dashboard all work&lt;/li&gt;
&lt;li&gt;you can clearly explain which state and actions each page depends on&lt;/li&gt;
&lt;li&gt;you have completed a full validation cycle from Vue source to React output&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This example is not about memorizing the folder tree; it is about following a practical step-by-step workflow to run an admin project from source through validation.&lt;/p&gt;

&lt;p&gt;If you complete clone, install, build, launch, and validate in that order, you have completed the standard VuReact migration workflow: get the build working first, then get the generated output running, then verify it through business flows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix: Troubleshooting references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Routing errors: &lt;a href="https://vureact.top/en/guide/router-adaptation.html" rel="noopener noreferrer"&gt;Router Adaptation Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Build warning guidance: &lt;a href="https://vureact.top/en/guide/specification.html" rel="noopener noreferrer"&gt;Compilation Specification&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Report issues:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/vureact-js/core/issues" rel="noopener noreferrer"&gt;Compiler Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vureact-js/vureact-router/issues" rel="noopener noreferrer"&gt;Router Issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>vue</category>
    </item>
    <item>
      <title>Vue to React Migration: Why Runtime Wrappers Hit a Ceiling</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Thu, 11 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/vue-to-react-migration-why-runtime-wrappers-hit-a-ceiling-32c9</link>
      <guid>https://dev.to/smirk9581/vue-to-react-migration-why-runtime-wrappers-hit-a-ceiling-32c9</guid>
      <description>&lt;p&gt;If you have ever loved Vue's Composition API and &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; but still had to ship a React codebase because of platform or team constraints, you already know the pain: the code is runnable, but it feels awkward, brittle, and expensive to maintain.&lt;/p&gt;

&lt;p&gt;That tension is exactly what VuReact is designed to solve. VuReact is a compiler toolchain for migrating from Vue to React — and for writing React with Vue 3 syntax.&lt;/p&gt;

&lt;p&gt;In this post, I want to answer a very practical question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can we write with familiar Vue semantics and still end up with clean, idiomatic React?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is yes. And more importantly, the final output is not a pile of wrapper code. It is maintainable React that fits the target ecosystem.&lt;/p&gt;

&lt;p&gt;You do not need to learn a brand-new authoring model, and you do not need to keep bouncing between Vue and React mental models. The examples in this article all have source-to-output references in the &lt;a href="https://vureact.top/en/guide/conversion/overview.html" rel="noopener noreferrer"&gt;semantic conversion guide&lt;/a&gt;, so you can compare the input and the generated result side by side.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Limits of Existing Approaches
&lt;/h2&gt;

&lt;p&gt;Let us start with the reality of migration work.&lt;/p&gt;

&lt;p&gt;Manual rewriting gives you the most control, but the cost is obvious: duplicated business logic, larger test surface area, and a long period where old and new code coexist.&lt;/p&gt;

&lt;p&gt;Many syntax conversion tools are also limited in a similar way. They can do surface-level replacement, recognize &lt;code&gt;v-if&lt;/code&gt;, and mechanically rewrite &lt;code&gt;v-model&lt;/code&gt;, but they cannot understand the full semantic contract behind &lt;code&gt;computed&lt;/code&gt;, scoped slots, or the data flow hidden inside a component design.&lt;/p&gt;

&lt;p&gt;The final output often looks like React, but behaves like a fragile transplant.&lt;/p&gt;

&lt;p&gt;Some teams then ask the obvious next question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if we just let AI rewrite the code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That route looks fast, but it hides a few serious problems. AI is great at generating new code, yet it is not naturally good at preserving the logic, lifecycle assumptions, and edge-case behavior of an existing codebase. It can miss business intent, fail to respect why a particular &lt;code&gt;watch&lt;/code&gt; exists, and still fall short of faithfully mapping Vue's reactivity model into React.&lt;/p&gt;

&lt;p&gt;Single-pass generation is useful. But when the project evolves, it becomes difficult to safely patch or maintain code that was produced as a black box. And because AI output can vary from prompt to prompt, the hidden cost of long-term maintainability becomes very real.&lt;/p&gt;

&lt;p&gt;Another common path is a dual-runtime bridge between Vue and React. That can work for a while, but the bundle weight, debugging complexity, and mental overhead all go up. More importantly, that is not a true migration. It is a long-term coexistence strategy.&lt;/p&gt;

&lt;p&gt;So the real problem is not whether cross-framework conversion is possible. It is whether it can be done in a way that is stable, controllable, and maintainable over time.&lt;/p&gt;

&lt;p&gt;That is the core problem VuReact is trying to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  How VuReact Approaches It
&lt;/h2&gt;

&lt;p&gt;VuReact is built around semantic-aware compilation, not string replacement.&lt;/p&gt;

&lt;p&gt;The difference matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;String replacement only cares whether two snippets look similar.&lt;/li&gt;
&lt;li&gt;Semantic-aware compilation first understands what the source code means, then decides how that meaning should be expressed in React.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the compiler pipeline perspective, VuReact is a full flow: parsing, semantic analysis, transformation, and code generation.&lt;/p&gt;

&lt;p&gt;You write Vue concepts such as template syntax, &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt;, the Composition API, and TypeScript types. The output is standard React code that is readable, predictable, and easy to maintain.&lt;/p&gt;

&lt;p&gt;The value proposition can be summarized in five points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Semantic awareness: it understands templates, directives, lifecycle patterns, and type shapes instead of blindly replacing syntax.&lt;/li&gt;
&lt;li&gt;Incremental migration: you can start with a single module and expand step by step.&lt;/li&gt;
&lt;li&gt;Convention-driven output: it follows a &lt;a href="https://vureact.top/en/guide/specification.html" rel="noopener noreferrer"&gt;compilation specification&lt;/a&gt;, so the generated result is predictable and CI-friendly.&lt;/li&gt;
&lt;li&gt;Full feature alignment: Vue core concepts are mapped into React implementation paths, including scoped style handling during compilation.&lt;/li&gt;
&lt;li&gt;Smart dependency collection: reactive dependencies are traced and analyzed automatically to generate precise React Hook dependency arrays.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most importantly, the output is &lt;strong&gt;pure React&lt;/strong&gt;. It does not depend on a Vue runtime, and it does not hide Vue inside a React container. That is what makes it suitable for long-term maintenance, not just demos.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Translation Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;The easiest way to understand VuReact is to look at the actual semantic mappings.&lt;/p&gt;

&lt;p&gt;The point is not whether the output "looks like React." The real question is whether the core Vue semantics are faithfully mapped into a standard React implementation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The code below is intentionally simplified to focus on the conversion logic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Default Slot &lt;code&gt;&amp;lt;slot&amp;gt;&lt;/code&gt; → React &lt;code&gt;props.children&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Vue Code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Child.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Parent usage --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Child&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Order Overview&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Child&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  VuReact compiled React code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Child.tsx&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IChildProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&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;Child&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;IChildProps&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;section&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&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;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Child&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Parent usage&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Child&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Order Overview&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&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="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;Child&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;From this example, you can clearly see that Vue's default slot is not "guessed and changed", but explicitly compiled into React's &lt;code&gt;children&lt;/code&gt;. This aligns with the official semantic mapping documentation: slot outlets are mapped to React's most native content distribution mechanism.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 For more details, see the official documentation &lt;a href="https://vureact.top/en/guide/semantic-comparison/template/slot.html" rel="noopener noreferrer"&gt;Template Semantic Mapping - Slots&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Scoped Slot → React Function &lt;code&gt;props.children()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Vue Code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- List.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;v-for=&lt;/span&gt;&lt;span class="s"&gt;"(item, i) in props.items"&lt;/span&gt; &lt;span class="na"&gt;:key=&lt;/span&gt;&lt;span class="s"&gt;"item.id"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;:item=&lt;/span&gt;&lt;span class="s"&gt;"item"&lt;/span&gt; &lt;span class="na"&gt;:index=&lt;/span&gt;&lt;span class="s"&gt;"i"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Parent usage --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;List&lt;/span&gt; &lt;span class="na"&gt;:items=&lt;/span&gt;&lt;span class="s"&gt;"users"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;template&lt;/span&gt; &lt;span class="na"&gt;v-slot=&lt;/span&gt;&lt;span class="s"&gt;"slotProps"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;{{ slotProps.index + 1 }}. {{ slotProps.item.name }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/List&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  VuReact compiled React code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// List.tsx&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IListProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;slotProps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&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;List&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;IListProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&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;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&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;children&lt;/span&gt;&lt;span class="p"&gt;?.({&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&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;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;List&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Parent usage&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;List&lt;/span&gt; 
  &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;slotProps&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="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="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;slotProps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt;. &lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;slotProps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="si"&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;
  &lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;List&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;This is what I consider VuReact's most compelling capability. Scoped slots are essentially a mechanism for "child components to pass rendering data back to the parent". VuReact doesn't flatten them crudely; instead, it compiles them into parameterized &lt;code&gt;children&lt;/code&gt; functions, preserving the data flow semantics completely.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 For more details, see the official documentation &lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-slot.html" rel="noopener noreferrer"&gt;Template Semantic Mapping - v-slot&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;computed()&lt;/code&gt; → &lt;code&gt;useComputed()&lt;/code&gt;, &lt;code&gt;defineEmits()&lt;/code&gt; → &lt;code&gt;props.onXxx()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Vue Code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineEmits&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update:name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&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="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;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;99&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;totalPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&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;submit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update:name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&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="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  VuReact compiled React code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useReactive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useComputed&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;@vureact/runtime-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ICompProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;onUpdateName&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// ... component wrapper omitted&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;useReactive&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;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;99&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;totalPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useComputed&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&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;submit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdateName&lt;/span&gt;&lt;span class="p"&gt;?.(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdateName&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code block contains two key transformations. First, &lt;code&gt;computed&lt;/code&gt; is compiled into &lt;code&gt;useComputed&lt;/code&gt;, preserving dependency tracking and caching semantics. Second, &lt;code&gt;update:name&lt;/code&gt; inside &lt;code&gt;defineEmits&lt;/code&gt; is mapped to React's &lt;code&gt;onUpdateName&lt;/code&gt; callback. The former addresses "how reactivity lands in React", and the latter addresses "how component communication lands in React".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 For more details, see the official documentation &lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-emits.html" rel="noopener noreferrer"&gt;Script Semantic Mapping - defineEmits&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;&amp;lt;style scoped&amp;gt;&lt;/code&gt; → &lt;code&gt;data-css-{hash}&lt;/code&gt; Scoped Styles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Vue Code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"parent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"global-class"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Global Class&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"deep-btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Deeply Nested Component&lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;scoped&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.parent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#e5e5e5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;:global(.global-class)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.parent&lt;/span&gt; &lt;span class="nd"&gt;:deep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.deep-btn&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&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;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  VuReact compiled React code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./card-xyz1234.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ... component wrapper omitted&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"parent"&lt;/span&gt; &lt;span class="na"&gt;data-css-xyz1234&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;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"global-class"&lt;/span&gt; &lt;span class="na"&gt;data-css-xyz1235&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Global Class&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"deep-btn"&lt;/span&gt; &lt;span class="na"&gt;data-css-xyz1234&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Deeply Nested Component&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&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;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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 css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* card-xyz1234.css */&lt;/span&gt;
&lt;span class="nc"&gt;.parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-xyz1234&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#e5e5e5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;.global-class&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-xyz1234&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.deep-btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&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;Many migration tools start to lose fidelity at the styling layer, especially with &lt;strong&gt;scoped / deep selectors&lt;/strong&gt;. But VuReact compiles &lt;code&gt;&amp;lt;style scoped&amp;gt;&lt;/code&gt; into a CSS file with scoped identifiers and injects &lt;code&gt;data-css-{hash}&lt;/code&gt; into corresponding DOM nodes. This means the style isolation you depend on in Vue remains valid in React.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 For more details, see the official documentation &lt;a href="https://vureact.top/en/guide/semantic-comparison/style/scoped.html" rel="noopener noreferrer"&gt;Style Semantic Mapping - scoped&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5. &lt;code&gt;defineExpose&lt;/code&gt; → React &lt;code&gt;forwardRef&lt;/code&gt; + &lt;code&gt;useImperativeHandle&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Vue Code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="c1"&gt;// @vr-name: Child&lt;/span&gt;
 &lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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="p"&gt;;&lt;/span&gt;

 &lt;span class="nf"&gt;defineExpose&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;increment&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  VuReact compiled React code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;forwardRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useImperativeHandle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useVRef&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;@vureact/runtime-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IComponentProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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;Child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;forwardRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;IComponentProps&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;expose&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useVRef&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;increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;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="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;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="nf"&gt;useImperativeHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expose&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="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;increment&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;&amp;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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Vue parent accessing &lt;code&gt;defineExpose&lt;/code&gt; content → React parent &lt;code&gt;ref.current&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Vue, the parent component accesses child-exposed content via &lt;code&gt;ref&lt;/code&gt; and &lt;code&gt;expose&lt;/code&gt;. In React, VuReact compiles this to &lt;code&gt;useRef&lt;/code&gt; + &lt;code&gt;ref.current&lt;/code&gt; access, forming a closed loop with the &lt;code&gt;defineExpose&lt;/code&gt; handling above.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Vue Code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Child&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"childRef"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// @vr-name: Parent&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="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="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;childRef&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="nf"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Access child-exposed content&lt;/span&gt;
  &lt;span class="nx"&gt;childRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;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="c1"&gt;// 0&lt;/span&gt;
  &lt;span class="nx"&gt;childRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Call child method, count becomes +1&lt;/span&gt;
  &lt;span class="nx"&gt;childRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;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="c1"&gt;// 1&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  VuReact compiled React code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useMounted&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;@vureact/runtime-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;childRef&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="nf"&gt;useMounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Access child-exposed content&lt;/span&gt;
    &lt;span class="nx"&gt;childRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;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="c1"&gt;// 0&lt;/span&gt;
    &lt;span class="nx"&gt;childRef&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;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Call child method, count becomes +1&lt;/span&gt;
    &lt;span class="nx"&gt;childRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;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="c1"&gt;// 1&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="nc"&gt;Child&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;childRef&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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Parent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is another ultimate highlight of VuReact: Vue's &lt;code&gt;defineExpose&lt;/code&gt; is handled as React's &lt;code&gt;forwardRef&lt;/code&gt; and &lt;code&gt;useImperativeHandle&lt;/code&gt;. VuReact keeps the exposed object structure unchanged; the exposed &lt;code&gt;ref&lt;/code&gt; object still retains the &lt;code&gt;.value&lt;/code&gt; access style, consistent with Vue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 For more details, see the official documentation &lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-expose.html" rel="noopener noreferrer"&gt;Script Semantic Mapping - defineExpose&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Looking at these five points together, you'll notice a common characteristic: VuReact does not do "superficially similar" replacements. Instead, it delivers &lt;strong&gt;semantically equivalent implementations across three dimensions: template, script, and style&lt;/strong&gt;. That's the real reason it can be used in real engineering projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters in the AI Era
&lt;/h2&gt;

&lt;p&gt;People often ask: if AI is so powerful now, why do we still need a compiler?&lt;/p&gt;

&lt;p&gt;My answer is simple: AI is for exploration, and the compiler is for certainty.&lt;/p&gt;

&lt;p&gt;In migration work, uncertainty is the enemy. Pure AI rewriting can be fast, but the output may shift with the prompt. A pure rules engine is stable, but not flexible enough. A semantic compiler gives us the middle ground: deterministic output with room for higher-level automation.&lt;/p&gt;

&lt;p&gt;That means AI and VuReact are not competing tools. They are complementary.&lt;/p&gt;

&lt;p&gt;VuReact gives you a reliable base. AI can then help with refactoring, naming cleanup, structural extraction, and test generation on top of that base.&lt;/p&gt;

&lt;p&gt;For teams migrating a real codebase, that is much more realistic than asking AI to replace everything in one pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Projects, Not Just a Concept
&lt;/h2&gt;

&lt;p&gt;VuReact is already running in two real backend-oriented projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A standard TypeScript + Vue + Vite + Vue Router admin backend.&lt;/li&gt;
&lt;li&gt;A mixed Vue/React project that uses Ant Design and Zustand in a collaborative workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not demo-only toy examples. They are online, inspectable projects with real implementation details.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Online demo: &lt;a href="https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master" rel="noopener noreferrer"&gt;CRM admin backend&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Online demo: &lt;a href="https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true" rel="noopener noreferrer"&gt;Customer support hub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to see how the migration strategy plays out in a real project, I also recommend checking the follow-up case studies linked from the project site.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Get Started
&lt;/h2&gt;

&lt;p&gt;You can start with a very lightweight path.&lt;/p&gt;

&lt;p&gt;First, install the compiler in an existing Vue 3 project or in a demo repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; @vureact/compiler-core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then read the &lt;a href="https://vureact.top/en/guide/introduction.html" rel="noopener noreferrer"&gt;quick start guide&lt;/a&gt; and run through the smallest possible example. The goal of that first pass is not speed. It is to build confidence around what gets converted cleanly and what needs a convention.&lt;/p&gt;

&lt;p&gt;Next, pick a small component with a clear boundary and verify three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the generated code readable?&lt;/li&gt;
&lt;li&gt;Is the conversion cost acceptable?&lt;/li&gt;
&lt;li&gt;Does the team feel comfortable maintaining the result?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are a tech lead, this is easier to manage because the migration scope is explicit, the progress is measurable, and the return on effort is visible.&lt;/p&gt;

&lt;p&gt;If you are a front-end developer, it is easier to get moving because you can keep writing with familiar Vue mental models while producing standard React.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;https://github.com/vureact-js/core&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;I have always believed that the end goal of cross-framework development is not to make you memorize more syntax. It is to let you express ideas in a familiar way and deliver them safely into the target ecosystem.&lt;/p&gt;

&lt;p&gt;That is what VuReact is built for: taking Vue semantics and generating maintainable React.&lt;/p&gt;

&lt;p&gt;If you want to take the next step, I would suggest this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the semantic mapping guide.&lt;/li&gt;
&lt;li&gt;Try the online demos to validate the actual experience.&lt;/li&gt;
&lt;li&gt;Inspect the GitHub repo and documentation for the implementation details.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the AI agent era, the strongest combination is not "AI alone." It is "compiler certainty + AI flexibility." When those two work together, teams can move faster with less risk.&lt;/p&gt;

&lt;p&gt;Official site: &lt;a href="https://vureact.top/en" rel="noopener noreferrer"&gt;vureact.top&lt;/a&gt; | &lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master" rel="noopener noreferrer"&gt;CRM demo&lt;/a&gt; | &lt;a href="https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true" rel="noopener noreferrer"&gt;Customer support demo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>Vue to React: Stop Treating Migration Like a Toy Problem</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Wed, 10 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/vue-to-react-stop-treating-migration-like-a-toy-problem-42d2</link>
      <guid>https://dev.to/smirk9581/vue-to-react-stop-treating-migration-like-a-toy-problem-42d2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Vue-to-React migration is not a game of "can it run?" The real question is whether the final result is pure React, semantically faithful, and maintainable enough to enter a real engineering workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vue to React has never been a fake problem. The two ecosystems are not as unrelated as Java and Python, but they are still distinct enough that migration is a real engineering task rather than a simple search-and-replace exercise.&lt;/p&gt;

&lt;p&gt;What is truly misleading is not the migration goal itself. It is the two long-running shortcuts that have confused the field:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runtime wrappers that make it look like you migrated&lt;/li&gt;
&lt;li&gt;half-finished conversion tools that claim to solve everything with "50% automated conversion"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those approaches may be enough for demos, but they do not answer the hard questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Will the final product be pure React?&lt;/li&gt;
&lt;li&gt;Will semantic fidelity survive?&lt;/li&gt;
&lt;li&gt;Can the result be verified, reviewed, and maintained in a real workflow?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why the Wrong Routes Poison the Field
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Runtime wrappers create a false sense of completion
&lt;/h3&gt;

&lt;p&gt;Runtime wrapper solutions often look impressive in the first few minutes. Components mount, pages render, and basic interaction works. But the real question is not whether the demo runs.&lt;/p&gt;

&lt;p&gt;The real question is whether you actually migrated anything.&lt;/p&gt;

&lt;p&gt;If the final output still depends on Vue runtime behavior, or if React only exists as a shell around a Vue container, then the team has not really landed on React. It has only created a more complicated dual-runtime structure.&lt;/p&gt;

&lt;p&gt;That leads to predictable problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debugging becomes harder because the failure could be on the Vue side, the React side, or the bridge itself&lt;/li&gt;
&lt;li&gt;performance becomes harder to measure because two runtimes are stacked together&lt;/li&gt;
&lt;li&gt;team collaboration slows down because everyone must understand two mental models at once&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Short term convenience, long term debugging black hole.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Half-finished converters are dangerous in a different way
&lt;/h3&gt;

&lt;p&gt;These tools are often marketed as "90% automated" or "50% automated," but in enterprise codebases the missing 10% or 50% is exactly where the real complexity lives.&lt;/p&gt;

&lt;p&gt;The hard parts are not &lt;code&gt;class&lt;/code&gt; to &lt;code&gt;className&lt;/code&gt;. The hard parts are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;slot&lt;/code&gt; and &lt;code&gt;v-slot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;defineEmits&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v-model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;watch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scoped&lt;/code&gt; styles&lt;/li&gt;
&lt;li&gt;component-boundary semantics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those pieces lose fidelity, the remaining automation mostly becomes a pretense of productivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Field Gets a Bad Reputation
&lt;/h2&gt;

&lt;p&gt;The bigger danger is not that one tool fails. It is that these tools produce a shared market memory.&lt;/p&gt;

&lt;p&gt;After enough broken demos, the market starts to believe:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Vue to React? It is all just toy tooling."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a severe problem, because it shifts the evaluation criteria away from engineering reality and toward shallow demo success.&lt;/p&gt;

&lt;p&gt;From that point on, teams stop asking whether a solution is semantically correct or operationally maintainable. They only ask whether it can make a proof-of-concept look alive.&lt;/p&gt;

&lt;p&gt;That is exactly the wrong standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Right Standard Should Have Four Baselines
&lt;/h2&gt;

&lt;p&gt;If we want a serious Vue-to-React strategy, it should satisfy at least these four requirements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The final output must be pure React.&lt;/li&gt;
&lt;li&gt;The conversion must be semantic, not just textual.&lt;/li&gt;
&lt;li&gt;The process must be gradual and verifiable.&lt;/li&gt;
&lt;li&gt;The output must be suitable for real engineering workflows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a solution cannot do those things, it should not be treated as a real migration path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Compile-Time Is the Only Serious Route
&lt;/h2&gt;

&lt;p&gt;If the goal is to fully leave Vue behind and adopt React, runtime solutions create an uncomfortable middle state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the code is still authored in Vue&lt;/li&gt;
&lt;li&gt;the bundle already contains React&lt;/li&gt;
&lt;li&gt;the team is now responsible for two runtime models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VuReact takes the opposite route:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compile first&lt;/li&gt;
&lt;li&gt;validate the result&lt;/li&gt;
&lt;li&gt;expand gradually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not just a different implementation choice. It is a different migration philosophy.&lt;/p&gt;

&lt;p&gt;The reason it works better is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the output is pure React&lt;/li&gt;
&lt;li&gt;the semantics are preserved at the source level&lt;/li&gt;
&lt;li&gt;the artifacts are reviewable and testable&lt;/li&gt;
&lt;li&gt;the migration can be introduced batch by batch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Evidence Chain
&lt;/h2&gt;

&lt;p&gt;VuReact does not rely on slogans. It makes the translation visible and inspectable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Props, emits, and &lt;code&gt;v-model&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Vue component contracts are explicitly mapped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;defineProps&lt;/code&gt; becomes React props typing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defineEmits&lt;/code&gt; becomes callback props such as &lt;code&gt;onXxx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v-model:name&lt;/code&gt; becomes the standard &lt;code&gt;name + onUpdateName&lt;/code&gt; pair&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the contract understandable to React developers while preserving the intent of the original Vue component API.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ref&lt;/code&gt;, &lt;code&gt;watch&lt;/code&gt;, and &lt;code&gt;defineExpose&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;These are the places where many conversion tools fall apart.&lt;/p&gt;

&lt;p&gt;VuReact maps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ref&lt;/code&gt; to &lt;code&gt;useVRef&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;watch&lt;/code&gt; to &lt;code&gt;useWatch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defineExpose&lt;/code&gt; to &lt;code&gt;forwardRef&lt;/code&gt; plus &lt;code&gt;useImperativeHandle&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a semantic rewrite, not a shallow JSX rewrite.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slots and scoped styles
&lt;/h3&gt;

&lt;p&gt;Slots are not just "children in disguise."&lt;/p&gt;

&lt;p&gt;VuReact maps default slots to &lt;code&gt;props.children&lt;/code&gt; and scoped slots to function children, preserving the data flow that Vue developers rely on.&lt;/p&gt;

&lt;p&gt;For styles, VuReact also keeps the important pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;scoped&lt;/code&gt; styles become hashed CSS with &lt;code&gt;data-css-{hash}&lt;/code&gt; markers&lt;/li&gt;
&lt;li&gt;CSS Modules preserve class mapping through module imports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means the generated React output still supports real component isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Practical Choice
&lt;/h2&gt;

&lt;p&gt;This is why I would draw the line like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you need temporary coexistence, a runtime bridge can be useful.&lt;/li&gt;
&lt;li&gt;If you need real migration, runtime coexistence is not enough.&lt;/li&gt;
&lt;li&gt;If you need pure React output with semantic fidelity and a reviewable workflow, compile-time migration is the serious option.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between "making it work" and "making it maintainable."&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Vue to React migration is not broken. The narrative around it has been broken by bad tools and worse evaluation standards.&lt;/p&gt;

&lt;p&gt;If the industry keeps rewarding tools only for demoability, we will keep producing solutions that look good in videos and collapse in production.&lt;/p&gt;

&lt;p&gt;The standard should be much higher:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pure React output&lt;/li&gt;
&lt;li&gt;semantic preservation&lt;/li&gt;
&lt;li&gt;gradual migration&lt;/li&gt;
&lt;li&gt;engineering-grade verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why compile-time migration is the correct direction.&lt;/p&gt;

&lt;p&gt;VuReact is not trying to sell a story. It is trying to provide a verifiable migration path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Project: &lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;https://github.com/vureact-js/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://vureact.top/en" rel="noopener noreferrer"&gt;https://vureact.top/en&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>Vue-to-React Migration Deep Dive: Vuera, Veaury, and VuReact</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Mon, 08 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/vue-to-react-migration-deep-dive-vuera-veaury-and-vureact-12bo</link>
      <guid>https://dev.to/smirk9581/vue-to-react-migration-deep-dive-vuera-veaury-and-vureact-12bo</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cross-framework migration is not a syntax substitution problem. It is a systems problem involving runtime models, team mental models, and long-term maintenance costs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the evolution of frontend engineering, Vue-to-React migration has never been a simple "rewrite the syntax" task. It is a systemic migration that involves runtime models, team habits, engineering foundations, and long-term maintenance cost. Whether the motivation comes from architecture consolidation or ecosystem evolution, one question keeps showing up:&lt;/p&gt;

&lt;p&gt;How do you move a mature Vue codebase into React without turning the project into a high-risk rewrite?&lt;/p&gt;

&lt;p&gt;This article compares three representative approaches to Vue/React interoperability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vuera&lt;/li&gt;
&lt;li&gt;Veaury&lt;/li&gt;
&lt;li&gt;VuReact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real question is not "can it run?"&lt;/p&gt;

&lt;p&gt;The real question is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can it produce maintainable output?&lt;/li&gt;
&lt;li&gt;Can it preserve semantics under pressure?&lt;/li&gt;
&lt;li&gt;Can it support gradual, verifiable migration in a real codebase?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Three Approaches, Three Tradeoffs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vuera: a runtime wrapper from another era
&lt;/h3&gt;

&lt;p&gt;Vuera was one of the earliest cross-framework experiments, and it was relevant in the Vue 2 and React 15/16 era. Its core idea is straightforward: mount the other framework's component instance at runtime and use a container component as an adapter.&lt;/p&gt;

&lt;p&gt;That made historical sense, but it also means the solution lives entirely at runtime. In a modern production environment, especially one based on Vue 3 and React 18, that approach no longer looks like a practical long-term migration strategy.&lt;/p&gt;

&lt;p&gt;It is better understood as a historical reference for runtime wrapping than as a production-ready migration path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Veaury: a modern runtime bridge
&lt;/h3&gt;

&lt;p&gt;Veaury is built for Vue 3 and React 17/18, and it is explicitly designed for coexistence rather than migration. Through APIs such as &lt;code&gt;applyReactInVue&lt;/code&gt; and &lt;code&gt;applyVueInReact&lt;/code&gt;, Vue and React components can reference each other inside the same project, and cross-framework data passing is supported through Context and slot-like mechanisms.&lt;/p&gt;

&lt;p&gt;This is useful when a team needs to temporarily embed existing Vue components in a React project, or vice versa, and accepts the cost of running two ecosystems side by side.&lt;/p&gt;

&lt;p&gt;But it is important to be precise: this is coexistence, not migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  VuReact: a compile-time migration toolchain
&lt;/h3&gt;

&lt;p&gt;VuReact follows a different path.&lt;/p&gt;

&lt;p&gt;It is neither a runtime wrapper nor a dual-engine bridge. It is a compile-time toolchain that compiles Vue 3 SFCs, especially &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt;, into standard React 18+ code with no Vue runtime dependency in the final output.&lt;/p&gt;

&lt;p&gt;If Vuera and Veaury are about making two frameworks coexist, VuReact is about helping teams leave Vue behind and land on React with the lowest possible migration risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Complexity Lives
&lt;/h2&gt;

&lt;p&gt;The key difference between these approaches is not just performance. It is where the complexity ends up.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Vuera&lt;/th&gt;
&lt;th&gt;Veaury&lt;/th&gt;
&lt;th&gt;VuReact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core architecture&lt;/td&gt;
&lt;td&gt;Runtime wrapper around Vue 2 / React 16&lt;/td&gt;
&lt;td&gt;Runtime dual-engine bridge for Vue 3 / React 18&lt;/td&gt;
&lt;td&gt;Compile-time AST-to-AST migration for Vue 3 to React 18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where complexity lives&lt;/td&gt;
&lt;td&gt;Entirely at runtime&lt;/td&gt;
&lt;td&gt;Mostly in the bridge layer&lt;/td&gt;
&lt;td&gt;Moved into compilation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final runtime cost&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Zero Vue runtime cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output readability&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High, generated output is standard React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debugging experience&lt;/td&gt;
&lt;td&gt;Hard&lt;/td&gt;
&lt;td&gt;Still cross-framework&lt;/td&gt;
&lt;td&gt;Native React debugging with clear output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ecosystem integration&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;td&gt;Good for coexistence&lt;/td&gt;
&lt;td&gt;Strong, because the output is pure React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migration posture&lt;/td&gt;
&lt;td&gt;Wrapper-first&lt;/td&gt;
&lt;td&gt;Coexistence-first&lt;/td&gt;
&lt;td&gt;Migration-first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The core conclusion is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VuReact chooses to pay complexity earlier, during compilation, so the final product becomes lighter, cleaner, and easier to verify.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is a much better trade when the end goal is maintainable React, not temporary interoperability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Compile-Time Wins for Real Migration
&lt;/h2&gt;

&lt;p&gt;If the goal is a complete Vue-to-React migration, runtime wrappers tend to create an awkward middle state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code is still authored in Vue&lt;/li&gt;
&lt;li&gt;The bundle already carries React&lt;/li&gt;
&lt;li&gt;The team now has to understand two runtime models&lt;/li&gt;
&lt;li&gt;Debugging becomes harder because failures can come from either side of the bridge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the short term, that can feel convenient. In the long term, it becomes technical debt.&lt;/p&gt;

&lt;p&gt;VuReact is built around the opposite idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compile first&lt;/li&gt;
&lt;li&gt;validate the result&lt;/li&gt;
&lt;li&gt;then expand gradually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives teams a migration path that can be reviewed, tested, and rolled back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence, Not Hype
&lt;/h2&gt;

&lt;p&gt;VuReact does not try to "magically" solve migration. It makes the semantic mapping explicit.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;props&lt;/code&gt;, &lt;code&gt;emits&lt;/code&gt;, and &lt;code&gt;v-model&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Vue component contracts are not just JSX with a different shape. They are explicit semantics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;defineProps&lt;/code&gt; becomes React props typing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defineEmits&lt;/code&gt; becomes callback props such as &lt;code&gt;onXxx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v-model:name&lt;/code&gt; becomes a standard &lt;code&gt;name + onUpdateName&lt;/code&gt; contract&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between a shallow rewrite and a semantic rewrite.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ref&lt;/code&gt;, &lt;code&gt;watch&lt;/code&gt;, and &lt;code&gt;defineExpose&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Reactive state and side effects are where most half-baked tools break.&lt;/p&gt;

&lt;p&gt;VuReact maps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ref&lt;/code&gt; to &lt;code&gt;useVRef&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;watch&lt;/code&gt; to &lt;code&gt;useWatch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defineExpose&lt;/code&gt; to &lt;code&gt;forwardRef&lt;/code&gt; plus &lt;code&gt;useImperativeHandle&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not cosmetic replacements. They are the places where a migration either preserves behavior or quietly breaks it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slots and scoped styles
&lt;/h3&gt;

&lt;p&gt;Slots are another example of why "just make it look like React" is not enough.&lt;/p&gt;

&lt;p&gt;VuReact maps default slots to &lt;code&gt;props.children&lt;/code&gt; and scoped slots to function children, which is much closer to the actual data-flow semantics of Vue slots.&lt;/p&gt;

&lt;p&gt;For styles, VuReact handles both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;scoped&lt;/code&gt; styles through &lt;code&gt;data-css-{hash}&lt;/code&gt; attributes&lt;/li&gt;
&lt;li&gt;CSS Modules through module imports and preserved class mappings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means the final React output still has real component-level style isolation, not just a hand-wavy conversion.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Runtime Tools Still Make Sense
&lt;/h2&gt;

&lt;p&gt;This is not an anti-runtime argument.&lt;/p&gt;

&lt;p&gt;If you need to embed a few existing Vue 3 components inside a React project for a short period, a runtime bridge like Veaury can be a practical choice. It is useful when the team explicitly accepts coexistence as the goal.&lt;/p&gt;

&lt;p&gt;What it is not, however, is a full migration strategy.&lt;/p&gt;

&lt;p&gt;If the goal is long-term maintainability, pure React output, and a clean engineering path, runtime coexistence is usually the wrong endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why VuReact Is the Better Fit for Full Migration
&lt;/h2&gt;

&lt;p&gt;If your team is doing one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;migrating a large Vue 3 codebase in batches&lt;/li&gt;
&lt;li&gt;standardizing on React as the long-term target&lt;/li&gt;
&lt;li&gt;trying to keep the generated output readable and reviewable&lt;/li&gt;
&lt;li&gt;wanting the result to fit directly into the React ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then VuReact is the most production-oriented option among the three.&lt;/p&gt;

&lt;p&gt;It does not promise to erase complexity.&lt;/p&gt;

&lt;p&gt;It moves complexity to the place where it belongs: compile time, where it can be analyzed, tested, and controlled.&lt;/p&gt;

&lt;p&gt;That is a much better engineering trade than hiding complexity inside a runtime wrapper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Vue-to-React migration is still a real problem, but the wrong tools have distorted how people evaluate it.&lt;/p&gt;

&lt;p&gt;If you only ask whether a solution can "run a demo," you will keep rewarding half-finished strategies.&lt;/p&gt;

&lt;p&gt;If you instead ask whether a solution can produce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pure React output&lt;/li&gt;
&lt;li&gt;semantic fidelity&lt;/li&gt;
&lt;li&gt;gradual migration&lt;/li&gt;
&lt;li&gt;testable and reviewable artifacts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then the picture becomes much clearer.&lt;/p&gt;

&lt;p&gt;For temporary coexistence, runtime bridges can be useful.&lt;br&gt;
For full migration, compile-time semantic transformation is the better path.&lt;/p&gt;

&lt;p&gt;That is why I believe VuReact is the most serious engineering answer among the three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Project: &lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;https://github.com/vureact-js/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://vureact.top/en" rel="noopener noreferrer"&gt;https://vureact.top/en&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>Vue to React with VuReact: A Fast Start Guide</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Sat, 06 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/vue-to-react-with-vureact-a-fast-start-guide-oaj</link>
      <guid>https://dev.to/smirk9581/vue-to-react-with-vureact-a-fast-start-guide-oaj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://vureact.top/en" rel="noopener noreferrer"&gt;VuReact&lt;/a&gt; is a compiler toolchain for migrating from Vue to React — and for writing React with Vue 3 syntax. It can compile Vue 3 code into standard, maintainable React, helping you generate equivalent React components from Vue source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this guide, we will walk through a complete Vue 3 project to React project migration with VuReact. By the end, you will understand:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What rules make an SFC compile reliably&lt;/li&gt;
&lt;li&gt;What the output directory looks like after compilation&lt;/li&gt;
&lt;li&gt;How the generated TSX relates to the original SFC&lt;/li&gt;
&lt;li&gt;How the compiler automatically analyzes React hook dependencies&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Create a Vite + Vue project
&lt;/h2&gt;

&lt;p&gt;Start with a standard Vue 3 + TypeScript project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-vite@latest vue-app &lt;span class="nt"&gt;--template&lt;/span&gt; vue-ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted with &lt;code&gt;Install with npm and start now?&lt;/code&gt;, choose &lt;code&gt;No&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You should end up with a project structure similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vue-app/
  public/
  src/
    assets/
    components/
      HelloWorld.vue
    App.vue
    main.ts
    style.css
  index.html
  package.json
  tsconfig.json
  vite.config.ts
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Install VuReact
&lt;/h2&gt;

&lt;p&gt;Move into the project and install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;vue-app
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install the VuReact compiler core:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; @vureact/compiler-core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Configure VuReact
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;vureact.config.ts&lt;/code&gt; in the &lt;code&gt;vue-app&lt;/code&gt; root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// vue-app/vureact.config.ts&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;defineConfig&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;@vureact/compiler-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="c1"&gt;// Input path: Vue files to compile. Single files like 'xxx.vue' are allowed.&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// Exclude Vue entry files to avoid semantic conflicts.&lt;/span&gt;
  &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/main.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Workspace directory for build artifacts and cache.&lt;/span&gt;
    &lt;span class="na"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.vureact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Output directory for the generated React project.&lt;/span&gt;
    &lt;span class="na"&gt;outDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Automatically bootstrap a Vite + React environment.&lt;/span&gt;
    &lt;span class="na"&gt;bootstrapVite&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="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;Except for &lt;code&gt;exclude&lt;/code&gt;, all options can use their defaults.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Write a Vue component
&lt;/h2&gt;

&lt;p&gt;Replace the original &lt;code&gt;HelloWorld.vue&lt;/code&gt; with a counter component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- src/components/HelloWorld.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"counter-card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span class="si"&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;title&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"vureact"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;VuReact&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"vue"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Vue&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"react"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;React&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      (&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;)
    &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"increment"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;+1&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"methods.decrease"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;-1&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;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="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// @vr-name: HelloWorld&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;computed&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;watch&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="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// You can also use defineOptions({ name: 'HelloWorld' })&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineEmits&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;step&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;1&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;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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Step: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;step&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;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="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;emits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update&lt;/span&gt;&lt;span class="dl"&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="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;methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;decrease&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;emits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update&lt;/span&gt;&lt;span class="dl"&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="p"&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;watch&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newVal&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;step&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="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newVal&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="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;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;scoped&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.counter-card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ddd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;.vureact&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#9932cc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.vue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#42b883&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.react&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#61dafb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;style&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;Then update &lt;code&gt;App.vue&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- src/App.vue --&amp;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="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// @vr-name: App&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;HelloWorld&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;./components/HelloWorld.vue&lt;/span&gt;&lt;span class="dl"&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;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;HelloWorld&lt;/span&gt;
    &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Counter component"&lt;/span&gt;
    &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;update=&lt;/span&gt;&lt;span class="s"&gt;"(v) =&amp;gt; &lt;/span&gt;{ console.log(v) }"
  /&amp;gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&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;
  
  
  5. Compile to React
&lt;/h2&gt;

&lt;p&gt;You can compile in either of these ways:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Full or incremental compilation&lt;/span&gt;
npx vureact build

&lt;span class="c"&gt;# Watch mode&lt;/span&gt;
npx vureact watch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or add scripts to &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vr:build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vureact build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vr:watch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vureact watch"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run vr:build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After compilation, the terminal will print relevant build information.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Inspect the output
&lt;/h2&gt;

&lt;p&gt;The generated files are placed under &lt;code&gt;.vureact/react-app&lt;/code&gt;, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vue-app/
  .vureact/
    cache/
    react-app/
      src/
        components/
          HelloWorld.tsx
          HelloWorld-[hash].css
        App.tsx
        index.css
        main.tsx
        style.css
      package.json
      tsconfig.json
      vite.config.ts
      ...
    src/
    vureact.config.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Run the React app
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; .vureact/react-app
npm run &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the styling looks slightly different from the Vue version, that is usually because Vite injects a default &lt;code&gt;index.css&lt;/code&gt; into &lt;code&gt;main.tsx&lt;/code&gt;. Adjusting that file is enough in most cases.&lt;/p&gt;

&lt;p&gt;If you run into issues, check the FAQ in the documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Compare the generated result
&lt;/h2&gt;

&lt;p&gt;Here is a simplified version of the output. The exact hashes and helper names may differ depending on the generated artifact:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useComputed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useVRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useWatch&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;@vureact/runtime-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;memo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useMemo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./HelloWorld-ebf8d8dc.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IHelloWorldProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&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;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&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;HelloWorld&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IHelloWorldProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useVRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useVRef&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;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useComputed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Step: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;step&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;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="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&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="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&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;methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&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="nf"&gt;decrease&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;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="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useWatch&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newVal&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;step&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="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newVal&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"counter-card"&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&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;h1&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&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;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&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;h2&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"vureact"&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;VuReact&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"vue"&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Vue&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"react"&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;React&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        (&lt;span class="si"&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="si"&gt;}&lt;/span&gt;)
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&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;p&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        +1
      &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;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="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;decrease&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        -1
      &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;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;HelloWorld&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 css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.counter-card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ddd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fafafa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.counter-card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.vureact&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#9932cc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.counter-card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.vue&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#42b883&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.counter-card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.react&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-ebf8d8dc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#61dafb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key things to notice
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;@vr-name: Counter&lt;/code&gt; defines the component name.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defineProps&lt;/code&gt; and &lt;code&gt;defineEmits&lt;/code&gt; are converted into TypeScript props types.&lt;/li&gt;
&lt;li&gt;Non-UI components are wrapped in &lt;code&gt;memo&lt;/code&gt; by default.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ref&lt;/code&gt;, &lt;code&gt;computed&lt;/code&gt;, and &lt;code&gt;watch&lt;/code&gt; become runtime adapter APIs such as &lt;code&gt;useVRef&lt;/code&gt;, &lt;code&gt;useComputed&lt;/code&gt;, and &lt;code&gt;useWatch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Template event handlers become React-style &lt;code&gt;onClick&lt;/code&gt; handlers.&lt;/li&gt;
&lt;li&gt;Top-level arrow functions are analyzed and may become &lt;code&gt;useCallback&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Top-level variable declarations are analyzed and may become &lt;code&gt;useMemo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Old &lt;code&gt;ref&lt;/code&gt; or &lt;code&gt;computed&lt;/code&gt; values in JSX are rewritten with &lt;code&gt;.value&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Scoped styles generate hashed CSS files and matching scope attributes on DOM elements.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;For common issues during usage, see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/eslint-rule-conflicts.html" rel="noopener noreferrer"&gt;ESLint rule conflicts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/faq.html" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;By following the steps above, you have completed a full migration flow from a Vue SFC project to a React project.&lt;/p&gt;

&lt;p&gt;At a high level:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a standard Vue + TypeScript project&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;@vureact/compiler-core&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;vureact.config.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Write SFCs using the expected conventions&lt;/li&gt;
&lt;li&gt;Run the compiler from the CLI&lt;/li&gt;
&lt;li&gt;Start the generated React project and verify the output&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;VuReact can handle the following core transformations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue template syntax to React JSX, including &lt;code&gt;v-if&lt;/code&gt;, &lt;code&gt;v-slot&lt;/code&gt;, &lt;code&gt;v-model&lt;/code&gt;, and &lt;code&gt;&amp;lt;slot&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Composition API to React Hooks, such as &lt;code&gt;ref&lt;/code&gt; to &lt;code&gt;useVRef&lt;/code&gt; and &lt;code&gt;computed&lt;/code&gt; to &lt;code&gt;useComputed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Reactive dependency analysis to automatic &lt;code&gt;useCallback&lt;/code&gt; and &lt;code&gt;useMemo&lt;/code&gt; dependency arrays&lt;/li&gt;
&lt;li&gt;Component communication to props typing and event callback mapping&lt;/li&gt;
&lt;li&gt;Style handling to scoped CSS, CSS Modules, and preprocessor compilation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to test the real demos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer support collaboration backend: &lt;a href="https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true" rel="noopener noreferrer"&gt;https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CRM admin backend: &lt;a href="https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master" rel="noopener noreferrer"&gt;https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>VuReact complete guide: a Vue-to-React semantic compilation reference</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Fri, 05 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/vureact-complete-guide-a-vue-to-react-semantic-compilation-reference-3apb</link>
      <guid>https://dev.to/smirk9581/vureact-complete-guide-a-vue-to-react-semantic-compilation-reference-3apb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://vureact.top/en" rel="noopener noreferrer"&gt;VuReact&lt;/a&gt; is a compiler toolchain for migrating from Vue to React — and for writing React with Vue 3 syntax. It supports progressive migration, semantic compilation, zero-runtime overhead, and end-to-end engineering workflows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In frontend migration and cross-framework development, Vue and React are two major ecosystems with clear differences in syntax, API design, reactive models, and rendering behavior. Those differences are exactly what makes Vue-to-React migration difficult for many teams. To reduce learning cost, cut down manual rewrites, and achieve a semantic, low-cost, predictable migration, we compiled this &lt;strong&gt;VuReact complete guide&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article covers three major areas: &lt;strong&gt;template syntax and built-in components, script-level core APIs and logic, and style systems&lt;/strong&gt;. It gives a complete one-to-one mapping between common Vue features and their React equivalents. All examples are taken from real VuReact compilation results, so you can compare them directly and use them as a practical migration reference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Official docs: &lt;a href="https://vureact.top/en" rel="noopener noreferrer"&gt;https://vureact.top/en&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;https://github.com/vureact-js/core&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Template Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vue template syntax to React
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-bind.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-bind&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-for.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-for&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-html-v-text.htmll#v-html-%E2%86%92-react-dangerouslysetinnerhtml" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-html&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-html-v-text.html#v-text-%E2%86%92-react-jsx-expression" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-text&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-if-v-else.html#v-if-%E2%86%92-react-conditional-expression" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-if&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-if-v-else.html#v-if-and-v-else-combination" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-else&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-if-v-else.html#multi-branch-v-else-if-chain" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-else-if&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-memo-v-once.html#v-memo-%E2%86%92-react-usememo-with-dependencies" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-memo&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-memo-v-once.html#v-once-%E2%86%92-react-usememo-with-empty-deps" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-once&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-model.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-model&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-on.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-on&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-show.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-show&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/v-slot.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;v-slot&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/keep-alive.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;KeepAlive&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/suspense.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;Suspense&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/teleport.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;Teleport&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/transition-group.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;TransitionGroup&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/transition.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;Transition&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/is.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;:is&lt;/code&gt; dynamic component to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/template/slot.html" rel="noopener noreferrer"&gt;Vue slot syntax to React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Script Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vue logic-layer APIs to React
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/ref.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;ref&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/reactive.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;reactive&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/computed.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;computed&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/readonly.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;readonly&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/toRef(s).html#toref-%E2%86%92-react-usetovref" rel="noopener noreferrer"&gt;Vue &lt;code&gt;toRef&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/toRef(s).html#torefs-%E2%86%92-react-usetovrefs" rel="noopener noreferrer"&gt;Vue &lt;code&gt;toRefs&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/watch.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;watch&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/watch-effect.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;watchEffect&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/lifecycle.html#onmounted-%E2%86%92-react-usemounted" rel="noopener noreferrer"&gt;Vue &lt;code&gt;onMounted&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/lifecycle.html#onbeforemount-%E2%86%92-react-usebeforemount" rel="noopener noreferrer"&gt;Vue &lt;code&gt;onBeforeMount&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/lifecycle.html#onbeforeupdate-%E2%86%92-react-usebeforeupdate" rel="noopener noreferrer"&gt;Vue &lt;code&gt;onBeforeUpdate&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/lifecycle.html#onupdated-%E2%86%92-react-useupdated" rel="noopener noreferrer"&gt;Vue &lt;code&gt;onUpdated&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/lifecycle.html#onbeforeunmount-%E2%86%92-react-usebeforeunmount" rel="noopener noreferrer"&gt;Vue &lt;code&gt;onBeforeUnmount&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/lifecycle.html#onunmounted-%E2%86%92-react-useunmounted" rel="noopener noreferrer"&gt;Vue &lt;code&gt;onUnmounted&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-props.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;defineProps&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-emits.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;defineEmits&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-model.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;defineModel&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-options.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;defineOptions&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-slots.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;defineSlots&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-expose.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;defineExpose&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/define-async-comp.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;defineAsyncComponent&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/provide-inject.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;provide&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/provide-inject.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;inject&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/use-attrs.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;useAttrs&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/use-template-ref.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;useTemplateRef&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/const-var.html" rel="noopener noreferrer"&gt;Vue constant and variable optimization to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/arrow-function.html" rel="noopener noreferrer"&gt;Vue arrow function optimization to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/auto-deps.html" rel="noopener noreferrer"&gt;Vue automatic dependency collection to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/type-declaration.html" rel="noopener noreferrer"&gt;Vue TS type declarations to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/script-setup.html" rel="noopener noreferrer"&gt;Vue &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/vue-router.html" rel="noopener noreferrer"&gt;Vue Router to React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Style Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vue style system to React
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/style/basic.html" rel="noopener noreferrer"&gt;Vue normal style blocks to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/style/basic.html" rel="noopener noreferrer"&gt;Vue scoped styles to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/style/basic.html" rel="noopener noreferrer"&gt;Vue CSS Modules to React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/style/basic.html" rel="noopener noreferrer"&gt;Vue style preprocessors to React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;This guide is a living reference for VuReact's Vue-to-React semantic compilation. It will continue to evolve as the tool expands and gradually covers more Vue 3 features.&lt;/p&gt;

&lt;p&gt;If you run into a Vue API, directive, scenario, or bug that is not covered yet, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Star the project on &lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open an issue on &lt;a href="https://github.com/vureact-js/core/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Playground
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Customer support collaboration backend: &lt;a href="https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true" rel="noopener noreferrer"&gt;https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CRM admin backend: &lt;a href="https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master" rel="noopener noreferrer"&gt;https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>How does VuReact compile Vue 3 scoped styles to React?</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Thu, 04 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/how-does-vureact-compile-vue-3-scoped-styles-to-react-407p</link>
      <guid>https://dev.to/smirk9581/how-does-vureact-compile-vue-3-scoped-styles-to-react-407p</guid>
      <description>&lt;p&gt;&lt;a href="https://vureact.top/en/guide/introduction.html" rel="noopener noreferrer"&gt;VuReact&lt;/a&gt; is a compiler toolchain for migrating from Vue to React — and for writing React with Vue 3 syntax. In this article, we will look at how Vue SFC &lt;code&gt;&amp;lt;style scoped&amp;gt;&lt;/code&gt; blocks are compiled into React code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before We Start
&lt;/h2&gt;

&lt;p&gt;To keep the examples easy to read, this article follows two simple conventions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All Vue and React snippets focus on core logic only, with full component wrappers and unrelated configuration omitted.&lt;/li&gt;
&lt;li&gt;The discussion assumes you are already familiar with scoped styles in Vue 3 SFCs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Compilation Mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scoped style conversion
&lt;/h3&gt;

&lt;p&gt;VuReact compiles scoped styles into CSS that carries a scope identifier, then injects the corresponding &lt;code&gt;data-css-{hash}&lt;/code&gt; attribute into matching DOM elements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Counter.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Header&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Content&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;scoped&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#e5e5e5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#2a8c5e&lt;/span&gt;&lt;span class="p"&gt;;&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;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&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;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Counter.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./counter-abc1234.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt; &lt;span class="na"&gt;data-css-abc1234&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;p&lt;/span&gt; &lt;span class="na"&gt;data-css-abc1234&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Header&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&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;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt; &lt;span class="na"&gt;data-css-abc1234&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Content&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&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;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;data-css-abc1234&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&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 css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* counter-abc1234.css */&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-abc1234&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#e5e5e5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-abc1234&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#2a8c5e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.content&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-abc1234&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the example shows, Vue &lt;code&gt;&amp;lt;style scoped&amp;gt;&lt;/code&gt; blocks are compiled into CSS files with scope markers, and React DOM elements receive the matching &lt;code&gt;data-css-{hash}&lt;/code&gt; attribute.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scoped attribute rules
&lt;/h3&gt;

&lt;p&gt;The scope attribute is not applied to every selector in the same way. Vue's scoped-style exceptions are preserved through these compilation rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Template elements do not receive scoped attributes.&lt;/li&gt;
&lt;li&gt;Slot content does not receive scoped attributes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Scope isolation principles
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;CSS selector rewriting: &lt;code&gt;.card&lt;/code&gt; becomes &lt;code&gt;.card[data-css-hash]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;DOM attribute injection: matching elements receive the &lt;code&gt;data-css-hash&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;Style isolation: styles apply only to elements that share the same scope marker.&lt;/li&gt;
&lt;li&gt;Collision prevention: component styles remain isolated from each other.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Compilation summary
&lt;/h3&gt;

&lt;p&gt;VuReact's scoped-style compilation shows a complete scoped selector transformation pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;:global()&lt;/code&gt; is unwrapped and emitted as global CSS.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:deep()&lt;/code&gt; is split so the left side keeps the scope marker while the inner selector remains penetrative.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:slotted()&lt;/code&gt; is simplified, with full semantic handling still in progress.&lt;/li&gt;
&lt;li&gt;Pseudo selectors such as &lt;code&gt;:hover&lt;/code&gt;, &lt;code&gt;::before&lt;/code&gt;, and &lt;code&gt;:not()&lt;/code&gt; are preserved with scope added before the pseudo selector.&lt;/li&gt;
&lt;li&gt;Nested selectors work naturally with SCSS/Less-style nesting syntax.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Supported penetrative selectors:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Selector&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:deep()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Scoped on the left, penetrative on the right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:global()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Emits global CSS without scope wrapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:slotted()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;De-structuring handled, full semantics still evolving&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;VuReact keeps Vue's scoped-style isolation semantics while still allowing flexible penetrative selectors where needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/style/scoped.html" rel="noopener noreferrer"&gt;VuReact semantic comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>How does VuReact compile Vue 3 style syntax into React?</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:18:08 +0000</pubDate>
      <link>https://dev.to/smirk9581/how-does-vureact-compile-vue-3-style-syntax-into-react-293e</link>
      <guid>https://dev.to/smirk9581/how-does-vureact-compile-vue-3-style-syntax-into-react-293e</guid>
      <description>&lt;p&gt;&lt;a href="https://vureact.top/en/guide/introduction.html" rel="noopener noreferrer"&gt;VuReact&lt;/a&gt; is a compiler toolchain for migrating from Vue to React — and for writing React with Vue 3 syntax. In this article, we will look at how Vue style syntax such as &lt;code&gt;SCSS&lt;/code&gt; and &lt;code&gt;Less&lt;/code&gt; is compiled into React code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before We Start
&lt;/h2&gt;

&lt;p&gt;To keep the examples easy to read, this article follows two simple conventions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All Vue and React snippets focus on core logic only, with full component wrappers and unrelated configuration omitted.&lt;/li&gt;
&lt;li&gt;The discussion assumes you are already familiar with CSS preprocessor usage.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Compilation Mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;&amp;lt;style lang&amp;gt;&lt;/code&gt; support in SFCs
&lt;/h3&gt;

&lt;p&gt;VuReact supports common CSS preprocessors such as &lt;code&gt;SCSS&lt;/code&gt; and &lt;code&gt;Less&lt;/code&gt; inside Vue SFCs, and compiles them into standard CSS during transformation.&lt;/p&gt;

&lt;h4&gt;
  
  
  SCSS example
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Button.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"scss"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#42b883&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;darken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10%&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="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Button.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./button.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Button&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;button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click me&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;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* button.css */&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#42b883&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;#42b883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the example shows, Vue &lt;code&gt;&amp;lt;style lang="scss"&amp;gt;&lt;/code&gt; blocks are compiled into standard CSS files, and preprocessor syntax is transformed during compilation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Less example
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Card.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card Title&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"less"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
@border-color: #e5e5e5;

.card {
  border: 1px solid @border-color;
  border-radius: 8px;
  padding: 16px;

  .title {
    color: #333;
    font-size: 18px;
  }
}
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Card.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./card.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;h3&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Card Title&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&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;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="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 css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* card.css */&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#e5e5e5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&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;Preprocessor support means VuReact can convert SCSS and Less syntax into standard CSS while preserving the structure of the original styles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preprocessor support highlights
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Syntax conversion: preprocessor syntax is transformed into standard CSS during compilation.&lt;/li&gt;
&lt;li&gt;Variable handling: Less &lt;code&gt;@variable&lt;/code&gt; and SCSS &lt;code&gt;$variable&lt;/code&gt; are both parsed correctly.&lt;/li&gt;
&lt;li&gt;Nesting support: nested selector syntax is preserved.&lt;/li&gt;
&lt;li&gt;Helper functions: color helpers such as &lt;code&gt;darken()&lt;/code&gt; and &lt;code&gt;lighten()&lt;/code&gt; are supported.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Independent style files
&lt;/h3&gt;

&lt;p&gt;VuReact also supports standalone style files outside of SFCs, and the handling strategy is similar to the &lt;code&gt;&amp;lt;style lang&amp;gt;&lt;/code&gt; blocks above.&lt;/p&gt;

&lt;h4&gt;
  
  
  Standalone SCSS example
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Project structure
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
  components/
    Button.vue
    button.scss
    other.scss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;button.scss&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="sx"&gt;url('./other.scss')&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#42b883&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;darken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$primary&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Used in &lt;code&gt;Button.vue&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;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="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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./button.scss&lt;/span&gt;&lt;span class="dl"&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;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Button.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./button.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Button&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;button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Click me&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;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* button.css */&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="sx"&gt;url('./other.css')&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#42b883&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;#42b883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10%&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;h4&gt;
  
  
  Standalone Less example
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Project structure
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
  components/
    Card.vue
    card.less
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;card.less&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@border-color: #e5e5e5;

.card {
  border: 1px solid @border-color;
  border-radius: 8px;
  padding: 20px;

  &amp;amp;:hover {
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
  }

  .title {
    font-size: 18px;
    color: #333;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Used in &lt;code&gt;Card.vue&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card Title&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;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="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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./card.less&lt;/span&gt;&lt;span class="dl"&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;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Card.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./card.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;h3&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Card Title&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&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;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="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 css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* card.css */&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#e5e5e5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compilation summary
&lt;/h3&gt;

&lt;p&gt;VuReact's style-language compilation shows a complete preprocessor transformation pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Language detection based on the &lt;code&gt;lang&lt;/code&gt; attribute or file extension.&lt;/li&gt;
&lt;li&gt;Syntax conversion from preprocessor syntax to standard CSS.&lt;/li&gt;
&lt;li&gt;CSS file generation for the compiled output.&lt;/li&gt;
&lt;li&gt;Import adaptation for React.&lt;/li&gt;
&lt;li&gt;Support for &lt;code&gt;@import&lt;/code&gt; statements.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Supported preprocessors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SCSS/Sass&lt;/li&gt;
&lt;li&gt;Less&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;VuReact preserves the original style authoring experience while producing React-friendly output that fits naturally into the target project structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/style/lang.html" rel="noopener noreferrer"&gt;VuReact semantic comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>How does VuReact compile Vue 3's CSS Modules to React?</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Wed, 03 Jun 2026 14:30:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/how-does-vureact-compile-vue-3s-css-modules-to-react-442i</link>
      <guid>https://dev.to/smirk9581/how-does-vureact-compile-vue-3s-css-modules-to-react-442i</guid>
      <description>&lt;p&gt;&lt;a href="https://vureact.top/en/guide/introduction.html" rel="noopener noreferrer"&gt;VuReact&lt;/a&gt; is a compiler toolchain for migrating from Vue to React — and for writing React with Vue 3 syntax.&lt;/p&gt;

&lt;p&gt;In this article, we will look at how Vue SFC &lt;code&gt;&amp;lt;style module&amp;gt;&lt;/code&gt; blocks are compiled into React code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before We Start
&lt;/h2&gt;

&lt;p&gt;To keep the examples easy to read, this article follows two simple conventions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All Vue and React snippets focus on core logic only, with full component wrappers and unrelated configuration omitted.&lt;/li&gt;
&lt;li&gt;The discussion assumes you are already familiar with CSS Modules in Vue 3.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Compilation Mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Module style transformation
&lt;/h3&gt;

&lt;p&gt;Vue CSS Modules are transformed into a React-compatible module import format while preserving class-name mapping.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Component.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"$style.container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f5f5f5&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;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Component.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;$style&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;./component-abc1234.module.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&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;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;$style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* component-abc1234.module.css */&lt;/span&gt;
&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f5f5f5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the example shows, Vue &lt;code&gt;&amp;lt;style module&amp;gt;&lt;/code&gt; blocks are compiled into CSS Modules files, then used in React through module imports. That preserves the familiar &lt;code&gt;$style.container&lt;/code&gt; access pattern and keeps module scoping intact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom module names
&lt;/h3&gt;

&lt;p&gt;CSS Modules also support named module imports.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Default module name: &lt;code&gt;$style&lt;/code&gt; -&amp;gt; &lt;code&gt;$style&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Custom module name: &lt;code&gt;&amp;lt;style module="custom"&amp;gt;&lt;/code&gt; -&amp;gt; &lt;code&gt;custom&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Component.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"custom.container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Custom Module&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;module=&lt;/span&gt;&lt;span class="s"&gt;"custom"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ccc&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;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Component.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;custom&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;./component-xyz123.module.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&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;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Custom Module&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated code keeps the module import style consistent with Vue's usage while adapting it to React's module import conventions.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS Modules with scoped styles
&lt;/h3&gt;

&lt;p&gt;CSS Modules can also be combined with scoped styles for stronger isolation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Component.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"$style.wrapper"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"$style.text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Text Content&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;module&lt;/span&gt; &lt;span class="na"&gt;scoped&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f8f8f8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&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;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Component.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;$style&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;./component-abc123.module.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;$style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wrapper&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;data-css-abc123&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;$style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;data-css-abc123&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Text Content
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;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="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 css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* component-abc123.module.css */&lt;/span&gt;
&lt;span class="nc"&gt;.wrapper&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-abc123&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f8f8f8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.text&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-css-abc123&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&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 combination of &lt;code&gt;scoped&lt;/code&gt; plus CSS Modules gives you both module-level encapsulation and per-component style isolation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compilation summary
&lt;/h3&gt;

&lt;p&gt;VuReact's CSS Modules compilation strategy shows a complete module-style migration path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CSS Modules are extracted into standalone &lt;code&gt;.module.css&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;Class mappings are preserved, including &lt;code&gt;$style.className&lt;/code&gt; syntax.&lt;/li&gt;
&lt;li&gt;React-compatible module imports are generated automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That lets the compiled React output keep Vue's CSS Modules experience while fitting naturally into React's module-based styling model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/style/module.html" rel="noopener noreferrer"&gt;VuReact semantic comparison overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vureact-js/core" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>How does VuReact handle Vue 3's top-level TypeScript declarations in React?</title>
      <dc:creator>Ryan John</dc:creator>
      <pubDate>Wed, 03 Jun 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/smirk9581/how-does-vureact-handle-vue-3s-top-level-typescript-declarations-in-react-4p37</link>
      <guid>https://dev.to/smirk9581/how-does-vureact-handle-vue-3s-top-level-typescript-declarations-in-react-4p37</guid>
      <description>&lt;p&gt;&lt;a href="https://vureact.top/en/guide/introduction.html" rel="noopener noreferrer"&gt;VuReact&lt;/a&gt; is a compiler toolchain for migrating from Vue to React — and for writing React with Vue 3 syntax.&lt;/p&gt;

&lt;p&gt;In this article, we will look at how VuReact handles top-level TypeScript declarations when compiling Vue 3 code to React.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before We Start
&lt;/h2&gt;

&lt;p&gt;To keep the examples easy to read, this article follows two simple conventions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All Vue and React snippets focus on core logic only, with full component wrappers and unrelated configuration omitted.&lt;/li&gt;
&lt;li&gt;The discussion assumes you are already familiar with TypeScript.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Compilation Mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Top-level TypeScript declarations -&amp;gt; hoisted outside the React component
&lt;/h3&gt;

&lt;p&gt;In Vue, top-level TypeScript declarations inside &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; such as &lt;code&gt;interface&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, or &lt;code&gt;enum&lt;/code&gt; are purely static language constructs. They do not produce runtime behavior.&lt;/p&gt;

&lt;p&gt;VuReact performs static analysis on those declarations and hoists them outside the generated React component so they remain at module scope, preserve their intended visibility, and do not interfere with runtime logic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&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="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ExampleInterface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;ExampleEnum&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&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;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ExampleType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&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;ul&gt;
&lt;li&gt;Compiled React
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ExampleInterface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;ExampleEnum&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&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;Example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ExampleType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&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;&amp;lt;&amp;gt;&amp;lt;/&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;As the example shows, top-level type declarations are preserved outside the component as module-level TypeScript declarations, while inner type declarations remain inside their original function scope.&lt;/p&gt;

&lt;p&gt;That allows VuReact to preserve TypeScript semantics without introducing unnecessary changes to the runtime structure of the compiled React component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vureact.top/en/guide/semantic-comparison/script/type-declaration.html" rel="noopener noreferrer"&gt;VuReact docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://runtime.vureact.top/en/guide/introduction.html" rel="noopener noreferrer"&gt;VuReact Runtime docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>react</category>
    </item>
  </channel>
</rss>
