teleport 标签:用于将组件中的 HTML 元素移动到任意的位置。
使用 teleport 标签移动 HTML 元素:
html
<!-- 将 teleport 中的内容移动到 body 标签中 -->
<teleport to="body">
<div>
<h3>我是第三层组件的标题</h3>
<p>我是第三层组件的内容</p>
<p>我是第三层组件的内容</p>
<p>我是第三层组件的内容</p>
</div>
</teleport>
注:teleport 标签也可以通过 id 名移动,例如:`<teleport to="#box">`
使用 teleport 标签制作全局弹窗:
第一层组件:
html
<template>
<div class="one">
<h3>我是One组件(第一层)</h3>
<hr />
<Two></Two>
</div>
</template>
<script>
import Two from '../components/Two';
export default {
name: "One",
components: { Two }
}
</script>
第二层组件:
html
<template>
<div class="two">
<h3>我是Two组件(第二层)</h3>
<hr />
<Three></Three>
</div>
</template>
<script>
import Three from "../components/Three.vue"
export default {
name: "Two",
components: { Three }
}
</script>
第三层组件(弹窗组件):使用 teleport 标签将弹窗内容移动到 body 标签中。
javascript
<template>
<button @click="isShow = true">显示弹窗</button>
<teleport to="body">
<div class="mask" v-if="isShow">
<div class="dialog">
<h3>我是弹窗的标题</h3>
<p>我是弹窗的内容</p>
<p>我是弹窗的内容</p>
<p>我是弹窗的内容</p>
<button @click="isShow = false">关闭弹窗</button>
</div>
</div>
</teleport>
</template>
<script>
import { ref } from 'vue'
export default {
name: "Three",
setup() {
let isShow = ref(false);
return { isShow }
}
}
</script>
<style scoped>
.mask {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.5);
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 999;
display: flex;
justify-content: center;
align-items: center;
}
.dialog {
width: 300px;
padding: 20px;
background-color: aqua;
text-align: center;
}
</style>
最终效果:
原创作者:吴小糖
创作时间:2023.11.21