<template>
    <div class="s2">
        <h1>我是爷爷组件{{ counter }}</h1>
        <SunZi></SunZi>
    </div>
</template>
 
<script>
import send from "../hooks/send.js"
import SunZi from "./ErZi.vue";
export default {
    name : "YeYe",
    components : {SunZi},
    setup(){
        let counter = send();
        return {counter};
    }
}
</script>
 
<style lang="css" scoped>
    .s2{
        width : 400px;
        height : 400px;
        background-color: bisque;
    }
</style>
<template>
    <div class="s1">
        <h1>我是App组件</h1>
        <YeYe></YeYe>
    </div>
</template>
 
<script>
import YeYe from "./components/YeYe.vue";
export default {
    name : "App",
    components : {YeYe}
}
</script>
 
<style lang="css" scoped>
    .s1{
        width : 500px;
        height : 500px;
        background-color: aquamarine;
    }
</style>
<template>
    <div class="s3">
        <h1>我是儿子组件{{ counter }}</h1>
         <SunZi></SunZi>
    </div>
</template>
 
<script>
import SunZi from "./SunZi.vue"
import receive from "../hooks/receive.js"
export default {
    name : "ErZi",
    components : {SunZi},
    setup(){
        let counter = receive();
        return {counter};
    }
}
</script>
 
<style lang="css" scoped>
    .s3{
        width : 300px;
        height : 300px;
        background-color: chartreuse;
    }
</style>
<template>
    <div class="s4">
        <h1>我是孙子组件{{ counter }}</h1>
        <button @click="isShow = true">弹窗</button>
        <!-- 瞬移 -->
        <Teleport to="body">
            <!-- 遮罩层,整个遮罩层需要瞬移到body下 -->
            <div v-show="isShow" class="cover">
            <!-- 这是一个模态窗口 -->
                <div class="s">
                    我是一个窗口
                    <button @click="isShow = false">关闭窗口</button>
                </div>
            </div>
        </Teleport>
    </div>
</template>
 
<script>
import {ref,inject} from "vue";
import receive from "../hooks/receive.js";
export default {
    name : "SunZi",
    setup(){
        let isShow = ref(false);
        let counter = receive();
        return {isShow,counter};
    }
}
</script>
 
<style lang="css" scoped>
    .s4{
        width : 200px;
        height : 200px;
        background-color: darkmagenta;
    }
    .s{
        width: 250px;
        height: 250px;
        background-color: cadetblue;
    }
    .cover{
        position: absolute;
        top : 0;bottom: 0;left: 0;right: 0;
        background-color: darkgrey;
        opacity: 90%;
    }
</style>
import {ref,provide} from "vue";
export default function(){
    let counter = ref(1);
    // 在爷爷组件使用provide提供数据
    provide("counter",counter);
    return counter;
}
import { inject } from "vue";
export default function(){
    let counter = inject("counter");
    return counter;
}