大家好,我是小杨,一个写了6年前端的老油条。今天要聊一个让很多Vue开发者又爱又怕的东西------JSX。说实话,第一次在Vue里用JSX时,我内心是拒绝的:"这不React吗?"。但真香定律从不会缺席,现在我已经回不去了...
一、为什么要在Vue里用JSX?
先说我自己的真香经历:
上个月接了个复杂表格需求,要动态渲染几十种单元格样式。用模板语法写了200行后,我崩溃了:
html
<template v-if="type === 'input'">
<el-input v-model="value" />
</template>
<template v-else-if="type === 'select'">
<el-select v-model="value">
<!-- 省略10行选项代码 -->
</el-select>
</template>
<!-- 还有18种else-if等着我... -->
改用JSX后:
jsx
const renderCell = () => {
return type === 'input' ? (
<el-input vModel={value} />
) : type === 'select' ? (
<el-select vModel={value}>
{options.map(opt => (
<el-option label={opt.label} value={opt.value} />
))}
</el-select>
) : // 其他情况...
}
真香点:
- 逻辑和UI可以写在一起
- 不用记一堆v-if/v-for指令
- 动态组件写得飞起
二、Vue+JSX食用指南
1. 基础配置
在vue.config.js里加个配置就行:
jsx
module.exports = {
runtimeCompiler: true
}
2. 组件改造对比
传统模板写法:
html
<template>
<div class="my-component">
<span>{{ title }}</span>
<button @click="handleClick">点我</button>
</div>
</template>
JSX写法:
jsx
export default {
render() {
return (
<div class="my-component">
<span>{ this.title }</span>
<button onClick={this.handleClick}>点我</button>
</div>
)
}
}
3. 常用语法对照表
text
| 模板语法 | JSX写法 |
| ------- | ------------------------------------------ |
| v-if | {flag && <div/>} |
| v-for | {items.map(item =\> <div key={item.id}/>)} |
| v-model | <input vModel={value}/> |
| @click | <button onClick={handler}/> |
三、高级玩法:放飞自我
1. 动态组件骚操作
jsx
const components = {
input: <el-input />,
select: <el-select />
}
render() {
return components[this.type]
}
2. 渲染函数套娃
jsx
renderList() {
return data.map(item => (
<div>
{this.renderItem(item)}
{item.children && this.renderList(item.children)}
</div>
))
}
3. 和TypeScript绝配
tsx
interface Props {
size: 'small' | 'medium'
}
export default defineComponent({
props: {
size: String as PropType<'small' | 'medium'>
},
setup(props: Props) {
return () => <div class={`size-${props.size}`} />
}
})
四、你可能遇到的坑
坑1:指令写法不同
- v-model → vModel
- v-on → on
- v-show → 直接写style
坑2:scoped样式失效
解决方案:
jsx
<div class={this.$style.myClass}>...</div>
坑3:同事看不懂
解决方案:
- 团队统一规范
- 写好注释
- 准备救心丸(误)
五、什么情况推荐用JSX?
根据我的经验,这些场景特别香:
- 超多条件渲染的逻辑组件
- 需要高度复用的动态组件
- 和TS深度集用的项目
- 从React转Vue的团队
六、总结
- 🚀 JSX不是React的专利
- 💡 在复杂逻辑场景下真香
- ⚠️ 需要团队达成共识
- 🧠 学习成本其实不高(真心的!)
如果你也受够了模板里写一堆v-if,不妨试试JSX,说不定就回不去了呢?
⭐ 写在最后
请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.
✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式
✅ 认为我部分代码过于老旧,可以提供新的API或最新语法
✅ 对于文章中部分内容不理解
✅ 解答我文章中一些疑问
✅ 认为某些交互,功能需要优化,发现BUG
✅ 想要添加新功能,对于整体的设计,外观有更好的建议
✅ 一起探讨技术加qq交流群:906392632
最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!