竟然可以在一个项目中混用 Vue 和 React?

news2025/1/10 10:46:01

React和Vue是前端开发中的两大热门框架,各自都有着强大的功能和丰富的生态系统。然而,你有没有想过,在一个项目中同时使用React和Vue?是的,你没有听错,可以在同一个项目中混用这两个框架!本文就来分享 3 个用于混合使用 React 和 Vue 的工具!

#Veaury

Veaury 是一个基于 React 和 Vue3 的工具库,主要用于React和Vue在一个项目中公共使用的场景,主要运用在项目迁移、技术栈融合的开发模式、跨技术栈使用第三方组件的场景。

Veaury的特点如下:

  1. 同时支持Vue3和React,方便在一个项目中公共使用;

  2. 支持同一个应用中出现的vue组件和react组件的context共享;

  3. 支持跨框架的hooks调用,可以在react组件中使用vue的hooks,也可以在vue组件中使用react的hooks;

  4. 可以解决React和Vue在公共使用时的代码重复、冗余的问题。

  5. 在一个应用中可以随意使用React或者Vue的第三方组件, 比如 antd, element-ui, vuetify。

  6. 提供了详细的官方文档,包括英文版和中文版。

图片

Veaury 的文档写的非常详细,这里就不再详细介绍其使用方式了。需要注意的是,Veaury 并不支持 Vue 2,如果需要使用Vue 2,可以使用下面要介绍的工具库。

Github:https://github.com/devilwjp/veaury

#Vuera

Vuera 是一个用于在 Vue 应用中使用 React 组件的库,同时也支持在 React 应用中使用 Vue 组件。它提供了一种方便的方式,使开发人员能够在不同的框架之间无缝地使用对方的组件。

要在 Vue 应用中使用React组件,可以按照以下步骤使用Vuera。

#安装插件

  1. 安装Vuera:使用npm或yarn在您的Vue项目中安装Vuera库。
// 使用 yarn 安装

yarn add vuera



// 使用 npm 安装

npm i -S vuera
  1. 安装依赖

由于需要在Vue中使用React组件,所以首先需要在项目中安装 React,安装指令如下:

npm install --save react react-dom

#项目配置

babel.config.js文件中添加以下配置即可:

{

  "presets": [

    "react"

  ],

  "plugins": [

    "vuera/babel"

  ]

}

接下来在项目中以插件的形式来引入并使用vuera库,可以在 main.js 中加入如下代码:

import { VuePlugin } from 'vuera'

Vue.use(VuePlugin)

#基本使用

完成上述配置之后,就可以在Vue项目中引入并使用React组件了。

React组件代码如下:

import React from 'react'



function myReactComponent(props) {

  const { message } = props

  function childClickHandle() {

    props.onMyEvent('React子组件传递的数据')

  }

  return (

    <div>

      <h2>{ message }</h2>

      <button onClick={ childClickHandle }>向Vue项目传递React子组件的数据</button>

    </div>

  )

}



export default myReactComponent

Vue组件代码如下:

<template>

    <div>

        <h1>I'm a Vue component</h1>

        <my-react-component :message="message" @onMyEvent="parentClickHandle"/>

    </div>

</template>



<script>

    // 引入React组件

    import MyReactComponent from './myReactComponent'



    export default {

        components: {

            'my-react-component': MyReactComponent  // 引入React组件

        },

        data() {

            return {

                message: 'Hello from React!',

            }

        },

        methods: {

            parentClickHandle(data){

                console.log(data);

            }

        },

    }

</script>

在 Vue 项目中引入了这个 React 组件,效果如下:

图片

可以看到,这里实现了Vue到React组件的传值,并显示在了页面上。根据右上角的Chrome插件显示,这个项目中既使用了Vue又使用了React。

点击页面中的按钮,可以看到,数据从React子组件传递到了Vue中:

图片

这样就简单实现了React和Vue组件之间的数据通信。

#其他使用方式

如果不想通过 Babel plugin 的方式引入的话,可以使用以下这两种方法。(1)使用wrapper组件

<template>

  <div>

    <react :component="component" :message="message" />

  </div>

