vue3使用 JSX / TSX语法

一、什么是 JSX / TSX

JSX / TSX 语法
JSX 是一种将XML语法嵌入到JavaScript中的语法。在 Vue3 中,我们可以使用JSX语法来编写组件的模板。使用JSX语法可以让我们更加灵活地定义组件的模板,并且可以让我们在编写组件时使用JavaScript的全部语言特性。

let jsx = <h1>hello world</h1>;

二、在vue3中使用

1、基本使用

// index.tsx
const tsxDom = () => {return (<><div class="container"><h1>Hello, world!</h1><p>This is a tsx.</p></div></>);
};export default tsxDom;
// tsx.vue
<template><div><tsxDom></tsxDom></div>
</template><script setup lang="ts">
import tsxDom from "@/tsx/index";
</script><style scoped></style>

2、使用 vue 中的语法

1)插值表达式

// index.tsx
// tsx 中使用{}语法
import { ref } from "vue";let hello = ref<string>("Hello, world!");
const tsxDom = () => {return (<><div><h1>{hello.value}</h1><p>This is a tsx.</p></div></>);
};export default tsxDom;

2)v-model
注意:使用 v-model 时,需要 .value 获取值

// index.tsx
// tsx 中使用 v-model 语法
import { ref } from "vue";
let hello = ref<string>("Hello, world!");const tsxDom = () => {return (<><input type="text" v-model={hello.value} /></>);
};export default tsxDom;
  1. v-if
    注意:在jsx中不支持v-if的指令,需要使用三元表达式
// tsx 中模拟 v-if 语法
import { ref } from "vue";
let flag = ref<boolean>(false);const tsxDom = () => {return <>{flag.value ? <div>显示</div> : <div>隐藏</div>}</>;
};export default tsxDom;

4) v-for
注意:jsx中不支持v-for语法,需要使用js的array.map函数实现

// tsx 中模拟 v-for 语法
import { reactive } from "vue";
interface Data {name: string;age: number;
}
let list = reactive<Data[]>([{ name: "张三", age: 12 },{ name: "李四", age: 18 },
]);const tsxDom = () => {return (<>{{/* 此处完全遵循 react 语法即可 */}list.map((item) => {return <div>{item.name}</div>;})}</>);
};export default tsxDom;

5)v-bind
注意:jsx语法中不支持 v-bind,可以采用{}包裹变量来实现

// tsx 中模拟 v-bind 语法
import { reactive } from "vue";interface List {name: string;age: number;
}let list = reactive<List[]>([{name: "张三",age: 10,},{name: "李四",age: 18,},
]);const tsxDom = () => {return (<>{list.map((item) => {return <div key={item.name}>{item.age}</div>;})}</>);
};export default tsxDom;
  1. v-on
    注意:jsx语法中不支持v-on,jsx/tsx中事件的使用与 react 一致
    以 on 开头,接收一个回调函数,不能使用vue中的修饰符
// tsx 中模拟 v-on 语法const handleClick = () => {console.log("被点击了");
};const tsxDom = () => {return (<><button onClick={() => handleClick()}>点击</button></>);
};export default tsxDom;

7)Props

  • 父子组件传值
  • 通过父组件传递参数
  • jsx/tsx接收props并使用
// tsx.vue
<template><div><tsxDom :userName="userName" :userAge="userAge"></tsxDom></div>
</template><script setup lang="ts">
import { ref } from "vue";
import tsxDom from "@/tsx/props";const userName = ref<string>("张三");
const userAge = ref<number>(18);
</script><style scoped></style>
// props.tsx
// tsx 中接收及使用props
interface Props {userName?: string;userAge?: number;
}const handleClick = (props: Props) => {console.log(props);
};const tsxDom = (props: Props) => {return (<><div>{props.userName}</div><div>{props.userAge}</div><button onClick={() => handleClick(props)}>点击</button></>);
};export default tsxDom;

8)Emit

  • jsx/tsx组件中通过第二个参数 ctx 拿到 emit 方法
  • 通过 emit() 方法传递一个自定义事件以及参数
  • 父组件通过 v-on:自定义事件 拿到传递过来的值
