不要在vue中使用jsx

配置

新项目

npm create vue命令中设置jsx即可在项目中使用jsx

已有项目(vite)

vite.config.js中增加插件

js 复制代码
import vueJsx from '@vitejs/plugin-vue-jsx'

export default defineConfig({
  plugins: [
  // ...
    vueJsx(),
  ],
})

写法

javascript 复制代码
// App.jsx
import { defineComponent, ref } from "vue";

const Comp = defineComponent({
  props: ["onClick"],
  setup(props, { slots }) {
    return () => (
      <button onClick={props.onClick}>{slots.default?.() ?? "a"}</button>
    );
  },
});

const App = defineComponent({
  setup() {
    const num = ref(0);
    return () => <Comp onClick={() => num.value++}>{num.value}</Comp>;
  },
});

export default App;

说明

  1. setup的返回值是一个render函数 ()=>jsx 而不是普通的jsx 可以理解成react类组件中的render函数
  2. setup函数的签名是setup(props,{ slots, emit, attrs }) 但仅推荐使用props和slots
  3. 传入的onClickclass等会被自动应用到子组件的最外层 需要设置inheritAttrs:false
  4. 上述的参数会被收集至setupattrs参数中,需要设置props: ["onClick"]才会识别为props.这种情况下,不需要配置inheritAttrs:false
  5. 插槽位于slots对象中,类型是函数,用法是
arduino 复制代码
{slots.default?.() ?? default-view}

default是默认插槽的名字 如果有其他的具名插槽 使用slots.插槽名即可

插槽函数可以传递参数 和template中插槽功能一样

  1. jsx方式中 只能传输不带参数的默认插槽 类似于react中的children参数

  2. jsx方式中 这种写法依旧是不行的

css 复制代码
Modal.info({ content: <span></span> })

必须使用h('span')

ts

vue+jsx姑且能用 但是vue+tsx就相当恶心了

ts中 传onClick得这么做

typescript 复制代码
import type { PropType } from 'vue'

defineComponent({
  props: {
    onClick: Function as PropType<()=> void>
  },
  setup(props, { slots }) {
    //...
  },
});

可以设置defineComponent的模板类型 但是还是会导致onClick被自动应用到子组件最外层以及被视作attrs

插槽方面应该也有一些问题 不过劝退的理由不需要太多 原先的一堆问题再加这个已经足够了

总结

本文的标题其实一开始是在vue中使用jsx 我之前对这种写法是抱有很多期待的 心理流程大概是这样的

  • ref非常方便 本体和属性都能直接传给v-model hook限制好少 有点爽
  • v-model不好 至少element ui里使用体验极差 组件不听话
js 复制代码
<el-tabs modelValue="0">
    <el-tab-pane name="0"></el-tab-pane>
    <el-tab-pane name="1"></el-tab-pane>
</el-tabs>

我都这么写了 它还是能自由切换 是真不愿意受控啊

  • vue+jsx能把refvalue-onChange模式结合起来 还能不用写那该死的:@# 简直是vue和react的融合超进化 值得一试
  • 一坨

又回过头来看最开始的那个想法 ref其实也没那么好

我需要找一个变量被更新的位置 并没有一个专用的setState 我得查看那个变量被引用的所有位置 无论是取值还是设置

话又说回来 有use-immer react的状态更新还是很方便的

hook方面 有eslint其实还好 而且只要把文档记在心中 其实也很难犯错

至于效率问题 现代浏览器一般不会有这方面的问题 真卡顿再优化也不迟

vue项目一坨一坨盘根错节的组件也不少 不见得比react好到哪里去

相关推荐
隔壁小邓4 分钟前
vue如何拆分业务逻辑
前端·javascript·vue.js
SuperEugene12 分钟前
Vue3 + Element Plus 表单校验实战:规则复用、自定义校验、提示语统一,告别混乱避坑|表单与表格规范篇
开发语言·前端·javascript·vue.js·前端框架
SuperEugene16 分钟前
Vue3 + Element Plus 表格查询规范:条件管理、分页联动 + 避坑,标准化写法|表单与表格规范篇
开发语言·前端·javascript·vue.js·前端框架
问道飞鱼24 分钟前
【前端知识】React生态你了解多少?
前端·react.js·前端框架·生态
optimistic_chen34 分钟前
【Vue3入门】Pinia 状态管理 和 ElementPlus组件库
前端·javascript·vue.js·elementui·pinia·组件
We་ct42 分钟前
React Diff & Key 核心解析
开发语言·前端·javascript·react.js·前端框架·reactjs·diff
哥本哈士奇43 分钟前
Vue 3 快速入门:从零搭建前后端 CRUD 应用
前端·javascript·vue.js
SuperEugene1 小时前
Vue3 组件拆分实战规范:页面 / 业务 / 基础组件边界清晰化,高内聚低耦合落地指南|Vue 组件与模板规范篇
前端·javascript·vue.js·前端框架
还是大剑师兰特9 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
xkxnq10 小时前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js