웹 컴포넌트를 사용하는 React App의 솔리드 컴포넌트
14401 단어 reactjavascriptsolidjsvite
이것은 중요한 단계를 강조하는 빠른 가이드입니다.
장점
범위
Solid에서 React 컴포넌트를 사용하거나 이 Custom Component에서 자식 React 컴포넌트를 갖는 것은 어려운 문제이므로 언급하지 않겠습니다.
자원
솔리드 요소 라이브러리:
https://github.com/solidjs/solid/tree/main/packages/solid-element
다이빙하기 전에 이해하는 것이 더 쉽습니다.
https://developer.mozilla.org/en-US/docs/Web/Web_Components
모범 사례:
https://developers.google.com/web/fundamentals/web-components/best-practices
"풍부한 데이터(개체, 배열)만 속성으로 허용하는 것을 목표로 합니다."
단계
1- 템플릿으로 시작
npx degit solidjs/templates/ts my-app
2- 종속성 추가
pnpm i solid-element
3- 변경
vite.config.ts
import { defineConfig } from "vite";
import solidPlugin from "vite-plugin-solid";
const path = require('path')
export default defineConfig({
plugins: [solidPlugin()],
build: {
target: "esnext",
polyfillDynamicImport: false,
lib: {
entry: path.resolve(__dirname, 'src/MyComponent.tsx'),
name: 'MyLib'
},
},
});
4- 구성 요소 생성
MyComponent.tsx
import { onMount, createSignal, createEffect, For } from "solid-js";
import { createStore } from "solid-js/store";
import { customElement } from "solid-element";
const [getData, setData] = createSignal("");
interface Options {
option1: string;
option2: number;
}
customElement(
"my-custom-component",
{
data: { getData, setData, getOtherData: null },
},
(
props: {
data: {
// flowdata: string;
getData: () => string;
setData: (v: string) => string;
getOtherData: (options: Options) => Promise<string>;
};
},
{ element }
) => {
let internal_el;
props.data.getOtherData = async (
options: Options = { option1: "default", option2: 1 }
): Promise<string> => {
let promise = new Promise<string>((resolve, reject) => {
//do something
resolve("data");
});
return promise;
};
const [state, setState] = createStore({});
onMount(() => {
// code
});
createEffect(() => {
// getData() will be reactive here
// you can use the passed data to do calculation / render elements
getData();
});
return <div ref={internal_el}></div>;
}
);
5- 변경
package.json
이름 필드:"name": "my-custom-component"
6- 런
npm run build
이제 dist
디렉토리에서 결과를 볼 수 있습니다. 그게 다야. React 프로젝트에 복사my-custom-component.es.js
하거나 일부 다중 저장소 설정을 사용할 수 있습니다.7- React 측에서는 메서드를 사용하여 Custom Component와 데이터를 교환할 수 있습니다.
import "../vendor/my-custom-component.es.js";
function Component1(props) {
const customControlRef = useRef<any>(null);
useEffect(() => {
customControlRef.current.data.setData(specialData);
}, []);
const getData2 = async (ev) => {
await customControlRef.current.data.getOtherData();
};
return (
<div>
<my-custom-component ref={customControlRef}></my-custom-component>
<button className="button" onClick={getData2}>
Get some data from Custom Component
</button>
</div>
);
}
8- 보너스: Typescript를 사용하는 경우 React의 구성 요소 코드 앞에 이것을 추가하십시오.
declare global {
namespace JSX {
interface IntrinsicElements {
"my-custom-component": React.DetailedHTMLProps<
React.HTMLAttributes<HTMLElement>,
HTMLElement
>;
}
}
}
Reference
이 문제에 관하여(웹 컴포넌트를 사용하는 React App의 솔리드 컴포넌트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fatihpense/solid-component-in-react-app-using-web-components-329p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)