svelte5中使用react组件
在svelet5中导入并使用react组件库
- svelte5中使用react组件
svelte5中使用react组件
在svelet5中导入并使用react组件库, 示例项目地址:https://github.com/shenshouer/my-svelte-react
在svelte5中当前还有问题,无法将children传递到react中渲染
- 使用svletkit创建项目
$ npx sv create my-svelte-react
% npx sv create my-svelte-react
┌ Welcome to the Svelte CLI! (v0.6.10)
│
◇ Which template would you like?
│ SvelteKit minimal
│
◇ Add type checking with Typescript?
│ Yes, using Typescript syntax
│
◆ Project created
│
◇ What would you like to add to your project? (use arrow keys / space bar)
│ none
│
◇ Which package manager do you want to install dependencies with?
│ pnpm
│
◆ Successfully installed dependencies
│
◇ Project next steps ─────────────────────────────────────────────────────╮
│ │
│ 1: cd my-svelte-react │
│ 2: git init && git add -A && git commit -m "Initial commit" (optional) │
│ 3: pnpm run dev --open │
│ │
│ To close the dev server, hit Ctrl-C │
│ │
│ Stuck? Visit us at https://svelte.dev/chat │
│ │
├──────────────────────────────────────────────────────────────────────────╯
│
└ You're all set!
$ cd my-svelte-react
$ pnpm install
$ pnpm dev
- 安装react相关依赖
$ pnpm i react react-dom
$ pnpm i --save-dev @types/react @types/react-dom
$ pnpm add @vitejs/plugin-react -D
- 修改
vite.config.ts
增加react支持
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react'; # <---- here
export default defineConfig({
plugins: [sveltekit(), react()] # <---- here
});
- 创建react svelte适配器
ReactAdapter.svelte
, 代码如下:
# src/lib/utils/ReactAdapter.svelte
<script lang="ts">
import React from "react";
import ReactDOM from "react-dom/client";
import { onDestroy, onMount } from "svelte";
const e = React.createElement;
let container: HTMLElement;
let root: ReactDOM.Root;
onMount(() => {
const { el, children, class: _, ...props } = $$props;
try {
root = ReactDOM.createRoot(container);
root.render(e(el, props, children));
} catch (err) {
console.warn(`react-adapter failed to mount.`, { err });
}
});
onDestroy(() => {
try {
if (root) {
root.unmount();
}
} catch (err) {
console.warn(`react-adapter failed to unmount.`, { err });
}
});
</script>
<div bind:this={container} class={$$props.class}></div>
目前此部分适配器有问题, children无法获取并且在react组件中渲染
参考:
props-and-restProps
issues
- 添加react组件库, 如 ant design
$ pnpm add antd
# +page.svelte
<script lang="ts">
import { Button } from "antd";
import ReactAdapter from "$lib/utils/ReactAdapter.svelte";
</script>
<ReactAdapter el={Button} type="primary">Hello, World!</ReactAdapter>