</template>



<script>

  import { ReactWrapper } from 'vuera'  // 引入vuera库

  import MyReactComponent from './MyReactComponent'  // 引入react组件



  export default {

    data () {

      component: MyReactComponent,

      message: 'Hello from React!',

    },

    components: { react: ReactWrapper }

  }

</script>

(2)使用高阶组件的API

<template>

  <div>

    <my-react-component :message="message" />

  </div>

</template>



<script>

  import { ReactWrapper } from 'vuera'  // 引入vuera库

  import MyReactComponent from './MyReactComponent'  // 引入react组件



  export default {

    data () {

      message: 'Hello from React!',

    },

    components: { 'my-react-component': ReactInVue(MyReactComponent) }

  }

</script>

在 React 项目中使用 Vue 组件也是同理,可以参考官方文档。

#注意

Vuera 是一个比较成熟的 JavaScrip 库,但是目前已经不再维护(最近一次更新是三年前)。并且,该库不支持 Vue 3,如果想要支持 Vue 3,可以使用 Vueury。

Github:https://github.com/akxcv/vuera

#vuereact-combined

vuereact-combined 是一个用于 Vue和React快捷集成的工具包,并且适合复杂的集成场景。通过这个工具,可以在任何的Vue和React项目中使用另一个类型框架的组件,并且解决了复杂的集成问题。

vuera 开辟了Vue和React融合的想法,但是 vuera只能解决非常基础的组件融合,并且存在插槽(children)和数据变更后的渲染性能问题,因此无法用于复杂的场景以及生产环境。

vuereact-combined 将融合做到了极致,支持了大部分的Vue和React组件的功能,并且在渲染更新上使用了和vuera不同的思路,完美解决了渲染性能问题

图片

注意,该项目只支持使用 Vue 2,如果想要使用 Vue 3,可以使用上面的介绍的 Veaury。

使用vuereact-combined的步骤如下。

#安装插件

在项目中安装vuereact-combined:

npm install --save vuereact-combined

#项目配置

在Vue和React的入口文件中引入 vuereact-combined

import Vue from 'vue';  

import React from 'react';  

import {Combined} from 'vuereact-combined';  



Vue.use(Combined);

配置Babel以支持JSX语法和Vue.js的特性。安装babel-plugin-transform-vue-jsxbabel-preset-react,并在.babelrc文件中添加相应的配置:

{  

  "presets": ["react-app"],  

  "plugins": ["@vue/babel-plugin-transform-vue-jsx"]  

}

在webpack配置文件中添加相应的loaderplugin

const VueLoaderPlugin = require('vue-loader/lib/plugin');  

module.exports = function(webpackEnv) {  

  module: {  

    rules: [  

      {  

        test: /\.vue$/,  

        loader: 'vue-loader',  

      },  

      {  

        test: /\.js$/,  

        exclude: /node_modules\/(?!(vue|@vue\/.*)\/).*/,  

        use: {  

          loader: 'babel-loader',  

          options: {  

            presets: ['@babel/preset-env'],  

            plugins: ['@babel/plugin-transform-vue-jsx']  

          }  

        }  

      },  

      // 其他规则...  

    ],  

  },  

  plugins: [  

    new VueLoaderPlugin(),  

    // 其他插件...  

  ],  

};

配置完毕后,就可以在Vue和React之间进行快捷的集成了。

#基本使用

假设有一个React组件,它是一个简单的函数组件:

// 来自React项目的组件

const MyReactComponent = () => {

  return <div>Hello React!</div>;

};

可以在Vue项目中引入并使用这个组件。下面是一个使用vuereact-combined的Vue文件示例:

<template>

  <div>

    <MyReactComponent />

  </div>

</template>



<script>

import {Combined} from 'vuereact-combined';

import MyReactComponent from './MyReactComponent'; // 引入React组件



export default {

  components: {

    Combined,

    MyReactComponent // 将React组件注册为Vue组件

  },

  // 其他Vue代码...

};

</script>

这里,首先引入了MyReactComponent,然后在Vue组件中使用它。通过将React组件注册为Vue组件,我们可以在Vue模板中使用它,就像使用普通的Vue组件一样。

