vue keep-alive 生命周期


keep-alive 生命周期

父組件

<!--  -->
<template>
    <div class="">
        <keep-alive>
            <testa v-if="test"></testa>
            <testb v-else></testb>
        </keep-alive>
        <button @click="change">test change</button>
    </div>
</template>

<script>
import testa from "./testA";
import testb from "./testB";
export default {
    components: { testa,testb, },
    data() {
        return {
            test:true
        };
    },
    computed: {},
    watch: {
        name: {
            handler(val, oldVal) {
                /* ... */
            },
            deep: true,
            immediate: true
        }
    },
    methods: {
        change(){
            this.test = !this.test;
        }
    }
};
</script>

組件A:

<!--  -->
<template>
    <div class="">
        about-componnet
    </div>
</template>

<script>
export default {
    components: {},
    data() {
        return {};
    },
    computed: {},
    watch: {
        name: {
            handler(val, oldVal) {
                /* ... */
            },
            deep: true,
            immediate: true
        }
    },
    methods: {},
    beforeCreate() {
        console.log("A--beforeCreate");
    },
    created() {
        console.log("A--created");
    },
    beforeMount() {
        console.log("A--beforeMount");
    },
    mounted() {
        console.log("A--mounted");
    },
    beforeDestroy() {
        console.log("A--beforeDestroy");
    },
    activated() {
        console.log("A--activated");
    },
    deactivated() {
        console.log("A--deactivated");
    }
};
</script>

組件B:

<!--  -->
<template>
    <div class="">
        about-componnet
    </div>
</template>

<script>
export default {
    components: {},
    data() {
        return {};
    },
    computed: {},
    watch: {
        name: {
            handler(val, oldVal) {
                /* ... */
            },
            deep: true,
            immediate: true
        }
    },
    methods: {},
    beforeCreate() {
        console.log("B--beforeCreate");
    },
    created() {
        console.log("B--created");
    },
    beforeMount() {
        console.log("B--beforeMount");
    },
    mounted() {
        console.log("B--mounted");
    },
    beforeDestroy() {
        console.log("B--beforeDestroy");
    },
    activated() {
        console.log("B--activated");
    },
    deactivated() {
        console.log("B--deactivated");
    }
};
</script>

切換組件A和組件B,控制台打印:

// A組件首次激活
A--beforeCreate
A--created
A--beforeMount
A--mounted
A--activated

// B組件首次激活,A組件失活
B--beforeCreate
B--created
B--beforeMount
A--deactivated
B--mounted
B--activated

// B組件失活,A組件激活
B--deactivated
A--activated

// A組件失活,B組件激活
A--deactivated
B--activated

結論:

  • 首次激活時,activated都在mounted后。
  • 再次激活時,本組件只走activated(另外一組件先失活deactivated)
  • 組件失活時,均不走beforeDestroy和destroyed


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM