vue3 中使用 jsx 开发的详细过程

 更新时间:2022年09月05日 15:47:14   作者:雪急飞绪  
这篇文章主要介绍了vue3 中使用 jsx 开发,本文着重说一下在使用 .vue 文件和 .jsx 文件在使用语法上的差异,需要的朋友可以参考下

安装 JSX 插件

在 Vue2 中要想使用 jsx 开发,需要安装 @vue/babel-preset-jsx 等插件,之后在 babel 里指定即可,详细可以参考下面的 Vue2 GitHub 文档

Vue2:GitHub 文档 —— Babel Preset JSX

最近在使用 Vue3,突然想用 jsx 进行开发部分页面,顺便记录一下,也可以参考下面的 Vue3 GitHub 文档

Vue3:GitHub 文档 —— Babel Plugin JSX for Vue 3.0

构建工具使用的是 vite,要想使用 jsx 开发,需要安装 @vitejs/plugin-vue-jsx,之后配置 vite.config.js 里的 plugins 即可

// vite.config.js
import vueJsx from '@vitejs/plugin-vue-jsx'
import { defineConfig } from 'vite'

export default defineConfig(() => {
  return {
    plugins: [vueJsx()]
  }
})

接下来着重说一下在使用 .vue 文件和 .jsx 文件在使用语法上的差异

使用语法差异

模板

之前在 template 里写的 html 代码需要放到 render 函数或 setup 函数里,Vue3 在 setup 里写会好一点

<!-- .vue -->
<template>
  <div>Hello World</div>
</template>

<!-- .jsx -->
<script>
export default defineComponent({
  setup() {
    return () => (
      <div>Hello World</div>
    )
  }
})
</script>

指令

需要把双引号改为单括号

  • v-ifv-showv-html等同理
  • v-bind也是一样的,不过需要把动态绑定需要去掉:

注意:

  • .vue文件中,ref 在模板中会自动进行解包,所以不需要使用.value
  • 但是在.jsx文件中,ref 在模板中不会自动解包,所以需要使用.value
<!-- .vue -->
<el-input v-model="queryParams.pageNumber" />
<el-form model="queryParams" :inline="true">...</el-form>

<!-- .jsx -->
<el-input v-model={queryParams.value.pageNumber} />
<el-form model={queryParams.value} inline={true}>...</el-form>

事件修饰符

  • 想使用事件修饰符可以把 v-model 改为一个数组,事件修饰符需要以数组的形式传递
  • 如果需要传递参数,需要在数组第二个参数中以字符串形式传递
  • 推荐:可以使用 _ 来分割事件修饰符,GitHub 里没有特殊声明,但是 Babel Plugin JSX for Vue 3.0 源码里做了判断,可以参考: parseDirectives.ts#L52-L61
<!-- .vue -->
<el-input v-model.trim={ queryParams.name } />

