vue3无法使用jsx的问题及解决
作者:地瓜咕咕 发布时间:2024-04-30 10:46:17
vue3无法使用jsx问题
报错一:无法使用 JSX,除非提供了 "--jsx" 标志
在Vite+Vue3.0中使用jsx语法开发,需要安装jsx插件
npm i @vitejs/plugin-vue-jsx -s
在vite.config.js加入jsx配置
// vite.config.js
import { defineConfig } from 'vite'
import vueJsx from '@vitejs/plugin-vue-jsx'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue(), vueJsx()],
})
至此,我们新建的这个vite项目已经全面支持jsx语法了,此时还需要在tsconfig.ts中配置"jsx": "preserve"属性,就可以愉快的使用jsx形式来写vue了。
报错二:ElementPlusIconsVue挂载问题
import ElementPlusIconsVue
类型“typeof import("D:/\u9879\u76EE/00/model-dev-platform-doc/node_modules/@element-plus/icons-vue/dist/types/index")”的参数不能赋给类型“Plugin_2”的参数。
解决办法:
经过善良的QQ群友点拨之后才明白....
需要遍历挂载
报错二:vue3.0+ts 找不到模块“./XXX.vue”或其相应的类型声明。
鹅鹅鹅鹅鹅鹅.....还没找到原因
卸载掉volar插件,全部报错都消失
关于vue3的jsx写法问题
安装 @vitejs/plugin-vue-jsx vite 插件
yarn add @vitejs/plugin-vue-jsx -D
npm install @vitejs/plugin-vue-jsx -D
安装完成之后,在 vite.config.js 中进行配置:
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";
export default defineConfig({
?? ?plugins: [
?? ??? ?vue(),
?? ??? ?vueJsx(),
?? ?]
})
然后,即可编写 jsx 形式的 vue 单文件组件。
编写示例
基础实例
vue3 新增了 setup 这个组合式 api,这样就使得利用 jsx 编写 vue 组件时的风格非常类似于 react。在 setup 可以创建 state,接受 props,还可以直接返回 jsx。
import { defineComponent} from 'vue';
export default defineComponent({
?? ?setup() {
?? ??? ?return <div>123456789</div>
?? ?}
});
props 和 state
在 vue3 中,存在 ref 和 reactive 这两个创建响应式状态的 api。由于内置的观察者模式,导致 vue 并不需要像 react 那样,提供 useMemo,useCallback 等根据条件判断是否更新的钩子。
ref 在 render 函数中,会自动解构,不需要再使用 ref.value 来获取里面的值。
推荐使用 ref,而不是 reactive。
props 则需要在 defineComponent 中使用 props 属性,指定 props,该组件才会接受对应的 props。
子组件不能在 setup 中返回 jsx,否则弹出警告,不渲染该子组件。
父组件接受子组件后,不可在 setup 中直接返回 ctx,或者 ctx.slots?.default?.() 计算后的值,第一种情况弹出警告,不渲染该子组件;第二种情况,该子组件不会响应式。正确的做法,应该是返回一个渲染函数。
子组件:
import { defineComponent, ref, reactive } from 'vue;
export default defineComponent({
?? ?name: 'TestB',
?? ?// 必须传递props,提醒 vue,该组件可以接受名称为 str 的值
?? ?// 如果不填,则 props 接受不到该值。
?? ?// 如果该组件为子组件,不可在 setup 中返回元素,必须在 render 中返回元素
?? ?props: ['str'],
?? ?setup(this, props, ctx) {
?? ??? ?const count = ref(0);
?? ??? ?const { str } = props;
?? ??? ?const reactiveCount = reactive({value: 0});
?? ??? ?return {
?? ??? ??? ?str,
?? ??? ??? ?count,
?? ??? ??? ?reactiveCount,
?? ??? ?}
?? ?},
?? ?render() {
?? ??? ?const { count, reactiveCount, str } = this;
?? ??? ?return <div>{count} - {reactiveCount.value} - {str}</div>
?? ?}
});
父组件:
import { defineComponent } from "vue";
export default defineComponent({
? ? props: ['testStr'],
? ? name: 'TestA',
? ? setup(props, ctx) {
? ? ? ? const { testStr } = props;
? ? ? ? // 注意,不要直接返回一个 ctx.slots?.default?.() 计算后的值,这样不能响应式
? ? ? ? // 同时,也要注意,不能直接返回 ctx,会有警告,同时不会显示子元素
? ? ? ? const renderFn = () => {
? ? ? ? ? ? return <div>{ ctx.slots?.default?.() ?? "" }</div>
? ? ? ? }
? ? ? ? return {
? ? ? ? ? ? testStr,
? ? ? ? ? ? renderFn,
? ? ? ? }
? ? },
? ? render() {
? ? ? ? const { testStr, renderFn } = this;
? ? ? ? return <div>你输入的字符串: {testStr}
? ? ? ? ? ? <div>子组件</div>
? ? ? ? ? ? <div>{ renderFn() }</div>
? ? ? ? </div>
? ? }
})
事件监听
@vitejs/plugin-vue-jsx 该插件默认将 @input 等相关模板语法,替换成了 onInput 等 jsx 形式。这里以点击事件举例。
import { defineComponent, ref, reactive } from "vue";
interface ITestAProps {
? str: string;
}
export default defineComponent({
? name: "TestA",
? props: ["str"],
? setup(this, props, ctx) {
? ? const count = ref(0);
? ? const { str } = props;
? ? const reactiveCount = reactive({ value: 0 });
? ? const onClick = () => {
? ? ? count.value++;
? ? };
? ? const reactiveClick = () => {
? ? ? reactiveCount.value++;
? ? };
? ? return {
? ? ? str,
? ? ? count,
? ? ? reactiveCount,
? ? ? onClick,
? ? ? reactiveClick,
? ? };
? },
? render() {
? ? const { count, reactiveCount, str, onClick, reactiveClick } = this;
? ? return (
? ? ? <div>
? ? ? ? <div onClick={onClick}>{count}</div>
? ? ? ? <div onClick={reactiveClick}>{reactiveCount.value}</div>
? ? ? ? <div>{str}</div>
? ? ? </div>
? ? );
? },
});
插槽
vue3 中,可以使用快捷语法(以 element-plus 举例)
<el-popconfirm
? title="确认删除最后一个配置内容?"
? confirm-button-text="确认"
? cancel-button-text="取消"
? @confirm="
? ? ? addNewValue.newConfigList.length > 1
? ? ? ? addNewValue.newConfigList.pop()
? ? ? : ElMessage({
? ? ? ? ? message: '不能删除所有配置内容',
? ? ? ? ? type: 'error',
? ?? ? ?})
? "
?>
? ?<template #reference>
? ? <el-button type="danger"> 删除最后一个表单配置内容 </el-button>
? </template>
</el-popconfirm>
jsx 形式中的 vue3 中,可以使用
import { defineComponent } from 'vue';
import { ElPopconfirm, ElButton } from 'element-plus';
export default defineComponent({
?? ?render() {
?? ??? ?return <ElPopconfirm
?? ??? ??? ?title="确认删除最后一个配置内容?"
?? ??? ??? ?confirmButtonText="确认"
?? ??? ??? ?cancelButtonText="取消"
?? ??? ??? ?onConfirm={() => {
?? ??? ??? ??? ?addNewValue.newConfigList.length > 1
? ? ? ?? ??? ??? ?? addNewValue.newConfigList.pop()
? ? ? ?? ??? ??? ?: ElMessage({
? ? ? ? ? ?? ??? ??? ?message: '不能删除所有配置内容',
? ? ? ? ? ?? ??? ??? ?type: 'error',
? ?? ? ??? ??? ??? ?})
?? ??? ??? ?}}
?? ??? ??? ?v-slot={{
?? ??? ??? ??? ?reference: () => <ElButton type="danger">删除最后一个表单配置内容</ElButton>
?? ??? ??? ?}}
?? ??? ?>
?? ??? ??? ?
?? ??? ?</ElPopconfirm>
?? ?}
});
其余相关的属性
其余相关的属性,比如 v-model 啥的,还是按照原来的写法去写。
这里需要注意一点 v-model 如果使用 jsx 写法,不会自动双向绑定,需要自己去写对应的函数。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持asp之家。
来源:https://blog.csdn.net/weixin_48927323/article/details/125163820


