Vue 2 に慣れている方は、すべてのコンポーネントのテンプレートに 1 つのルート要素が必要だったことを覚えているかもしれません。 Vue 3 では、フラグメントがあるため、これは必要なくなりました。これは、コンポーネントがラッパーを必要とせずに複数のルート要素を持つことができることを意味します。
<!-- Vue 2 --> <template> <div> <!-- wrapper ? --> <h1>My Blog Post</h1> <ArticleComponent>{{ content }}</ArticleComponent> </div> </template> <!-- Vue 3 --> <template> <h1>My Blog Post</h1> <ArticleComponent>{{ content }}</ArticleComponent> </template>
これは React の Fragment に非常に似ています。ただし、Vue はバックグラウンドでフラグメントを処理します。実際、Vue 3 では、 を考えることができます。フラグメントとしてタグを付けます。
Vue 2 では、子コンポーネントに ref を簡単に設定でき、ラッパー要素 と コンポーネント インスタンス の両方を参照します。
しかし、Vue 3 では、ラッパー要素がない場合、ref は何を参照するのでしょうか? ?
子コンポーネントが オプション API を使用する場合、または を使用しない場合、ref は子コンポーネントの this をポイントし、親に完全なアクセス権を与えます。そのプロパティとメソッド。
を使用するとどうなるでしょうか?
を使用するコンポーネントは、デフォルトでは プライベートです。プロパティを公開するには、defineExpose マクロを使用する必要があります。
<!-- Child --> <template> <div>
<!-- Child --> <template> <h1>My Blog Post</h1> <!-- Root 1 --> <ArticleComponent>{{ content }}</ArticleComponent> <!-- Root 2 --> </template> <!-- Parent --> <script setup lang="ts"> const childRef = ref() onMounted(()=>{ console.log(childRef.value.$el); // #text }) </script> <template> <Child ref="childRef" /> </template>
ちょっと待って、何が起こったの?
Fragment(複数ノード) を使用すると、Vue は子コンポーネントのルート ノードをラップするテキスト ノードを作成します。
Vue 3 でフラグメントを使用する場合、Vue はコンポーネントの先頭に空のテキスト ノードをマーカーとして挿入します。そのため、$el は #text ノードを返します。
#text は、Vue が内部で使用する参照ポイントのようなものです。
また、コンポーネント インスタンスに引き続きアクセスできることにも言及しておきます (子で