打赏

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
posted @ 2020-02-07 21:52  孟繁贵  阅读(3809)  评论(0编辑  收藏  举报
TOP