vue.js3の<Teleport>について簡単なサンプルコードで解説

vue.js3のについて簡単なサンプルコードで解説

9 回閲覧されました

みなさんこんにちは、jonioです。

今回はvue.js3から登場している<Teloport>について解説します。

Laravelの無料学習サイトを作りました

Laravelをこれから勉強したい人向けの無料の学習サイトを作りました。

ここからリンクに飛べますのでぜひ利用してください。

<Teleport>とは

あるコンポーネントのテンプレートの一部を、実際のDOM上では別の場所へ描画する仕組みです。

よくある用途はモーダルやドロップダウンをbody直下に出してz-indexやoverflowなどのcssの干渉を回避したり「<Transition>」タグの影響を回避したい時に使います。

サンプルコードで理解を深めます。

サンプルコード

下記のコードで考えます。

<template>
  <button @click="open = true">開く</button>

  <Teleport to="body">
    <div v-if="open" class="backdrop" @click="open = false">
      <div class="modal" @click.stop>
        <h2>モーダル</h2>
        <p>ここに内容</p>
        <button @click="open = false">閉じる</button>
      </div>
    </div>
  </Teleport>
</template>

<script setup>
import { ref } from 'vue'
const open = ref(false)
</script>

<style scoped>
.backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.4); display:grid; place-items:center; }
.modal { background:#fff; padding:16px; border-radius:8px; min-width:240px; }
</style>

4行目にTeleportを使っています。

「to=”body”」はTeleportタグの中身(5行目〜11行目)を配置する場所を指定しています、この場合はbodyタグの直下という意味です。

通常はbuttonタグの下に配置されるのをTeleportタグを使うことで配置場所を変更できます。

配置する場所の指定方法ですが他の記述方法もあります。

例えば下記になります。

// HTMLに下記の記述をする
<div id="modals"></div>
<div class="sidebar"></div>

// vue.jsに下記の記述をする
<Teleport to="#modals">
  <MyModal />
</Teleport>

<Teleport to=".sidebar">
  <MiniWidget />
</Teleport>

7行目は「id=”modals”」の直下に配置されて11行目は「class=”sidebar”」の直下に配置されるといった感じです。