你的 Vue 3 <script setup>,VuReact 会编译成完整的 React 组件

VuReact 是一个能将 Vue 3 代码编译为标准、可维护 React 代码的工具。今天我们不讲某个 API 的映射,而是从宏观层面看:Vue 的 <script setup> 如何被编译成一个完整的 React 组件。

前置约定

为避免示例冗长,本文聚焦于 <script setup> 的整体编译结果和结构变化:

  1. <script setup> 本身是一个编译宏,不会在运行时保留;
  2. 其内部顶层代码会被提炼为 React 组件函数体;
  3. Vue 模板最终会被转成 JSX 的 return 语句。

编译对照

JavaScript:<script setup> 到 React 组件函数

  • Vue 代码:
html 复制代码
<script setup>
const props = defineProps({
  title: String,
  count: Number,
});

const emit = defineEmits(['update']);

const handleClick = () => {
  emit('update', props.count + 1);
};
</script>

<template>
  <button @click="handleClick">
    {{ props.title }} - {{ props.count }}
  </button>
</template>
  • VuReact 编译后 React 代码:
jsx 复制代码
const Comp = memo((props) => {
  const handleClick = useCallback(() => {
    props.onUpdate?.(props.count + 1);
  }, [props.onUpdate, props.count]);

  return (
    <button onClick={handleClick}>
      {props.title} - {props.count}
    </button>
  );
});

export default Comp;

这段转换显示了 <script setup> 的核心编译思路:

  • 非纯 UI 组件会被 memo 包裹以进行性能优化。
  • defineProps 不是运行时调用,而是被编译为组件的 props 参数;
  • defineEmits 被编译为 props.onXxx 的事件回调;
  • 你在 script setup 中编写的大多数代码,直接成为组件内部的函数;
  • 对 script 代码进行编译时静态优化;
  • Vue 模板被编译为 return (...) 中的 JSX。

TypeScript:带类型的 <script setup> 整体编译

  • Vue 代码:
html 复制代码
<script setup lang="ts">
const props = defineProps<{
  title: string;
  count: number;
}>();

const emit = defineEmits<{
  (e: 'update', value: number): void;
}>();

const handleClick = () => {
  emit('update', props.count + 1);
};
</script>

<template>
  <button @click="handleClick">
    {{ props.title }} - {{ props.count }}
  </button>
</template>
  • VuReact 编译后 React 代码:
tsx 复制代码
type ICompProps = {
  title: string;
  count: number;
  onUpdate?: (value: number) => void;
};

const Comp = memo((props: ICompProps) => {
  const handleClick = useCallback(() => {
    props.onUpdate?.(props.count + 1);
  }, [props.onUpdate, props.count]);

  return (
    <button onClick={handleClick}>
      {props.title} - {props.count}
    </button>
  );
});

这说明:

  • <script setup lang="ts"> 中的类型信息会被保留并转换为组件 props 类型;
  • defineProps 的类型参数最终用在 React props 类型定义上;
  • defineEmits 的事件类型会映射成 onUpdate 的回调类型。

在 TypeScript 环境下,VuReact 也支持将 definePropsdefineEmits 的 JavaScript 运行时参数写法,编译为对应的 TS 类型信息。

  • Vue 代码:
ts 复制代码
const props = defineProps({
  title: String,
  count: Number,
});

const emit = defineEmits(['update']);
  • VuReact 编译后 React 代码:
tsx 复制代码
type ICompProps = {
  title: string;
  count: number;
  onUpdate?: () => any;
};

相关资源


如果你觉得本文对你理解 VuReact 有帮助,欢迎点赞、收藏、关注!

相关推荐
尽兴-5 分钟前
传统 Java/Vue 系统如何一步步接入 AI 维护
java·vue.js·人工智能·ai·大模型
zzz_236813 分钟前
【Java实习面试算法冲刺】图论
java·算法·面试
张人玉22 分钟前
基于Vue 3 + ECharts / ECharts-GL / echarts-wordcloud 的数据可视化大屏——地形与产业数据可视化大屏
vue.js·信息可视化·echarts
Sam_Deep_Thinking1 小时前
一次线程池线上故障复盘:四层防线如何避免数据丢失
java·面试·程序员
十铭忘1 小时前
Vue3实现Pixso中的钢笔工具3——梳理函数调用
前端·vue.js
Lhappy嘻嘻1 小时前
网络(二)|Java Socket 编程全实战:UDP 回显 / 词典服务器、TCP 单线程→多线程线程池演进
java·开发语言·网络·学习·面试·udp·tcp
胡萝卜术10 小时前
从API调用到手写LRU:力扣146「LRU缓存」的哈希表+双向链表终极进化之路
前端·javascript·面试
ffqws_10 小时前
Redis 分布式锁:基于 Redisson 的实现与面试高频问答
redis·分布式·面试
碎碎念_49214 小时前
SpringBoot + Vue 前后端分离从 0 到 1 完整环境配置流程
vue.js·spring boot·后端
shuaijie051815 小时前
强制修改调用接口的api地址。
javascript·vue.js·ecmascript