vue3第二十四节(JSX用法)

news/2024/10/21 10:05:45/

vite 创建项目的情况下
安装

javascript">npm i @vitejs/plugin-vue-jsx -D

配置vite.config.js

javascript">import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(), vueJsx()],
})

1、什么是 JSX

JSX是一种JavaScript的语法扩展,它允许在JavaScript代码中直接编写类似HTML的标记结构。Vue 3中提供了对JSX的原生支持,使得开发人员可以使用JSX编写Vue组件的模板

虽然最早是由 React 引入,但实际上 JSX 语法并没有定义运行时语义,并且能被编译成各种不同的输出形式。如果你之前使用过 JSX 语法,那么请注意 Vue 的 JSX 转换方式React 中 JSX 的转换方式**不同**,因此你不能在 Vue 应用中使用 React 的 JSX 转换。与 React JSX 语法的一些明显区别包括:

a可以使用 HTML attributes 比如 classfor 作为 props - 不需要使用 classNamehtmlFor
b传递子元素给组件 (比如 slots) 的方式不同

2、jsx 与 template 的区别

语法上有很大区别
JSX 本质就是 js 代码,可以使用 js 的任何能力
template 只能嵌入简单的 js 表达式,其他需要指令,如 v-if、for();
而JSX 中循环使用map(), 条件使用 三元运算、&& 、|| 运算符
JSX 已经成为 ES 规范,template 还是 Vue 自家规范
template 中使用的是 {{}} 双大括号,JSX 中使用的是 { } 单大括号,插值语法
本质是相同的
都会被编译为 js 代码(render 函数)

3、基本用法 在 vue3 setup 语法糖中使用jsx

父组件:

javascript"><template><div ref="myDivRef"><myCom :lists="lists"></myCom></div>
</template>
<script setup lang="jsx">
import { ref, computed, watch, onMounted } from 'vue'
// 引入子组件
import myCom from './jsxCom.vue'
// import myCom from './index.jsx'
const myDivRef = ref('myDivRef')
const lists = ref([1, 2, 3, 4, 5])
const fun = () => {<div>{lists.value.map(itm => {return <div key={itm}>name--{itm}</div>})}</div>
}
</script>

子组件:

javascript"><template>
<div class="222"><myComponent :lists="lists" ></myComponent>
</div>
</template>
<!-- setup 语法糖中使用 jsx 声明lang="jsx" -->
<script setup lang="jsx">
import { ref, defineComponent } from 'vue'
const props = defineProps({lists: Array
})
// const lists = ref([1, 2, 3, 4])
// 使用 defineComponent 定义组件
const myComponent = defineComponent({name: 'myComponent',props: {lists: Array},setup() {return () => (<div>{props.lists.value.map(itm => {return <div key={itm}>name--{itm}</div>})}</div>)}
})
</script>

自定义组件 还可以是 jsx文件

javascript">// index.jsx 文件
import { defineComponent } from 'vue'
export default defineComponent({props: {lists: Array},setup(props) {const render = () => [<div>{props.lists.map(itm => {return <div data-num={itm} key={itm} >name--{itm}</div>})}</div>]return render}
})

4、属性和事件 循环

JSX中的属性 使用为 如 key={value}不需要前面加冒号(:)
JSX中的方法 使用为 如 onClick={()=>{}} 为驼峰命名方法;以on开始,如 onClick

如需要修饰符:.passive、.capture 和 .once 等事件修饰符

javascript"><div onClickCapture={() => myClick()} />

对于事件和按键修饰符,可以使用 withModifiers 函数:

javascript"><div onClick={withModifiers(() => {}, ['self'])} />

循环使用map() 语法;而template语法中,需要使用v-for

