Webコンポーネントを用いた反応アプリのソリッドコンポーネント


私は反応アプリの中に固体要素を使用したい.結局、私は、すべてがどれくらいスムーズに行ったかについて、楽しく驚きました.
これは重要な手順を強調する簡単なガイドです.

利点

  • フレームワークなしでも、どこでも同じコンポーネントを使用できます.
  • 出力サイズは非常に小さく、大きなランタイムを含んでいません.
  • すべての良いもの固体は、持ってきます.
  • スコープ


    反応コンポーネントを使用して固体、またはこのカスタムコンポーネント内のコンポーネントを反応させる子供たちは、私は言及しない難しい問題です.

    資源


    固体素子ライブラリ
    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-app2 -依存関係を追加するpnpm i solid-element3 -変更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'
        },
      },
    });
    
    コンポーネントの作成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フィールド"name": "my-custom-component"6 -実行npm run build今すぐ下に結果を見ることができますdist ディレクトリ.以上です.コピーできますmy-custom-component.es.js あなたの反応プロジェクト、またはいくつかのマルチrepoのセットアップを使用します.
    7 -物事の反応側では、カスタムコンポーネントとデータを交換する方法を使用できます.
    
    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を使っているならば、反応でコンポーネントコードの前にこれを加えてください.
    declare global {
      namespace JSX {
        interface IntrinsicElements {
          "my-custom-component": React.DetailedHTMLProps<
            React.HTMLAttributes<HTMLElement>,
            HTMLElement
          >;
        }
      }
    }