用JSX来写Vue3,瞬间找到React 的感觉

news2025/1/23 7:10:41

Ⅰ. vue3 的 JSX 写法

  • 对于熟悉react 的小伙伴, 可以通过 jsx 来 做 vue3
  • 喜欢 jsx 写法做 vue,代码结构更加美观,
  • 让我们一起来踩坑 👇

文章目录

    • Ⅰ. vue3 的 JSX 写法
    • Ⅱ. JSX 安装和配置
        • 1. 通过 webpack 构建的
        • 2. 通过 vite 构建的
    • Ⅳ. JSX 的 在vue 的应用
        • 1. JSX => 两种写法
        • 2.JSX => 父子组件通信
        • 3. JSX => 用v-if 、v-show
        • 4. JSX => 用 v-for
        • 5. JSX => 插槽的使用
    • Ⅳ. JSX 从头搭建 vue3
        • 1. 主文件和入口
        • 2. 配置路由

在这里插入图片描述

Ⅱ. JSX 安装和配置

1. 通过 webpack 构建的

如果是通过官方 vue-cli 脚手架去创建的则需要如下操作 👇

安装 [ 第 一 步 ]

npm install @vue/babel-plugin-jsx -D

配置 [ 第 二 步 ]

配置根目录 babel.config.js 👇

module.exports = {
  plugins: ["@vue/babel-plugin-jsx"]   // 省略其他配置
}

2. 通过 vite 构建的

如果是通过去 vite 去创建的则需要如下操作 👇

安装 [ 第 一 步 ]

npm i @vitejs/plugin-vue-jsx

配置 [ 第 二 步 ]

配置根目录 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
  ]
  //...省略其他配置
})


Ⅳ. JSX 的 在vue 的应用

1. JSX => 两种写法

① 写法一 : ⭐⭐⭐

不需要 props 来传参 , 简写

import { defineComponent } from 'vue';
export default defineComponent((props, {emits}) => {
  return () => <div> 写法1  </div>
})
  • defineComponent 去传入一个 函数 ( 会默认为 setup )

  • 写法方便, 因为 无法去定义 props , 所以 props 一直为空对象

  • 但是可以正常使用 emits 和 slots 等

② 写法二 : ⭐⭐⭐⭐⭐

需要 props 传参

import { defineComponent } from 'vue';
export default defineComponent({
  props:{
	params:{ 
	  type: String, 
	  defualt: ()=> ''
	}	
  },
  setup(props) {
    return () => <div>  写法2  ,  父组件传过来的值 { props.params }  </div>
  }
})
  • defineComponent 去传入一个 整个对象
  • 可以定义props ,可以使用 (父组件 => 子组件) 值
  • 复杂的场景,更加推荐,使用起来更加灵活

2.JSX => 父子组件通信

父组件: (Father.jsx) 👇

import { defineComponent, ref } from 'vue';
import Child from './Child.jsx'
export default defineComponent(() => {
  const params = ref('123')
  function getChild(val){ 
  	console.log(val)
  }
 
  return () => <div>
  	 <h3>子组件↓ </h3>
    <Child   params={  params.value }  onFather={ getChild }  />
  </div>;
})

子组件 : (Child.jsx) 👇

import { defineComponent, ref } from 'vue';
export default defineComponent({
  props: ['params'],
  setup(props , { emit }) {
  	const text = ref('传给父组件的值')
    return () => 
    <div>
      	父组件传来的值: { props.params }
      	<button onClick = {()=>{ emit('father', text.value) } }> 传给 father </button>
    </div>
  }
})
  • 第二种可以定义 props 的写法,才可以接收 父组件传递的参数
  • emit 给父组件通信,父组件自定义 方法 要 加 on + 大写开头方法

3. JSX => 用v-if 、v-show

const visble = ref(true)
const onOff =() => { visble.value = !visble.value }
return () => <div>
    <button onClick= { onOff }> 开关 </button>
	{ visble.value && <span>'内容...'</span> }
</div>
  • v-if 没办法正常使用 , 可以通过表达式代替
  • v-show 可以正常使用

4. JSX => 用 v-for

v-for 可以通过 map 代替

const list = [ {name:'张三'}, {name: '李四'}]
const onOff =() => { visble.value = !visble.value }
return () => <ul>
   {list.map(res => <li>{res.name}</li>)}
</ul>

5. JSX => 插槽的使用

父组件: 👇