这里只展示了最基本的使用方法,其他使用场景可以参考官方文档。

#注意事项

  • 在Vue项目中使用第三方的React组件:第三方的react组件已经是通过babel进行过处理,不包含 React 的 jsx。此情况下,可以直接在项目中使用applyReactInVue对第三方的 React 组件进行处理。

  • 在React项目中使用第三方的Vue组件:第三方的Vue组件已经是通过vue-loader和babel进行过处理,不包含.vue文件以及Vue的jsx。此情况下,可以直接在项目中使用applyVueInReact对第三方的Vue组件进行处理。

在 React 项目中引入Vue组件的支持程度:

图片

在 Vue 项目中引入 React 组件:

图片

Github: https://github.com/devilwjp/vuereact-combined

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

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

相关文章

redis学习(一)——初识redis

redis学习&#xff08;一&#xff09;——初识redis 非关系型数据库 redis是非关系型数据库&#xff0c;和mysql不同&#xff0c;redis中的所有数据都是以key&#xff1a;value形式存在的 两者区别 SQL | NoSQL 结构化 | 非结构化 关联的 | 无关联 sql查询 | 非sql ACI…

[python 刷题] 22 Generate Parentheses

[python 刷题] 22 Generate Parentheses 题目&#xff1a; Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. 这里 well-formed 指的就是合法的括号配对&#xff0c;这里会提两个解 第一个是暴力解&#xff0c;也就…

服务注册发现_服务发现Discovery

