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

作者:雪急飞绪 时间:2024-06-07 16:02:31 

安装 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 效果如下:

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

<!-- .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>

来源:https://blog.csdn.net/qq_38689395/article/details/126639124

标签:vue3,jsx
0
投稿

猜你喜欢

  • mysql 8.0.14 安装配置方法图文教程

    2024-01-22 10:28:08
  • Pytorch使用transforms

    2023-11-01 20:34:33
  • 基于keras 模型、结构、权重保存的实现

    2022-12-20 06:31:22
  • 小议JavaScript泛式框架架构的逻辑形式

    2010-07-02 12:55:00
  • 如何利用JavaScript编写更好的条件语句详解

    2023-08-05 04:07:18
  • Python基于traceback模块获取异常信息

    2022-04-27 11:30:10
  • SWFObject 2.1以上版本语法介绍

    2024-04-10 10:49:18
  • python import模块时有错误红线的原因

    2021-03-19 13:59:30
  • Oracle数据库表空间超详细介绍

    2024-01-17 16:49:22
  • 35个Python编程小技巧

    2023-08-23 21:23:50
  • 使用Python实现跳一跳自动跳跃功能

    2023-04-07 01:57:55
  • MySQL无法存储Emoji表情问题的解决方法分析

    2024-01-22 00:32:13
  • SQL语句如何实现超简单的多表查询

    2024-01-21 15:42:05
  • Python源码加密与Pytorch模型加密分别介绍

    2023-11-30 13:05:03
  • Python如何发送与接收大型数组

    2022-07-26 06:54:54
  • 一文了解Django缓存机制

    2023-08-18 06:34:21
  • 如何解决django-celery启动后迅速关闭

    2022-02-07 10:50:25
  • MySQL索引优化实例分析

    2024-01-26 18:34:27
  • 如何将你的应用迁移到Python3的三个步骤

    2022-03-17 08:59:48
  • MySQL数据备份之mysqldump的使用详解

    2024-01-18 20:46:57
  • asp之家 网络编程 m.aspxhome.com