vue3第二十四节(JSX用法)

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>]
......
相关推荐
2501_946230987 小时前
Cordova&OpenHarmony通知中心实现
android·javascript
南山安7 小时前
JavaScript 函数柯里化:从入门到实战,一文搞定(面试可用)
javascript·面试·函数式编程
谢尔登7 小时前
Monorepo 架构
前端·arcgis·架构
啃火龙果的兔子7 小时前
JavaScript 中的 Symbol 特性详解
开发语言·javascript·ecmascript
栀秋6667 小时前
你会先找行还是直接拍平?两种二分策略你Pick哪个?
前端·javascript·算法
漂流瓶jz8 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·css
xhxxx8 小时前
传统工具调用太痛苦?LangChain 一键打通 LLM 与真实世界
前端·langchain·llm
南山安8 小时前
LangChain学习:Memory实战——让你的大模型记住你
前端·javascript·langchain
武昌库里写JAVA8 小时前
iview-CRUD模板
vue.js·spring boot·sql·layui·课程设计
BD_Marathon9 小时前
Promise基础语法
开发语言·前端·javascript