Skip to content
The translation is synced to the docs on of which the commit hash is d283ef0.

インラインテンプレート属性
破壊的変更

概要

インラインテンプレート機能のサポートは削除されました。

2.x の構文

2.x では、Vue は子コンポーネントに inline-template 属性を提供し、その内容を(配布するコンテンツとして扱うのではなく)テンプレートとして使用できました。

html
<my-component inline-template>
  <div>
    <p>These are compiled as the component's own template.</p>
    <p>Not parent's transclusion content.</p>
  </div>
</my-component>

3.x の構文

この機能は今後サポートされません。

移行手順

inline-template のユースケースのほとんどは、すべてのテンプレートが HTML ページの中に直接書かれる、ビルドツールのないセットアップを想定しています。

移行ビルドのフラグ: COMPILER_INLINE_TEMPLATE

選択肢 #1: <script> タグを使用する

このような場合の最も簡単な回避策は、代替の type 属性で <script> を使うことです:

html
<script type="text/html" id="my-comp-template">
  <div>{{ hello }}</div>
</script>

そしてコンポーネントでは、セレクターを使ってテンプレートをターゲットにします:

js
const MyComp = {
  template: '#my-comp-template'
  // ...
}

これは、ビルドのセットアップを必要とせず、すべてのブラウザーで動作し、DOM 内の HTML パースの注意点(例えば、camelCase のプロパティ名を使用できる)に左右されず、ほとんどの IDE で適切なシンタックスハイライトを提供します。従来のサーバーサイドフレームワークでは、これらのテンプレートは保守性を高めるために、サーバーテンプレートのパーシャル(メインの HTML テンプレートに含まれる)に分割できます。

選択肢 #2: デフォルトスロット

これまで inline-template を使用していたコンポーネントも、デフォルトのスロットを使用してリファクタリングできます。これにより、子コンテンツをインラインで記述する利便性を維持しつつ、データのスコープがより明確になります:

html
<!-- 2.x の構文 -->
<my-comp inline-template :msg="parentMsg">
  {{ msg }} {{ childState }}
</my-comp>

<!-- デフォルトスロットバージョン -->
<my-comp v-slot="{ childState }">
  {{ parentMsg }} {{ childState }}
</my-comp>

子コンポーネントは、テンプレートを提供しない代わりに、デフォルトスロット*をレンダリングする必要があります:

html
<!--
  子のテンプレートでは、必要な子コンポーネントのプライベート状態を渡しつつ、
  デフォルトスロットをレンダリングします
-->
<template>
  <slot :childState="childState" />
</template>
  • 注意: 3.x では、ネイティブの fragments サポートにより、スロットをルートとしてレンダリングすることができます!