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 の設定を追加します。