category icon
2023-01-22
JavaScript - Nuxt3

Nuxt3(Vue3) で URL クエリに応じてモーダルを表示する方法

vue
3
nuxt
3.0.0-rc.11
typescript
profile
hikaru
Software Developer / DIY'er

Google フォトのブラウザ版のように、URLのクエリによってモーダルを表示・非表示する方法。

app.vue
<template>
  <!-- モーダルを表示 (URLにクエリを付加する) -->
  <NuxtLink to="/?view=1234">モーダル表示</NuxtLink>

  <!-- モーダル -->
  <div v-if="isShowModal" @hide="hideModal">
    …
  </div>
</template>

<script lang="ts" setup>
const route = useRoute();
const router = useRouter();

// URLクエリからViewIDを取得する
const viewID = computed(() => route.query[`view`]?.toString());

// URLクエリにViewIDが指定されていればモーダルを表示する
const isShowModal = computed(() => viewID.value !== undefined);

/** モーダルを閉じる */
function hideModal() {
  // URLクエリからViewIDを削除することでモーダルを非表示にする
  router.push(`/`);
}
</script>

localhost:3000/?view=1234 のような感じでアクセスするとモーダルが表示されます。ブラウザバックもしくは localhost:3000 に移動すればモーダルが消えてくれます。

おまけ1:モーダルをフェードアニメーション(transition)する方法

app.vue
<template>
  <!-- モーダルを表示 (URLにクエリを付加する) -->
  <NuxtLink to="/?view=1234">モーダル表示</NuxtLink>

  <!-- モーダル -->
  <transition name="fade">    <!-- 👈 追加 -->
    <div v-if="isShowModal" @hide="hideModal">
      …
    </div>
  </transition>               <!-- 👈 追加 -->
</template>

<script lang="ts" setup> … 省略 … </script>

<!-- 👇 追加 -->
<style scoped>
.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.3s ease;
}

.fade-enter-from,
.fade-leave-to {
  opacity: 0;
}
</style>

template 内に <transition name="fade"></transition> を追加と、style 内に transition の設定を追加します。