0Pricing
Vue Academy · レッスン

render関数による動的コンポーネント

型によるコンポーネントの切り替え、コンポーネントの解決、render関数でのスロット維持

「render関数による動的コンポーネント」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。

レンダー関数での動的コンポーネント

テンプレートでは<component :is="...">を使って、実行時にコンポーネントを切り替えます。レンダー関数では、resolveヘルパーとhを使って同じことを実現できます。

resolveComponent

resolveComponentは、登録名によってグローバルまたはローカルに登録されたコンポーネントを検索し、hで使用できる形で返します。

import { h, resolveComponent } from "vue";

export default {
  render() {
    const Btn = resolveComponent("MyButton");
    return h(Btn, null, () => "Click");
  }
};

resolveDynamicComponent

対象が登録名、HTMLタグ、またはコンポーネントオブジェクトのいずれかになり得る場合は、resolveDynamicComponentを使います。この関数が3つのケースをすべて処理します。

import { h, resolveDynamicComponent } from "vue";

h(resolveDynamicComponent(props.type));

Propsでtypeを指定する

コンポーネント名をprops経由で渡し、レンダーのたびに解決します。これは:isに相当するレンダー関数の書き方です。

export default {
  props: { type: String },
  render() {
    const Comp = resolveDynamicComponent(this.type);
    return h(Comp, { msg: "hi" });
  }
};

Propsを引き継ぐ

受け取ったattrsを解決済みのコンポーネントにスプレッドし、動的な子コンポーネントが親に渡されたすべての情報を受け取れるようにします。

setup(props, { attrs }) {
  return () => h(
    resolveDynamicComponent(props.type),
    { ...attrs }
  );
}

スロットを引き継ぐ

スロットはhの3番目の引数を通じて子コンポーネントに渡されます。親のslotsオブジェクトを直接渡すと、動的なコンポーネントでスロットがレンダーされます。

setup(props, { slots }) {
  return () => h(
    resolveDynamicComponent(props.type),
    null,
    slots
  );
}

再利用可能なレンダラー

attrsとslotsの引き継ぎを組み合わせると、すべてを透過的に渡しながら名前で任意のコンポーネントをレンダーする薄いラッパーになります。

setup(props, { attrs, slots }) {
  return () => h(
    resolveDynamicComponent(props.is),
    attrs,
    slots
  );
}

動的な列レンダラー

データテーブルでは、各列に独自のレンダラーコンポーネントを指定できることがよくあります。列ごとにコンポーネント名を保持し、各セルで解決します。

const columns = [
  { field: "name", renderer: "TextCell" },
  { field: "price", renderer: "MoneyCell" }
];

セルを動的にレンダーする

各列についてレンダラーを解決し、セルの値をpropsとして渡します。1つのループで、種類の異なるセルを処理できます。

render() {
  return h("tr", null,
    columns.map((col) =>
      h("td", null, [
        h(resolveDynamicComponent(col.renderer), {
          value: this.row[col.field]
        })
      ])
    )
  );
}

タグへのフォールバック

resolveDynamicComponentに未登録の名前を渡すと、ネイティブ要素の文字列として扱われるため、"div"は実際のdiv要素として安全にレンダーされます。

h(resolveDynamicComponent("div"), { class: "box" }, "fallback");

ここでレンダー関数を使う理由

構造が計算によって決まる場合、つまり子要素の数が可変、項目ごとにコンポーネントの種類が異なる、またはテンプレートで何重もの条件分岐が必要になるロジックの場合に、レンダー関数が力を発揮します。

理解度チェック

コンポーネント名またはネイティブHTMLタグの可能性がある対象を安全に解決するヘルパーはどれですか?

まとめ

登録名にはresolveComponentを使い、対象がHTMLタグやコンポーネントオブジェクトになる可能性がある場合はresolveDynamicComponentを使います。attrsをpropsとして引き継ぎ、slotsオブジェクトをhの3番目の引数として渡します。このパターンは、動的なテーブル列レンダラーや柔軟なラッパーに利用できます。

よくある質問

「render関数による動的コンポーネント」レッスンは無料ですか?

はい。「render関数による動的コンポーネント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。

「render関数による動的コンポーネント」で何を学びますか?

型によるコンポーネントの切り替え、コンポーネントの解決、render関数でのスロット維持 ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Vue Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「render関数による動的コンポーネント」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このVue Academyレッスンでコードを書いて実行できますか?

はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. h()関数を深く理解する
  2. ViteでのVue 3 JSX
  3. render関数による動的コンポーネント
  4. 高階コンポーネント(HOC)パターン
← Vue Academyに戻る