修改payment8001的Controller /*** 支付控制层*/ Slf4j RestController public class PaymentController {Autowiredprivate DiscoveryClient discoveryClient;GetMapping("/payment/discovery")public Object discovery(){// 获取所有微服务信息List<String>…

栈和队列2——队列的实现

栈和队列2——队列的实现 一&#xff0c;前言二&#xff0c;队列的定义三&#xff0c;队列的结构四&#xff0c;队列的实现4.1队列初始化4.2队列的销毁4.3队列的尾插4.4队列的删除4.5找队头的数据4.6找队尾的数据4.7判断为空4.8计算长度 五&#xff0c;小结 一&#xff0c;前言…

STL常用遍历,查找,算法

目录 1.遍历算法 1.1for_earch 1.2transform 2.常用查找算法 2.1find&#xff0c;返回值是迭代器 2.1.1查找内置数据类型 2.1.2查找自定义数据类型 2.2fin_if 按条件查找元素 2.2.1查找内置的数据类型 2.2.2查找内置数据类型 2.3查找相邻元素adjeacent_find 2.4查找指…

简易介绍如何使用拼多多商品详情 API。

拼多多&#xff08;Pinduoduo&#xff09;是中国一家快速发展的电商平台&#xff0c;为了帮助开发者更好地接入拼多多&#xff0c;平台提供了丰富的 API 接口供开发者使用&#xff0c;其中包括获取拼多多商品详情的 API。接下来&#xff0c;我们将介绍如何使用拼多多商品详情 A…

重学 HashMap

文章目录 1.从 Map 接口入手1.1 从 JDK 1.0 的 Dictionary\<K,V\> 抽象类讲起1.2 Map 接口中的集合视图又是怎样的&#xff1f;1.3 为什么 JDK 官方不推荐使用可变对象作为 Map 的键&#xff1f;1.4 为什么映射不应该将自己作为键&#xff0c;而可以作为值&#xff1f;1.…

python基于轻量级卷积神经网络模型开发构建眼疾识别系统

常见的眼疾包括但不限于以下几种&#xff1a; 白内障&#xff1a;白内障是眼睛晶状体变得模糊或不透明&#xff0c;导致视力下降。它通常与年龄相关&#xff0c;但也可以由其他因素引起&#xff0c;如遗传、外伤、糖尿病等。 青光眼&#xff1a;青光眼是一组引起视神经损伤的眼…

HTTP 协议的定义,工作原理,Fiddler的原理和使用,请求的内容

文章目录 一. HTTP协议是什么?1.HTTP工作原理2.HTTP协议格式2.1抓包工具的原理2.2抓包工具的使用2.3 HTTP协议的内容请求首行请求头(header)空行正文(body) 一. HTTP协议是什么? HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议. "超文本"是指…

异步电机直接转矩控制学习

导读&#xff1a;本期文章对异步电机直接转矩控制进行梳理。DTC包括转速外环、磁链观测器、滞环和电压矢量离线开关表。离线电压矢量开关表共分为两种&#xff1a;添加零矢量和未添加零矢量。 如果需要文章种的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&am…

同城配送商城小程序的作用是什么

本地生活服务如餐饮、服装、鲜花、百货等产品都具备同城经营属性&#xff0c;在产品销售方面普遍是以实体店为主做三公里生意&#xff0c;而随着互联网线上深入&#xff0c;很多商家会通过进驻外卖平台获得生意&#xff0c;当然也有越来越多的商家选择自建商城完成品牌的配送平…

机器学习第十四课--神经网络

总结起来&#xff0c;对于深度学习的发展跟以下几点是离不开的: 大量的数据(大数据)计算资源(如GPU)训练方法(如预训练) 很多时候&#xff0c;我们也可以认为真正让深度学习爆发起来的是数据和算力&#xff0c;这并不是没道理的。 由于神经网络是深度学习的基础&#xff0c;学…

AIGC(生成式AI)试用 6 -- 桌面小程序

生成式AI&#xff0c;别人用来写作&#xff0c;我先用来写个桌面小程序。 桌面小程序&#xff1a;计算器 需求 Python开发图形界面&#xff0c;标题&#xff1a;计算器 - * / 基本运算计算范围&#xff1a;-999999999 ~ 999999999** 乘方计算&#xff08;例&#xff0c;2*…

c==ubuntu+vscode debug redis7源码

新建.vscode文件夹&#xff0c;创建launch.json和tasks.json {"version": "0.2.0","configurations": [{"name": "C/C Launch","type": "cppdbg","request": "launch","prog…

人工智能轨道交通行业周刊-第61期(2023.9.18-9.24)

本期关键词&#xff1a;焊线机器人、智能综合运维管理系统、信号平面图、铁路部门架构、书生浦语大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通…

确知波束形成matlab仿真

阵列信号处理中的导向矢量 假设一均匀线性阵列&#xff0c;有N个阵元组成&#xff0c;满足&#xff1a;远场、窄带假设。 图1. 均匀线性阵模型 假设信源发射信号&#xff0c;来波方向为 θ \theta θ&#xff0c;第一个阵元接收到的信号为 x ( t ) x(t) x(t)&#xff0c;则第…

mybatsi-MyBatis的逆向工程

mybatsi-MyBatis的逆向工程 一、前言二、创建逆向工程的步骤1.添加依赖和插件2.创建MyBatis的核心配置文件3.创建逆向工程的配置文件4.执行MBG插件的generate目标 一、前言 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。 Hibernate是支…

Nitrux 3.0 正式发布并全面上市

导读乌里-埃雷拉&#xff08;Uri Herrera&#xff09;近日宣布 Nitrux 3.0 正式发布并全面上市&#xff0c;它是基于 Debian、无 systemd、不可变的 GNU/Linux 发行版的最新安装媒体&#xff0c;利用了 KDE 软件。 Nitrux 3.0 由带有 Liquorix 味道的 Linux 6.4.12 内核提供支持…

每日一题~把二叉搜索树转换为累加

原题链接&#xff1a;538. 把二叉搜索树转换为累加树 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 通过描绘二叉搜索树转换累加树的过程&#xff0c;我们发现转换的过程是从右往左依次相加的&#xff0c;新节点的值 右边节点的值的和 …

HTML怎么使用角度代码调节一个角的角度

文章目录 概要整体架构流程 概要 我们在用代码做图形的时候&#xff0c;用的矩形和圆形比较多&#xff0c;如果遇到只改变其中一个角的角度&#xff0c;这时又该怎么做呢 整体架构流程 如图&#xff0c;这是建立的一个正圆的代码&#xff0c;其调节角度的属性代码是border-ra…