vue项目中,tsx格式的文件是什么,怎样使用

在 Vue 项目中,.tsx** 文件**是一种使用 TypeScript + JSX(TSX)语法编写的组件文件。它允许你在 Vue 3 中以类似 React 的方式编写组件,同时享受 TypeScript 的类型安全和 JSX 的表达能力。


一、什么是 .tsx 文件?

  • .tsx = TypeScript + JSX
  • 它是 Vue 3 官方支持的一种替代 .vue 单文件组件(SFC)的写法。
  • 适用于:
    • 动态渲染复杂 UI(如菜单、表单生成器)
    • 需要强类型推导的场景
    • 喜欢函数式编程风格或熟悉 React 的开发者

✅ 注意:Vue 的 TSX 和 React 的 JSX 不完全兼容 ,但语法相似。Vue 使用自己的运行时(如 h 函数)和插件来支持 TSX。


二、.tsx.vue 的核心区别

特性 .vue(SFC) .tsx
文件后缀 .vue .tsx
模板语法 <template> + v-if/v-for 等指令 直接用 JavaScript 表达式(如 map, if
类型支持 依赖 Vue 类型定义 完整 TypeScript 类型推断
样式作用域 支持 <style scoped> 需手动处理样式(通常用 CSS Modules 或全局样式)
动态性 较弱(需计算属性) 极强(直接写 JS 逻辑)

三、如何在 Vue 3 + Vite 项目中使用 .tsx

步骤 1:安装插件

复制代码
npm install -D @vitejs/plugin-vue-jsx
# 或 pnpm / yarn

步骤 2:配置 vite.config.ts

复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'

export default defineConfig({
  plugins: [
    vue(),
    vueJsx() // 启用 TSX/JSX 支持
  ]
})

步骤 3:配置 tsconfig.json

复制代码
{
  "compilerOptions": {
    "jsx": "preserve",
    "jsxImportSource": "vue",
    "jsxFactory": "h",
    "jsxFragmentFactory": "Fragment"
  },
  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}

🔍 jsx: "preserve" 表示保留 JSX 结构,由 Vite 插件后续处理。


四、编写 .tsx 组件示例

方式 1:独立 .tsx 文件(推荐用于动态组件)

复制代码
// src/components/HelloWorld.tsx
import { defineComponent } from 'vue'

export default defineComponent({
  setup() {
    const message = 'Hello from TSX!'
    
    return () => (
      <div class="hello">
        <h1>{message}</h1>
        <p>这是 Vue 3 的 TSX 组件</p>
      </div>
    )
  }
})

⚠️ 注意:setup() 必须返回一个 函数(render function),不能直接返回 VNode。

方式 2:在 .vue 文件中使用 TSX(兼顾样式作用域)

复制代码
<!-- MyComponent.vue -->
<template>
  <component :is="renderFn" />
</template>

<script lang="tsx" setup>
import { defineComponent } from 'vue'

const renderFn = () => (
  <>
    <h2>在 .vue 中使用 TSX</h2>
    <button onClick={() => alert('clicked!')}>点我</button>
  </>
)
</script>

<style scoped>
h2 {
  color: blue;
}
</style>

✅ 这种方式可以保留 <style scoped>,避免样式污染。


五、TSX 中的 Vue 特性写法对照

Vue 模板语法 TSX 写法
v-if {condition && <Comp />}
v-for {list.map(item => <Item key={item.id} data={item} />)}
@click onClick={() => handler()}
:class class={``{ active: isActive }}
v-model 手动绑定 value + onUpdate:value(或使用 useModel

六、适用场景建议

适合用 TSX 的情况

  • 动态组件(根据数据决定渲染哪个组件)
  • 高度可配置的 UI(如表格、表单生成器)
  • 需要复杂逻辑控制渲染结构
  • 团队熟悉 React/JSX

不适合用 TSX 的情况

  • 简单静态页面
  • 重度依赖 scoped 样式的项目
  • 不想放弃 v-model、自定义指令等模板特性

总结

  • .tsx 是 Vue 3 中一种强大的组件编写方式,结合了 TypeScript 的类型安全和 JSX 的灵活性。
  • 需要配置 @vitejs/plugin-vue-jsxtsconfig.json
  • 可以单独使用 .tsx 文件,也可以在 .vue 中通过 <script lang="tsx"> 使用。
  • 选择 .vue 还是 .tsx,应根据项目复杂度、团队习惯和维护成本权衡。

如需完整示例项目,可参考官方模板:

复制代码
npm create vue@latest my-tsx-app -- --template vue-ts

然后按上述步骤添加 TSX 支持即可。

相关推荐
两只羊ovo3 分钟前
Promise.all 并发请求实战:从串行 await 到双段并行
前端
七牛开发者21 分钟前
解读 Cordis:dsh 一切皆插件背后的运行时设计
前端·javascript·后端
BigTopOne31 分钟前
ArLiveLite 学习计划
前端
慧都小项1 小时前
夜间Web回归跑到一半停了?TestComplete 15.83提升批量测试稳定性
前端·测试工具·数据挖掘·回归·汽车·web
两只羊ovo1 小时前
Agent ≠ 聊天机器人:从一问一答到 ReAct 循环,到底差在哪?
前端
摇曳的精灵1 小时前
前端缓存优化
前端·缓存·缓存优化
老王以为1 小时前
走进 AI Agent 第二篇:决定 AI Agent 能力上限的关键技术
前端·人工智能·机器学习
何以解忧,唯有..1 小时前
Python 异常处理完全指南:从基础到高级实践
开发语言·前端·python
Buke..1 小时前
【小程序逆向】某游快爆 AI 逆向 sign参数:AI 辅助分析与 MCP 工具链实战
前端·人工智能·爬虫·python·小程序·notepad++
ly76893 小时前
CSS 从入门到进阶:系统掌握现代网页样式与布局
前端·css