【React】vue-cli项目中内嵌react

314 阅读2分钟

简单记录一下把react内嵌到vue-cli项目的过程

  1. 添加tsxloader配置,使用babel-loader,添加@babel/prset-react@babel/preset-typescript

    不使用tsx的话,也要设置jsx的loader,用babel-loader,并添加@babel/preset-react

    vue-cli中内置了对jsx的处理,不过那个编译后的结果为vuerender函数

  2. 添加tsconfig.json配置文件,添加react-src目录作为react相关内容的根目录

    记得修改tsconfigts文件目录配置、也可以配置#react-src,在vue-cli中也需要配置

  3. react-src中新建main.tsxApp.tsx,并在main.tsx中导出一个render函数,内容大概如下:

// ... 省略import代码

// 创建一个div元素作为react根元素
const rootElem = document.createElement('div');

ReactDOM.createRoot(rootElem).render(<App />);

// 渲染就是把rootElem放到container中
export default function render(container: HTMLDivElement) {
    container.append(rootElem)
}
  1. vue项目的合适位置增加一个div元素用于存放react根元素,给这个div元素一个设置key属性,然后使用这个元素作为参数去调用main.tsx中的render方法,这样就可以让vue中出现react渲染的内容

  2. 如果要使用react-router-dom,则需要在vue中设置一个不带component属性的路由,如果vue中没有*匹配路由的话,应该也可以不设置,设置这个路由的目的是防止vue去渲染别的内容

    可以在路由上添加一个showReactmeta数据,在vue组件中读取这个属性值后切换渲染vue内容与react内容

    这里需要注意的是,vuereact中监听路由变化用的是popstate事件,它们各自推进路由变化所用的history.pushState方法并不会触发这个事件,所以需要分别监听vuereact中触发的路由变化,并调用window.loacion.replace方法替换一下当前链接,主要是为了触发popstate事件

    vue中可以通过watch $route来实现,在react中,可以在App.tsx中使用useEffect监听useLocation返回值的变化

  3. react中常用到css module来实现类名不冲突,这个功能vue-cli已经自带了,但是其配置的类名不太好,可以手动设置一下,下面是vue.config.ts中的简单配置

// vue.config.ts
export default {
    // ...省略其他内容
    css: {
        // 必须要设置
        requireModuleExtension: true,
        loaderOptions: {
            css: {
                modules: {
                    // 建议开发用`[path][name]__[local]`
                    // 建议生产用`[hash:base64]`
                    localIdentName: ''
                }
            }
        }
    }
}
  1. 大概就这个步骤吧,哈哈