🙄

vue3の新機能「teleport」を使ってモーダルを作成する

2022/01/07に公開

モーダルを作る際に、vue2では僕は「vuejs-modal」というライブラリを愛用していましたが、
vue3では現在は使えません...。

では、どうすればよいか!?

新機能の「teleport」というのを使ってモーダルを作ります。

では、早速行ってみましょう!

モーダル用のコンポーネントを作成する

モーダル用にコンポーネントを作ります

SampleModal.vueという名前にしました。

<template lang="pug">
<teleport to="body">
  <div class="modal" id="sample-modal" v-show="isVisible" @click="close"></div>
  <div class="modal-content" v-show="isVisible">ああああああああああああ内容です内容です</div>
</teleport>
</template>

<script>
export default {
  props: {
    isVisible: {
      required: true,
      type: Boolean,
      default: false,
    }
  },
  data() {
    return {
    }
  },
  methods: {
    close() {
      this.$emit('close')
    }
  }
}
</script>

<style scoped lang='sass'>
.modal
  position: fixed
  top: 0
  right: 0
  bottom: 0
  left: 0
  background-color: rgba(0,0,0,.5)
  display: flex
  flex-direction: column
  align-items: center
  justify-content: center

.modal-content
  position: fixed
  top: 50%
  left: 50%
  transform: translate(-50%, -50%)
  background-color: rgba(0,0,0,.5)
  display: flex
  flex-direction: column
  align-items: center
  justify-content: center
  
  // モーダルの幅や色などはお好きにどうぞ!
  background-color: white
  width: 600px
  height: auto
  border-radius: 20px
  padding: 20px

</style>

「modalクラス」のdivはマスクするようで、背景をちょっと背景がかった色にしています。
「modal-contentクラス」は、モーダルの中身を作っていきます。

modalクラスをクリックするとcloseメソッドが呼び出されるようにしているのは、
モーダルの外側をクリックした時に、モーダルを閉じるためです。

デザインやスタイルはお好きにしてください。

そして、呼び出し側はどうするかというと、コンポー年とを呼び出して、モーダルの表示・非表示を行う「isVisibleをtrueにしたりfalseにしたりするだけ」です。

<template lang="pug">
<div>
  <sample-modal :isVisible="sampleModalVisible" @close="closeSampleModal"></sample-modal>
</div>
</template>

<script>
export default {
  props: {
  },
  data() {
    return {
        sampleModalVisible: false,
    }
  },
  methods: {
    showSampleModal() {
      this.sampleModalVisible = true
    }
    closeSampleModal() {
      this.sampleModalVisible = false
    }
  }
}
</script>

<style scoped lang='sass'>

</style>

これで、モーダルが完成しました!

slotを使ったり、propsを増やしたりして、外から指定できるものを増やすともっと素晴らしいモーダルができるかなと思います。

以上です!

Discussion