跨框架的浪漫:在Vue中优雅地使用React组件

1,309 阅读2分钟

背景

需求要实现一个颜色选择器(来自Ant Design组件库),样式如下:

查看 Ant Design Vue 官方文档未找到该组件

Github Issues中搜索颜色选择器,参考issue,可以得出以下信息:

1、Ant Design V5版本中已提供 ColorPicker 组件,已有开发者将Vue版本的ColorPicker组件提交到feature分支,因某种原因至今未合并到main分支🤔

市面上也有其它ColorPicker组件,若想改造成设计稿的样式,看起来不复杂,实际并不简单😵

突发奇想,既然Ant Design中已有该组件,如果通过某种方式能够让react组件在vue组件中使用,岂不美哉😋;

查询资料有两种可行方式:

1、将 React 组件封装成 Web Components,然后在 Vue 组件中使用;

2、借助第三方插件,如vue-reactvuerareact-to-vueveaury等,此处不一一列举了。

实践过程中,尝试使用方式1没有成功😢,可能是姿势不对吧,有兴趣的小伙伴可以去尝试一番;

故本篇采用方案2,综合更新频率、下载量等指标,最终选择 veaury 来实现

实现步骤

1. 安装必要的依赖

npm install antd@5.22.3 react@18.3.1 react-dom@18.3.1 veaury@2.5.1

⚠️下图来源于veaury官方文档,若不固定版本,需要根据文档做一些配置

2. 创建Vue组件并引入React组件

<script lang="ts" setup>
import { applyPureReactInVue } from 'veaury'
import { ColorPicker } from 'antd'
import type { Color } from 'antd/es/color-picker'

// 使用Veaury将React组件转换为Vue组件
const VueColorPicker = applyPureReactInVue(ColorPicker)
// 定义Vue的模型
const postColor = defineModel('value', {
  type: Array,
  required: true,
})
// 定义React组件的属性
const reactProps = reactive({
  defaultValue: 'rgb(22, 119, 255)',
  defaultFormat: 'rgb',
  disabledAlpha: true,
  destroyTooltipOnHide: true,
  // 颜色变化的回调
  onChange: (color: Color) => {
    const { r, g, b } = color.toRgb()
    postColor.value = [r, g, b]
  },
  // 颜色格式变化的回调
  onFormatChange: (format: string) => {
    console.log(format)
  },
})
// 在组件挂载前设置默认颜色值
onBeforeMount(() => {
  const [r, g, b] = postColor.value
  reactProps.defaultValue = `rgb(${r}, ${g}, ${b})`
})
</script>

<template>
  <VueColorPicker v-bind="reactProps" />
</template>

⚠️注意事项:

1、属性和方法都通过props传递

2、不支持使用v-model做双向数据绑定

3. 使用组件

在你的Vue组件中使用这个新的ColorPicker组件:

<template>
  <div>
    <ColorPicker v-model:value="color" />
    <p>Selected Color: {{ color }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import ColorPicker from './components/ColorPicker.vue'
const color = ref([22, 119, 255])
</script>

基本原理

使用 react-dom 的 render 方法将 React 组件挂载到 Vue 组件的 DOM 节点上

性能问题

打包表现:

使用veaury不使用
体积61.6M57.7M

由于需要同时加载Vue和React的Runtime,会导致打包体积变大,内存占用增加;

小尾巴🚩

1、veaury不仅可以在vue组件中使用react组件,反之亦然,目前对veaury的掌握还不足30%,有兴趣的小伙伴可以查阅官方文档了解更多;

2、veaury有使用上的限制,非必要不推荐使用,尤其是复杂的组件,会增加维护难度;

3、veaury会有不可避免的性能问题,追求高性能的项目不建议使用