<!-- .jsx -->
<el-input v-model={ [queryParams.value.name, ['trim'] } />
<!-- 或 -->
<el-input v-model_trim={ refVal.value } />

自定义指令

如下示例为:添加 .event 事件修饰符并传递 arg 参数,直接打印 binding 效果如下:

image-20220901105132150

<!-- .vue -->
<el-button
  v-hasPermission:arg.event="['xxx:add']"
  type="primary"
  plain
  icon="Plus"
  @click="handleAdd"
>
  新增
</el-button>

<!-- .jsx -->
<el-button
  v-hasPermission={[['xxx:add'], 'arg', ['event']]}
  type='primary'
  plain
  icon="Plus"
  onClick={handleAdd}
>
  新增
</el-button>

v-for

v-for 无法直接使用,需要使用 map 去实现循环遍历渲染

<!-- .vue -->
<h1 v-for="item in list" :key="item">{{item}}</h1>

<!-- .jsx -->
<script>
{list.value.map(item => (
  <h1>{item}</h1>
))}
</script>

注意:

  • 如果遍历时需要判断每一项其是否显示,不能使用v-if,需要使用三元运算符
  • v-forv-if不能一起使用
<!-- .vue -->
<template v-for="col in columns">
  <el-table-column
    v-if="col.visible"
    :key="col.key"
    :label="col.label"
    :prop="col.field"
  />
</template>

<!-- .jsx -->
{columns.value.map(col =>
  col.visible ? (
    <el-table-column
      key={col.id}
      label={col.label}
      prop={col.field}
    />
  ) : null
)}

v-on

v-on 无法直接使用,需要使用原生绑定事件的方式去实现(@ -> on,之后进行驼峰)

<!-- .vue -->
<el-button @click="handleQuery">搜索</el-button>

<!-- .jsx -->
<el-button onClick={handleQuery}>搜索</el-button>

系统按键修饰符不能通过 .xxx 形式书写,需要自己进行判断,比如如下示例是按回车时进行搜索

这里顺便说一下 style,由于里面是 : 形式表示,需要改为对象形式书写

<!-- .vue -->
<el-input
  v-model.trim="queryParams.number"
  clearable
  style="width: 180px"
  @keyup.enter="handleQuery"
/>

<!-- .jsx -->
<el-input
  v-model_trim={queryParams.value.number}
  clearable
  style={{ width: '180px' }}
  onKeyup={e => e.code === 'Enter' && handleQuery()}
/>

插槽

在 jsx 中,应该使用 v-slots 代替 v-slot,且插槽需要是函数式组件

<!-- .vue -->
<el-dialog
  v-model="configOpen"
  title="弹出框"
  append-to-body
  >
  <template #footer>
    <div class="dialog-footer">
      <el-button @click="configOpen = false">取 消</el-button>
    </div>
  </template>
</el-dialog>

<!-- .jsx -->
<el-dialog
  v-model={configOpen.value}
  title='弹出框'
  append-to-body
  v-slots={{
    footer: () => (
      <div class='dialog-footer'>
        <el-button
          onClick={() => {
            configOpen.value = false
          }}
        >
          取 消
        </el-button>
      </div>
    )
  }}
  >
  <!-- ... -->
</el-dialog>

到此这篇关于vue3中使用jsx开发的文章就介绍到这了,更多相关vue3使用jsx内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Vue3页面如何自适应表格滚动高度

    详解Vue3页面如何自适应表格滚动高度

    这篇文章主要为大家详细介绍了Vue3页面如何自适应表格滚动高度,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Vue实现视频播放vue-video-player、dplayer方式

    Vue实现视频播放vue-video-player、dplayer方式

    这篇文章主要介绍了Vue实现视频播放vue-video-player、dplayer方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 探索Vue如何高效构建可复用组件

    探索Vue如何高效构建可复用组件

    Vue.js作为现代前端开发中的佼佼者,其组件系统是构建高效、灵活和可扩展用户界面的关键,本文带大家深度探索 Vue.js 组件的核心奥义,感兴趣的小伙伴可以了解下
    2024-12-12
  • vue父子组件相互通信方法示例梳理总结

    vue父子组件相互通信方法示例梳理总结

    这篇文章主要为大家介绍了vue父子组件相互通信方式示例梳理总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Vue实现数字动画的几种方案

    Vue实现数字动画的几种方案

    本文介绍了三种使用Vue实现动态数字动画的方案:使用Vue的响应式数据与`setInterval`逐步更新数字,通过Vue的动画API和CSS动画效果为数字增加过渡效果,以及使用更高效的`requestAnimationFrame`来提供更加流畅的动画表现,每种方案都详细说明了原理、实现步骤和代码示例
    2025-02-02
  • vue3+vite中使用vuex的具体步骤

    vue3+vite中使用vuex的具体步骤

    在vue3+vite创建的项目中使用vuex,要注意的是vite有部分写法和之前的webpack是不同的,这篇文章主要介绍了vue3+vite中使用vuex的具体步骤,需要的朋友可以参考下
    2022-11-11
  • 基于vue与element实现创建试卷相关功能(实例代码)

    基于vue与element实现创建试卷相关功能(实例代码)

    这篇文章主要介绍了基于vue与element实现创建试卷相关功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Vite+Electron快速构建VUE3桌面应用的实现

    Vite+Electron快速构建VUE3桌面应用的实现

    本文主要介绍了Vite+Electron快速构建VUE3桌面应用的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • vue element实现表格合并行数据

    vue element实现表格合并行数据

    这篇文章主要为大家详细介绍了vue element实现表格合并行数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Vue 如何向集合的头部添加元素

    Vue 如何向集合的头部添加元素

    在 Vue 中,如果要向集合的头部添加元素,可以使用 JavaScript 的 unshift 方法或 Vue 的 $set 方法,本文给大家介绍Vue 向集合的头部添加元素的方法,感兴趣的朋友一起看看吧
    2023-12-12

最新评论