<template>
<div>
<button @click="click1()">改变子组件变量</button>
<button @click="click2()">销毁/创建子组件</button>
<button @click="click3()">销毁/创建缓存子组件</button>
<!-- 这里v-if改变时会销毁/创建组件,如果用v-show则只是隐藏/显示。所以v-show并不会让组件调用beforeUnmount和unmounted方法。 -->
<!-- 并且这里如果我们改变了子组件的变量,如果使用v-if再次显示子组件时变量值会变为初始,v-show则会保持改变后变量的值。因为v-show并不会重新初始化组件 -->
<HelloWorld ref="childOne" v-if="isExist">
</HelloWorld>
<!-- 如果将组件用keep-alive标签包括,表示将组件进行缓存。
缓存的组件用v-if的时候不会销毁/创建子组件,而是隐藏/激活缓存,所以不会调用销毁的声明周期函数,会调用activated/deactivated声明周期函数
并且缓存中的v-if和v-show一样会保留组件中变量的值,不会重新初始化 -->
<keep-alive>
<HelloWorld ref="childTwo" v-if="isShowCaheComponent">
</HelloWorld>
</keep-alive>
</div>
</template>
<script>
import HelloWorld from ‘./component/HelloWorld‘
export default {
name:"App",
data:function(){
return {
isExist:true,
isShowCaheComponent:true
};
},
components:{
HelloWorld
},
computed:{
},
methods:{
click1(){//改变子组件中的变量,会触发更新前和更新完成周期函数
this.$refs.childOne.count = this.$refs.childOne.count+1;
this.$refs.childTwo.count = this.$refs.childTwo.count+1;
},
click2(){//销毁或者创建组件,会调用销毁即创建的前面的周期函数
this.isExist = !this.isExist;
},
click3(){//停止调用缓存中的组件或者调用缓存中的组件,会触发缓存相关的那两个周期函数
this.isShowCaheComponent = !this.isShowCaheComponent;
}
}
}
</script>
<style scoped>
</style>