Appearance
カスタム要素の相互運用性 破壊的変更
概要
- 破壊的変更: タグをカスタム要素として扱うかどうかのチェックは、テンプレートのコンパイル時に行われるようになり、ランタイム設定ではなく、コンパイラーオプションで設定する必要があります。
- 破壊的変更: 特別な
is
属性の使用は、予約済みである<component>
タグにのみ制限されます。 - 新機能: ネイティブの HTML パースの制限を回避する目的で、ネイティブ要素に
is
を使用するという 2.x のユースケースをサポートするため、値の前にvue:
を付けて Vue コンポーネントとして解決するようにします。
自主的なカスタム要素
Vue の外部で定義されたカスタム要素を追加したい場合(例えば Web コンポーネント API を使用するなど)、Vue にカスタム要素として扱うように「指示」する必要があります。次のテンプレートを例にして説明します。
html
<plastic-button></plastic-button>
2.x の構文
Vue 2.x では、タグをカスタム要素として設定するには、Vue.config.ignoredElements
を使用していました:
js
// これにより、Vue は Vue の外部で定義されたカスタム要素を無視するようになります
// (例: Web コンポーネント APIを使用する場合など)
Vue.config.ignoredElements = ['plastic-button']
3.x の構文
Vue 3.0 では、このチェックはテンプレートのコンパイル時に行われます。 <plastic-button>
をカスタム要素として扱うようにコンパイラーに指示するには:
ビルドステップを使用する場合: Vue テンプレートコンパイラーに
isCustomElement
オプションを渡します。vue-loader
を使用する場合は、vue-loader
のcompilerOptions
オプションで渡す必要があります:js// webpack 設定 rules: [ { test: /\.vue$/, use: 'vue-loader', options: { compilerOptions: { isCustomElement: tag => tag === 'plastic-button' } } } // ... ]
オンザフライのテンプレートコンパイルを使用する場合は、
app.config.compilerOptions.isCustomElement
で渡します:jsconst app = Vue.createApp({}) app.config.compilerOptions.isCustomElement = tag => tag === 'plastic-button'
ランタイム設定は、ランタイムテンプレートのコンパイルにのみ影響することに注意してください。事前にコンパイルされたテンプレートには影響しません。
カスタマイズされたビルトイン要素
カスタム要素の仕様では、組み込み要素に is
属性を付加することで、カスタム要素をカスタマイズされたビルトイン要素として使用する方法を提供しています:
html
<button is="plastic-button">Click Me!</button>
Vue の特別な属性 is
の使い方は、ネイティブ属性がブラウザーで普遍的に利用できるようになる前のネイティブ属性の動作をシミュレートしていました。しかし、2.x では、plastic-button
という名前の Vue コンポーネントをレンダリングすると解釈されました。これは、前述のカスタマイズされたビルトイン要素のネイティブな使い方をブロックしています。
3.0 では、Vue の is
属性の特別な扱いを、<component>
タグのみに限定しています。
予約済みである
<component>
タグで使用された場合、2.x と全く同じ動作をします。通常のコンポーネントで使用する場合は、通常の属性と同じように動作します:
html<foo is="bar" />
- 2.x の動作:
bar
コンポーネントをレンダリングします。 - 3.x の動作:
foo
コンポーネントをレンダリングし、is
属性を渡します。
- 2.x の動作:
プレーンな要素で使用する場合、
createElement
の呼び出しにis
属性として渡され、ネイティブ属性としてレンダリングされます。これは、カスタマイズされたビルトイン要素の使用をサポートします。html<button is="plastic-button">Click Me!</button>
2.x の動作:
plastic-button
コンポーネントをレンダリングします3.x の動作: 以下を呼び出してネイティブのボタンをレンダリングします。
jsdocument.createElement('button', { is: 'plastic-button' })
移行ビルドのフラグ: COMPILER_IS_ON_ELEMENT
DOM 内テンプレートのパース回避のための vue:
プレフィックス
注意: このセクションは、Vue のテンプレートがページの HTML に直接記述されている場合にのみ影響します。 DOM 内テンプレートを使用する場合、テンプレートはネイティブの HTML パースルールに従います。
<ul>
、<ol>
、<table>
、<select>
などの一部の HTML 要素は、その内部に表示できる要素に制限がありますし、<li>
、<tr>
、<option>
などの一部の要素は、他の特定の要素内にのみ表示できます。
2.x の構文
Vue 2 では、ネイティブのタグに is
属性を使用することで、この制限を回避することを推奨していました:
html
<table>
<tr is="blog-post-row"></tr>
</table>
3.x の構文
is
の動作変更に伴い、要素を Vue コンポーネントとして解決するには vue:
プレフィックスが必要になりました:
html
<table>
<tr is="vue:blog-post-row"></tr>
</table>
移行手順
config.ignoredElements
は、ビルドステップの場合はvue-loader
のcompilerOptions
に置き換え、オンザフライのテンプレートコンパイルの場合はapp.config.compilerOptions.isCustomElement
に置き換えます。<component>
以外でis
が使われているタグは、SFC テンプレートの場合は<component is="...">
に変更し、DOM 内テンプレートの場合はvue:
プレフィックスを付けます。