// tsx.vue
<template><div><tsxDom:userName="userName":userAge="userAge"@on-click="handleClick"></tsxDom></div>
</template><script setup lang="ts">
import { ref } from "vue";
import tsxDom from "@/tsx/emit";const userName = ref<string>("张三");
const userAge = ref<number>(18);const handleClick = (value: string) => {console.log(value); // 张三
};
</script><style scoped></style>
// emit.tsx
interface Props {userName?: string;userAge?: number;
}const handleClick = (props: Props, ctx: any) => {ctx.emit("on-click", props.userName);
};const tsxDom = (props: Props, ctx: any) => {return (<><div>{props.userName}</div><div>{props.userAge}</div><button onClick={() => handleClick(props, ctx)}>点击</button></>);
};export default tsxDom;

9)v-slot

  • 子组件通过 centex.slots 传参
  • 父组件通过 v-slots={} 接收参数
import { defineComponent, reactive } from "vue";const state = reactive({ name: "张三" });
const list = reactive([1, 2, 3]);export const tsxDom = (props: any, ctx: any) => (<>{/* 默认插槽 */}<div>{ctx.slots.default ? ctx.slots.default() : "默认"}</div>{/* 声明名称为state的插槽 并传值,不传值为ctx.slots.state() */}<div>{ctx.slots.state && ctx.slots.state(state)}</div>{/* 声明名称为list的插槽 并传值,不传值为slots.list() */}<div>{ctx.slots.list && ctx.slots.list(list)}</div></>
);export default defineComponent({setup() {type State = {name: string;};// 使用插槽const slots = {// default: () => <div>匿名插槽</div>,state: (state: State) => <div>{state.name}</div>,list: (list: number[]) => list.map((item) => <div>{item}</div>),};return () => (<>{/* 引用组件, 使用插槽:v-slots={slots} */}<tsxDom v-slots={slots} /></>);},
});

3、ts中报错
需要在 tsconfig.json 增加:

{"compilerOptions": {"jsx": "preserve","jsxImportSource": "vue"}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/32755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05-5.5.2 并查集

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

【面试干货】HashSet 和 TreeSet 的区别

【面试干货】HashSet 和 TreeSet 的区别 1、实现方式HashSetTreeSet 2、性能添加、删除和查找操作的时间复杂度HashSetTreeSet 3、元素唯一性4、迭代顺序HashSetTreeSet 5、使用场景HashSetTreeSet 6、示例代码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不…

阅读笔记:明朝那些事儿妖孽横行的宫廷

明朝那些事儿第四部看完了&#xff0c;合上书本给我印象比较深刻的文臣要数王守仁&#xff0c;不愧为明朝的军事家&#xff0c;思想家&#xff0c;文学家&#xff0c;教育家&#xff0c;他经过多年的思索、磨难、追求&#xff0c;终于有一天&#xff0c;在穷乡僻壤&#xff0c;…

Linux的基本指令第二篇

1.cat - 查看文件 语法&#xff1a;cat [选项] [文件] 功能&#xff1a; 查看目标文件的内容 -b 对非空输出行编号 -n对输出的所有行编号 -s不输出多行空行 现有一个文件test.c cat -n test.c cat -b test.c cat -s test.c 创建一个新文件 加入源文件的内容 || …

Python基础教程(三十二):random模块

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝💝💝如有需要请大家订阅我的专栏【Python系列】哟!我会定期更新相关系列的文章 💝💝💝关注!关注!!请…

华为OD刷题C卷 - 每日刷题38(万能字符单词拼写,虚拟理财游戏)

1、&#xff08;万能字符单词拼写&#xff09;&#xff1a; 这段代码是解决“万能字符单词拼写”的问题。它提供了一个Java类Main&#xff0c;其中包含main方法和getResult方法&#xff0c;以及一个辅助方法success&#xff0c;用于计算使用给定字符chars能拼写出的单词words中…

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 置换检验是一种非参数统计方法&#xff0c;它不依赖于数据的分布形态&#xff0c;因此特别适…

flowable 适配达梦数据库(最简单的方式)

只需要引入一个 jar 包&#xff0c;就可以轻松实现 flowable 对达梦数据库的适配。 参考如下博客&#xff1a; SpringBoot 中的 Liquibase 适配达梦数据库&#xff08;DM&#xff09;和 Flowable 工作流_liquibase 达梦数据库-CSDN博客 SpringBoot 中的 flyway 支持达梦数据库…

Linux——man帮助命令

一、man 获得帮助信息 基本语法&#xff1a;man [命令或配置文件] &#xff08;功能描述&#xff1a;获得帮助信息&#xff09; 查看 ls 命令的帮助信息 [roothadoop101 ~]# man ls man [数字] [函数] 1、Standard commands &#xff08;标准命令&#xff09; 2、System…

lvgl v8 个人总结

1. lv_group_remove_all_objs(g);//!!移除组所有对象&#xff0c;也需要再次设置默认组。默认组的作用&#xff0c;和一个一个的添加组&#xff0c;没有本质区别。 2. lv_group_del(g);//这个会同时删除组&#xff0c;即切断了输入设备与组的绑定。所以之后需要重新creat。&…

使用 select 进行 UART 通信的注意事项

文章目录 引言UART 通信中的 select 函数select 函数的工作原理使用 select 进行 UART 通信的注意事项示例代码 引言 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;是一种用于异步串行通信的硬件协议&#xff0c;常用于计算机和外设之间的数据交换…

Apple创始人斯蒂夫乔布斯2005年在斯坦福大学的毕业典礼演讲:Steve Jobs‘ 2005 Stanford Commencement Address

Steve Jobs’ 2005 Stanford Commencement Address Link: https://www.youtube.com/watch?vUF8uR6Z6KLc and https://www.youtube.com/watch?vHd_ptbiPoXM 文章目录 Steve Jobs 2005 Stanford Commencement AddressSummaryVocabularyTranscriptConnecting the dotsLove and …

从函数逼近角度理解神经网络、残差连接与激活函数

概述 最近思考激活函数的时候&#xff0c;突然想到神经网络中残差连接是不是和函数的泰勒展开很像&#xff0c;尤其是在激活函数 f ( x ) x 2 f(x)x^2 f(x)x2时(这个激活函数想法来源于 f ( x ) R e L U 2 ( x ) [ 3 ] f(x)ReLU^2(x)[3] f(x)ReLU2(x)[3])&#xff0c;所以验…

VC++支持断点续下或续传的功能

VC使用多线程和Socket实现断点续下 一、断点续下的基本原理&#xff1a; 1.断点续传的理解可以分为两部分&#xff1a;一部分是断点&#xff0c;一部分是续传。断点的由来是在下载过程中&#xff0c;将一个下载文件分成了多个部分&#xff0c;同时进行多个部分一起的下载&…

Adaboost集成学习 | Adaboost集成学习特征重要性分析(Python)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习特征重要性分析(Python)Adaboost(自适应增强)是一种常用的集成学习方法,用于提高机器学习算法的准确性。它通过组合多个弱分类器来构建一个强分类器。在Adaboost中,每个弱分类器都被赋予…

基于LangChain框架搭建知识库

基于LangChain框架搭建知识库 说明流程1.数据加载2.数据清洗3.数据切分4.获取向量5.向量库保存到本地6.向量搜索7.汇总调用 说明 本文使用openai提供的embedding模型作为框架基础模型&#xff0c;知识库的搭建目的就是为了让大模型减少幻觉出现&#xff0c;实现起来也很简单&a…

Ocam:高效录屏,屏幕录制最佳?

名人说&#xff1a;&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Ocam2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你…

【5】apollo编写python节点步骤及实例

在workspace/modules下新建包buildtool create --template component modules/test_one 编译包 buildtool build -p modules/test_two/ 增加自己的proto消息 在刚才自动生成的proto文件里面添加自己定义的消息,记得重新编译. syntax "proto2";package apollo;…

【python】美妆类商品跨境电商数据分析(源码+课程论文+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

使用RedisShake迁移自建Redis数据至阿里云Redis

一、前言 最近有个需求&#xff0c;需要把自建的Redis数据迁移至阿里云的Redis RDS。阿里云有官方的数据传输服务DTS&#xff08;Data Transmission Service&#xff09;。全量迁移是免费的&#xff0c;但增量迁移需要按量收费&#xff0c;遂放弃。经过一番搜索&#xff0c;发…