javascript"><template>
<div class="222"><myComponent :lists="lists" ></myComponent>
</div>
</template>
<script setup lang="jsx">
import { ref, defineComponent } from 'vue'
const props = defineProps({lists: Array
})
const lists = ref([1, 2, 3, 4])
const myComponent = defineComponent({name: 'myComponent',props: {lists: Array},setup() {const myClick = (itm) => {console.log(itm)}return () => [<div>{props.lists.map(itm => {return itm % 2 === 0 && <div key={itm} onClick={() => myClick(itm)}>name--{itm}</div>})}</div>]}
})
</script>

5、使用运算符

如:&& 运算符 三元运算符

javascript"><template>
<div class="222"><myComponent :lists="lists" ></myComponent>
</div>
</template>
<script setup lang="jsx">
import { ref, defineComponent } from 'vue'
const props = defineProps({lists: Array
})
const lists = ref([1, 2, 3, 4])
const myComponent = defineComponent({name: 'myComponent',props: {lists: Array},setup() {const myClick = (itm) => {console.log(itm)}return () => [<div>{props.lists.map(itm => {// return <div key={itm} onClick={() => myClick(itm)}>name--{itm}</div>// 使用 && 运算符return itm % 2 === 0 && <div key={itm} onClick={() => myClick(itm)}>name--{itm}</div>})}</div>]}
})
</script>

三元运算:

javascript">……
return () => [<div>{props.lists.map(itm => {return itm % 2 ===0 ? <div key={itm} onClick={() => myClick(itm)}>name--{itm}</div> : <div key={`${itm}-1`} onClick={() => myClick(`${itm}-1`)}>name--{`${itm}-1`}</div>})}</div>]
……

http://www.ppmy.cn/news/1436905.html

相关文章

【笔试训练】day11

1.游游的水果大礼包 思路&#xff1a; 枚举。假设最后的答案是x个a礼包&#xff0c;y个b礼包&#xff0c;得到一个式子&#xff1a;ansa*xb*y 我们可以枚举x的数量&#xff0c;这样就能变相的把y的求出来。呃这就是鸡兔同笼问题嘛 x最大的范围是多少呢&#xff1f;也就是a礼…

如何配置nginx的转发?

配置Nginx的转发可以通过修改Nginx的配置文件来实现。以下是配置Nginx转发的基本步骤&#xff1a; 打开Nginx的配置文件&#xff0c;通常位于/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf。 在http块中添加一个新的server块&#xff0c;用于配置转发目标的基本信…

Spring 注解开发详解

1. 注解驱动入门案例介绍 1.1 需求描述 1.需求&#xff1a;实现保存一条数据到数据库。 2.表结构&#xff1a;create table account(id int primary key auto_increment,name varchar(50),money double(7,2)); 3.要求&#xff1a;使用spring框架中的JdbcTemplate和DriverMana…

简单仓库管理系统(增删改查功能)

前端 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> …

[leetcode]jump-game-iv

. - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 arr &#xff0c;你一开始在数组的第一个元素处&#xff08;下标为 0&#xff09;。 每一步&#xff0c;你可以从下标 i 跳到下标 i 1 、i - 1 或者 j &#xff1a; i 1 需满足&#xff1a;i 1 < arr.lengt…

go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控

Linux中的tail命令 tail 命令是一个在 Unix/Linux 操作系统上用来显示文件末尾内容的命令。它可以显示文件的最后几行内容&#xff0c;默认情况下显示文件的最后 10 行。tail 命令 非常有用&#xff0c;特别是在我们查看日志文件或者监视文件变化时。 基本用法如下&#xff1a…

npm镜像源的查看和切换

前言 原域名https://registry.npm.taobao.org/ 原来的淘宝镜像已经不行了,当npm去taobao时,会出现一个证书过期的提示. 下面的是最新的地址: 切换到淘宝镜像(最新的地址) #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com…

MyCat 数据库中间件

一、介绍 1、单数据库进行数据存储的问题&#xff1a; IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足以容纳这些热点数据&#xff0c;产生大量磁盘IO&#xff0c;效率较低。 CPU瓶颈&#xff1a;排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源。 2、…