웹 컴포넌트를 사용하는 React App의 솔리드 컴포넌트

React 앱 내에서 Solid 요소를 사용하고 싶었습니다. 결국 모든 것이 순조롭게 진행되어 기분 좋게 놀랐습니다.

이것은 중요한 단계를 강조하는 빠른 가이드입니다.

장점


  • 프레임워크 없이도 동일한 구성 요소를 모든 위치에서 사용할 수 있습니다.
  • 출력 크기가 매우 작고 큰 런타임을 포함하지 않습니다.
  • 솔리드가 제공하는 모든 장점.

  • 범위



    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
          >;
        }
      }
    }
    

    좋은 웹페이지 즐겨찾기