猜你喜欢
- Sublime Text 3纯文本编辑器Package Control(Sublime的包管理器)Sublime Text3中的插件,通过该
- 这个示例使用的Python版本为3.7版本,一、bing壁纸接口访问bing的官网,通过浏览器开发者工具,查看网络可以找到一个请求壁纸的接口
- range()是Python的内置函数,用于创建整数的列表,可以生成递增或者递减的数列。xrange也有相同的功能, 今天来看下它们之间的
- 跨浏览器的本地存储(一):userData behaviorDOM Storage,是基于 Web Applications 1.0 spe
- 两个树莓派,在同一个局域网内,传输文件,采用socket方式。client端代码:import socketimport osimport
- 这里我不想采用诸如ubuntu下的apt-get install方式进行python的安装,而是在linux下采用源码包的方式进行pytho
- 之前一直在windows环境使用pycharm加上virtualenv方式开发,最近由于本地多个virtualenv比较混乱,所以尝试切换a
- 这篇文章主要介绍了python如何基于redis实现ip代理池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 本文实例讲述了Python反射的用法。分享给大家供大家参考,具体如下:在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或
- 正如你现在所看到的一样,网页的布局设计变得越来越重要。访问者不愿意再看到只注重内容的站点。虽然内容很重要,但只有当网页布局和网页内容成功接合
- 视图:mysql中的视图,视图与表有很多相似的地方,视图也是由若干个字段以及若干条记录构成,视图也可以作为select语句的数据源。视图中保
- PWA初次体验前言:本示例不用安装任何东西部分资源来自网络资源及PWA官网,不要把PWA想象的太复杂,跟着示例走一下,你行的。PWA介绍一个
- 在Python里面,函数可以作为参数传入一个函数,函数也可以复制给变量,通过变量调用函数。装饰器可以扩展一个函数的功能,为函数做一个装饰器注
- 1、PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了
- 一、复合查询1.1 多表查询实际开发中往往数据来自不同的表,所以需要多表查询,但是可以将多张表做笛卡尔积后的表当做是一张表,也就是单表查询。
- 这篇文章主要介绍了调用其他python脚本文件里面的类和方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 一、python这么多版本如何选择?作为初学者,只需知道 Python 分 Python 2.x 和 Python 3.x 两大版本就可以了
- Entity Framework 4.0 也可以支持大名鼎鼎的MySql,这篇POST将向展示如何实现EF+MyS
- PHP getName() 函数实例返回 XML 元素及其子元素的名称:<?php $xml=<<<XML<?
- 一、前言在学习深度学习会发现都比较爱用python这个argparse,虽然基本能理解,但没有仔细自己动手去写,因此这里写下来作为自己本人的