コンテンツにスキップ
先頭に戻る
このページ

PortalTarget

このコンポーネントは、<Portal> コンポーネントで送られた任意のコンテンツ用のアウトレットです。受信したコンテンツを表示し、それ以上の動作はありません。

使用例

html
<portal-target name="destination" />

フラグメント

PortalTarget はフラグメントを表示するようになり、ラップ要素がなくなりました。

Props API

multiple

multipletrue の場合、このポータルは複数の <Portal> コンポーネントから同時にコンテンツを受け取ってレンダリングできるようになります。

コンテンツの表示順序を定義するには、 <Portal>order プロパティを使用する必要があります

ソース

html
<portal to="destination" :order="2">
  <p>some content</p>
</portal>
<portal to="destination" :order="1">
  <p>some other content</p>
</portal>

<portal-target name="destination" multiple />

結果

html
<p>some other content</p>
<p>some content</p>

name

タイプ必須既定値
文字列はいなし

このポータルターゲットの名前を定義します。<Portal> コンポーネントはこの名前でこのインスタンスにコンテンツを送信できます。

slotProps

タイプ必須既定値
オブジェクトいいえ{}

ヒント

このプロパティは、PortalTarget が <Portal>スコープ付きスロット からコンテンツを受信する場合にのみ有効です。

slotProps オブジェクトは、<Portal> のスコープ付きスロットをレンダリングするためのプロパティとして使用されます。

ソース

html
<portal to="destination" v-slot="props" slot-props="{ state: 'nice!!' }">
  <p>This scoped slot content is so {{ props.state }}</p>
</portal>

<portal-target name="destination" slot-props="{state: 'cool!'}" />

結果

html
<p>This scoped slot content is so cool!</p>

<Portal> コンポーネントで同じ名前の対応するプロパティがあり、<Portal> が無効になっているときにプロパティをスロットコンテンツに渡します。

スロット API

既定のスロット

任意の既存のスロットコンテンツは、ソースポータルからのコンテンツが利用できない場合にレンダリングされます。

ソース

html
<portal-target name="destination" tag="span">
  <p>This is rendered when no other content is available.</p>
</portal-target>

結果

html
<p>This is rendered when no other content is available.</p>

既定のスコープ付きスロット

既定のスロットはスコープされることもできます。スコープ付きスロットは、slotProps プロパティをその引数として受け取ります。

ソース

html
<portal-target name="target" :slotScope="{ message: 'Hi!' }" v-slot="props">
  <p>
    {{props.message}} This is rendered when no other content is available.
  </p>
</portal-target>

結果

html
<p>This is rendered when no other content is available.</p>

wrapper

このスロットを使用して、 <portal> から受信したコンテンツをラップするマークアップを定義できます。これは通常、 multiple と組み合わせてのみ役立ちます。単一のポータルのコンテンツの場合、 <portal-target> を全体としてラップできます。

このスロットは、ソースポータルから送信されたコンテンツを表す未加工の vnode を含む配列を唯一のプロパティとして受け取ります。

これらの vnode は、Vue の動的コンポーネント構文でレンダリングできます

<component :is="node">

ソース

html
<portal-target name="target">
  <template v-slot:wrapper="nodes">
    <component :is="node" v-for="node in nodes" />
  </template>
</portal-target>

このスロットは、トランジションを追加するのにも役立ちます(高度なガイドを参照)

イベント API

change

<ポータル>からのコンテンツが変更されたため、コンポーネントが再レンダリングされるたびに発生します。

2 つのプロパティを持つオブジェクトを受信します。

js
{
  hasContent: boolean,
  sources: string[]
}
プロパティタイプ説明
hasContentboolean現在、ポータルターゲットにコンテンツがあるかどうかを示します。
ソースstring[]コンテンツを送信したポータルの名前の配列
html
<template>
  <portal-target name="destination" @change="handleUpdate" />
</template>

<script>
  export default {
    methods: {
      handleUpdate({ hasChanged, sources }) {
        // do something with the info.
      },
    },
  }
</script>