在以下示例中复制:
index中的thing 5行约50次(因此在您的浏览器中出现滚动条)op
/
<template>
<ol>
<li><NuxtLink :href="'/session/1'">Thing 1</NuxtLink></li>
<li><NuxtLink :href="'/session/2'">Thing 2</NuxtLink></li>
<li><NuxtLink :href="'/session/3'">Thing 3</NuxtLink></li>
<li><NuxtLink :href="'/session/4'">Thing 4</NuxtLink></li>
<li><NuxtLink :href="'/session/5'">Thing 5</NuxtLink></li>
</ol>
<LazyNuxtPage />
</template>
<script setup lang="ts">
import { useRoute, useRouter } from 'vue-router';
import { watch } from 'vue';
const route = useRoute();
const router = useRouter();
</script>
<template>
<div :style="{ position: 'fixed', top: '16px', right: '16px', backgroundColor: '#cccccc', padding: '8px' }">
Thing {{ route.params.id }}.
<button @click="router.push('/')">(Close overlay)</button>
</div>
</template>
index.vue
<template>
<ol>
<li><button @click="openModal(1)">Thing 1</button></li>
<li><button @click="openModal(2)">Thing 2</button></li>
<li><button @click="openModal(3)">Thing 3</button></li>
<li><button @click="openModal(4)">Thing 4</button></li>
<li><button @click="openModal(5)">Thing 5</button></li>
</ol>
<!-- Modal Component -->
<Modal :isOpen="isModalOpen" @close="isModalOpen = false">
<p>Thing {{ selectedThing }} Details</p>
</Modal>
</template>
<script setup>
import { ref } from 'vue';
import Modal from '@/components/Modal.vue';
const isModalOpen = ref(false);
const selectedThing = ref(null);
const openModal = (thingId) => {
selectedThing.value = thingId;
isModalOpen.value = true;
};
</script>
[id].vue
<template>
<div v-if="isOpen" class="modal-overlay" @click.self="closeModal">
<div class="modal-content">
<slot />
<button @click="closeModal">Close</button>
</div>
</div>
</template>
<script setup>
import { defineProps, defineEmits } from 'vue';
defineProps(['isOpen']);
const emit = defineEmits(['close']);
const closeModal = () => {
emit('close');
};
</script>
<style scoped>
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.modal-content {
background: white;
padding: 20px;
border-radius: 8px;
}
</style>