teleport 标签:用于将组件中的 HTML 元素移动到任意的位置。
- <teleport to="body">
- <div>
- <h3>我是第三层组件的标题h3>
- <p>我是第三层组件的内容p>
- <p>我是第三层组件的内容p>
- <p>我是第三层组件的内容p>
- div>
- teleport>
注:teleport 标签也可以通过 id 名移动,例如:`
第一层组件:
- <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>
第二层组件:
- <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 标签中。
- <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>
-
- <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