<Page2  v-slots={{  
        aaa: () => <span>123</span> ,
        bbb: () => <span>456</span> 
 }} />

子组件: 👇

 setup(props, { slots }) {
    return () => 
    <div>
       我是插槽aaa:  {slots.aaa && slots.aaa()}  <br>
       我是插槽bbb:  {slots.bbb && slots.bbb()}
    </div>
  • 通过 v-slots 返回对象,对象的每个属性为一个函数 ,返回对应的文本标签
  • 根据函数的名称,调用对应的方法,来放置具名插槽的位置
  • 先做个插槽的判空操作,会更加严谨

Ⅳ. JSX 从头搭建 vue3

我们用 jsx 去替代所有的 vue 文件, 从头搭建开始如下 👇

1. 主文件和入口

我们将App.vue 改成 App.jsx

参考如下 : 主文件(main.js) 👇

import { createApp } from "vue";
import App from "./App.jsx";
import router from './router';

const app = createApp(App);
app
.use(router)
.mount("#app");

参考如下 : App.jsx 👇 , 来实现人口文件

import { defineComponent } from 'vue';
import { useRouter } from "vue-router";
export default defineComponent(() => {
  const router = useRouter();
  return () => <div>
  	<button onClick = { ()=> router.push('/page1') } > 页面1 </button>
  	<button onClick = { ()=> router.push('/page2') } > 页面2 </button>
    <router-view></router-view>
  </div>
})

2. 配置路由

参考如下 👇

import { createRouter, createWebHistory } from 'vue-router'
const routerHistory = createWebHistory()

 const router = createRouter({
    history: routerHistory,
    routes: [
      {
        path: '/',
        component: () => import('../App.jsx'),
        redirect:'/page1',
        children: [
          { path: '/page1',  component: () => import('../views/page1.jsx') }
          { path: '/page2',  component: () => import('../views/page2.jsx') }
        ]
      }
    ]
})
export default router;

在这里插入图片描述

🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

在这里插入图片描述

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

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

相关文章

Yocto buildhistory介绍

Yocto buildhistory介绍 在yocto中会频繁的编译修改镜像&#xff0c;当多人多次修改镜像的时候会导致镜像难以维护&#xff0c;我们希望能有一个类似git一样的工具能够显示每次编译的差异性修改&#xff0c;这样当我想要回退到某个日期的某个镜像时能够清晰的知道镜像内部的具…

Dockerfile文件详解

组成部分 说明 基础镜像信息 使用 FROM 关键字指定基础镜像信息&#xff0c;必须是 Dockerfile 文件的第1条指令。 维护者信息 使用 MAINTAINER 关键字指定&#xff0c;可以使用 Dockerfile 文件创建者的姓名或者电子邮件作为维护者信息。 镜像操作指令 每执行一条镜像操…

vue3+Element-plus el-select 下拉选择 多选增加全选封装组件

一、效果图&#xff08;含适用于条件查询组件中使用&#xff09; 二、参数配置 1、代码示例&#xff1a; <t-selectplaceholder"请选择工序"v-model"selectVlaue":optionSource"state.stepList"valueKey"label"change"selec…

部署SpringBoot+Vue3 项目实战,打造企业级在线办公系统

文章目录一、安装docker二、安装2.1. 安装mysql2.2. 安装MongoDB2.3. 安装Redis程序2.4. 安装RabbitMQ2.5. 在云主机上面开放端口三、部署后端项目3.1. 下载JDK镜像3.2. 部署工作流项目3.3. 部署emos-api项目四、在Docker中部署前端项目4.1. 修改前端代码4.2. 打包VUE项目4.3. …

【Hack The Box】linux练习-- time

HTB 学习笔记 【Hack The Box】linux练习-- time &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月24日&#x1f334; &#x1f36d…

Android~Compose脚手架和Toast

系列文章目录 Android~Compose初探Android~Compose之自定义ViewAndroid~Compose相关概念总结Android~Compose脚手架和ToastAndroid~Compose路由Navigation和传参 文章目录系列文章目录目标脚手架基于Snackbar自定义Toast实现效果目标 熟悉Compose中脚手架使用自定义Toast样式…

人工智能轨道交通行业周刊-第24期(2022.11.21-11.27)

追风赶月莫停留&#xff0c;平芜尽处是春山。 --《田歆华夏说》 本期关键词&#xff1a;BIM应用、地铁控制中心、车辆检修智能化、模型轻量化、隧道通风 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交…

【树莓派不吃灰】Linux篇⑥ 正规表示法与文件格式化处理(核心概念)

目录1. 什么是正则表示法2. 基础正规表示法&#xff08;grep、sed&#xff09;3. 延伸正规表示法4. 文件的格式化与相关处理&#xff08;printf、awk&#xff09;5. 重点回顾❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-11…

FPGA实现视频拼接,纯逻辑资源搭建,提供4套工程源码和技术支持

目录1.本方案的实用价值2.总体设计方案3.视频拼接方案算法4.工程1&#xff1a;单路视频输出5.工程2&#xff1a;2路视频拼接输出6.工程3&#xff1a;3路视频拼接输出7.工程4&#xff1a;4路视频拼接输出8.上板调试验证9.福利&#xff1a;工程源码获取1.本方案的实用价值 FPGA实…

【软件测试】测试与开发一对欢喜冤家......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 大伙普遍的看法&…

28.开机默认启动系统-ubuntu和win10

在win10下安装了Ubuntu20.04系统&#xff0c;默认情况下&#xff0c;启动的是Ubuntu系统。 要将默认启动系统设置成win10&#xff0c;方法如下&#xff1a; 1、进入ubuntu系统&#xff0c;按住CtrlAltT键&#xff0c;打开终端。 2、输入命令&#xff1a; sudo gedit /etc/d…

TCP常见问题

一、TCP连接的保活机制 在一段时间内&#xff0c;如果TCP连接两方都没有数据交互&#xff0c;TCP的保活机制**&#xff08;TCP keepalive&#xff09;**会起作用&#xff0c;每隔一个时间段会发送一个探测报文&#xff0c;如果连着好几个探测报文都没有得到相应&#xff0c;则…

Buffer Pool详解

文章目录一、简介二、缓存页三、Free链表四、Flush链表五、LRU链表六、脏页刷新七、多个Buffer pool八、Chunk单位一、简介 ​ mysql的数据都是存放在磁盘下的&#xff0c;为了加快cpu从磁盘i/o读取数据的效率&#xff0c;Innodb存储引擎在cpu和磁盘中间添加了一个缓冲区buffe…

web表格(详解)

目录 1.概述 2.表格的基本结构 3.表格的属性 4.单元格合并 1.概述 表格的基本语法结构&#xff1a; <table><tr><td>单元格内容</td>……</tr><tr><td>单元格内容</td>……</tr> </table> 其中< table>…

[附源码]SSM计算机毕业设计视屏网站论文JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C++ Primer Plus第五版笔记(p51-100)

45 46 常量指针必须初始化 47 一条语句可以定义出不同类型的变量 int i10, *p&i,&r i; 48 应该是int p 而不是int p 49 **表示指向指针的指针 p52 50 指针是对象&#xff0c;所以存在对于指针的引用 int *p; int *&rp; 51 在默认状态下 &#xff0c;const对象只…

【教材】2022/11/27[指针] 指针与函数基础

程序&#xff1a;求10个数的最大数 1、定义指向函数的指针变量调用函数的方法 一般定义形式为&#xff1a;类型名 &#xff08;*指针变量名)()&#xff1b; #include<stdio.h> int main() {int i, m, a[10], max(int* p);int (*f)();for (i 0; i < 10; i)scanf_s(&q…

day7【代码随想录】移除链表元素

文章目录一、链表定义二、移除链表元素&#xff08;力扣203&#xff09;1、直接使用原来的链表来进行删除操作2、设置一个虚拟头结点在进行删除操作三、删除链表中的节点&#xff08;力扣237&#xff09;一、链表定义 public class ListNode {// 结点的值int val;// 下一个结点…

如何安装Jmeter监控服务器资源插件(JMeterPlugins + ServerAgent 方法二)?

一、服务器端插件 1、下载链接:https://pan.baidu.com/s/1Is1kuC656cB0mC4vOLHyhw?pwd12f1 提取码:12f1 &#xff08;或者这个下载服务器插件&#xff1a;ServerAgent 下载地址&#xff1a;https://github.com/undera/perfmon-agent&#xff09; 2、服务器端插件 将下载的Se…

Redis最全详解(一)——基础介绍

Redis介绍 redis是基于内存可持久化的日志型、Key-Value数据库。redis安装在磁盘&#xff0c;但是数据存储在内存。非关系型数据库NoSql。开源免费&#xff0c;遵守BSD协议&#xff0c;不用关注版权问题。 redis作者github&#xff1a;github.com/antirez redis是一种基于键…