开发中遇到一个需求:在Vue项目中使用已经开发好的React组件。这里选择了使用vuera库来完成需求。下面记录一下使用的步骤(在Reat项目中使用Vue组件与此步骤类似)。

1. 安装vuera库

vuera库地址:https://www.npmjs.com/package/vuera
首先需要在Vue项目中安装vuera库,安装指令如下:

  1. // 使用yarn安装插件
  2. yarn add vuera
  3. // 使用npm安装插件
  4. npm i -S vuera

2. 安装依赖

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

  1. npm install --save react react-dom

在Vue中,是无法识别jsx语法的,所以需要安装依赖来识别react-jsx语法,安装指令如下:

  1. npm install @babel/plugin-transform-react-jsx

安装完成之后,在babel.config.js文件中添加这个插件即可:

  1. module.exports = {
  2. plugins: ["@babel/plugin-transform-react-jsx"]
  3. };

3. 项目配置

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

  1. import { VuePlugin } from 'vuera'
  2. Vue.use(VuePlugin)

4. 使用组件

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

  1. import React from 'react'
  2. function myReactComponent(props) {
  3. const { message } = props
  4. function childClickHandle() {
  5. props.onMyEvent('React子组件传递的数据')
  6. }
  7. return (
  8. <div>
  9. <h2>{ message }</h2>
  10. <button onClick={ childClickHandle }>向Vue项目传递React子组件的数据</button>
  11. </div>
  12. )
  13. }
  14. export default myReactComponent

Vue组件代码如下:

  1. <template>
  2. <div>
  3. <h1>I'm a Vue component</h1>
  4. <my-react-component :message="message" @onMyEvent="parentClickHandle"/>
  5. </div>
  6. </template>
  7. <script>
  8. // 引入React组件
  9. import MyReactComponent from './myReactComponent'
  10. export default {
  11. components: {
  12. 'my-react-component': MyReactComponent // 引入React组件
  13. },
  14. data() {
  15. return {
  16. message: 'Hello from React!',
  17. }
  18. },
  19. methods: {
  20. parentClickHandle(data){
  21. console.log(data);
  22. }
  23. },
  24. }
  25. </script>

这里我在一个Vue项目中引入了这个React组件,效果如下:
image.png
可以看到,这里实现了Vue到React组件的传值,并显示在了页面上。根据右上角的Chrome插件显示,这个项目中既使用到了Vue又使用到了React。
点击页面中的按钮,可以看到,数据从React子组件传递到了Vue中:
image.png
这样就简单实现了React和Vue组件之间的数据通信。

5. 其他使用方式

上面使用Vue插件的形式在Vue项目中嵌入了React组件,如果不想使用Vue插件的形式,还可以使用其他的两种形式来使用vuera库。
(1)使用wrapper组件

  1. <template>
  2. <div>
  3. <react :component="component" :message="message" />
  4. </div>
  5. </template>
  6. <script>
  7. import { ReactWrapper } from 'vuera' // 引入vuera库
  8. import MyReactComponent from './MyReactComponent' // 引入react组件
  9. export default {
  10. data () {
  11. component: MyReactComponent,
  12. message: 'Hello from React!',
  13. },
  14. components: { react: ReactWrapper }
  15. }
  16. </script>

(2)使用高阶组件的API

  1. <template>
  2. <div>
  3. <my-react-component :message="message" />
  4. </div>
  5. </template>
  6. <script>
  7. import { ReactWrapper } from 'vuera' // 引入vuera库
  8. import MyReactComponent from './MyReactComponent' // 引入react组件
  9. export default {
  10. data () {
  11. message: 'Hello from React!',
  12. },
  13. components: { 'my-react-component': ReactInVue(MyReactComponent) }
  14. }
  15. </script>