jsx在vue中是为特定动态场景设计的可编程渲染方案,适用于动态组件映射、高度复用容器、递归结构及运行时层级决定等模板难以简洁表达的情形,而非通用替代。

JSX 在 Vue 中不是替代模板的通用方案,而是为特定场景提供更自然、可编程的渲染表达方式。它把组件结构写在 JavaScript 里,让条件判断、循环、动态组件、递归等逻辑直接用原生语法实现,避免模板中堆砌 v-if、v-for 和 component :is 的嵌套和重复。
适合用 JSX 的典型场景
当模板开始“卡住”逻辑表达时,就是 JSX 发挥作用的时候:
- 动态组件映射:后端返回组件类型字符串(如 "van-field"、"el-table"),直接用变量名作为组件标签,不用一堆 v-if 判断
- 高度复用的容器组件:比如表单生成器、布局卡片、弹窗壳子,需要根据 props 拼接不同子组件和属性,JSX 可以把配置对象直接解构进 h() 调用
- 递归结构:树形菜单、嵌套评论、文件目录,用 JSX 写递归 render 函数比模板中反复套 slot + v-if 清晰得多
- 运行时决定结构层级:比如标题组件支持 level=1~6,用 h('h' + this.level, ...) 一行搞定,不用六个 v-else-if
JSX 渲染函数怎么写才顺手
核心是理解 h() 的三段式调用,以及 JSX 如何转译成它:
- 标签名可以是字符串('div')、组件引用(MyButton)、甚至计算值(this.tag)
- 属性对象支持 class/style 数组或对象写法,事件用 onClick、onInput 等驼峰形式
- 子节点可以是字符串、vnode 数组、或三元表达式结果;slot 内容通过 this.$slots.default()(Vue 2)或 slots.default()(Vue 3)获取
- 不要手动拼 HTML 字符串,所有结构都走 h(),保证响应式更新和 diff 正确性
和模板语法不是非此即彼
一个项目里完全可以混合使用:常规页面用模板,复杂子组件或低代码模块用 JSX。关键看维护成本:
- 如果一段逻辑在模板里要写 15 行带 key 的 v-for + 4 层 v-if,那换成 JSX 往往能压到 8 行以内,且逻辑线性可读
- 如果只是静态按钮+文字,硬上 JSX 反而增加认知负担,模板更直观
- 团队协作时,建议统一约定哪些组件类型允许用 JSX(比如仅限 “渲染器类” 组件),避免随意切换造成理解断层
本质上,JSX 是把“描述 UI”这件事交还给 JavaScript,而不是受限于模板 DSL 的表达边界。用得好,它不增加复杂度,反而让动态逻辑真正变得简单直接。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










