vue生命周期keep-alive

    科技2025-09-17  44

    <script src="./base/vue.js"></script> <body> <div id="app"> <my-component></my-component> </div> <!--定义组件的模板--> <template id="my-component"> <div> <h1 id="title">我是h1 -- {{msg}}</h1> <input type="text" v-model="msg"> <button @click="destroy">销毁组件</button> </div> </template> <script> /* 组件从创建到销毁的一系列过程叫做组件的声明周期。 vue在整个生命周期里面提供了一些函数,可以在内部实现一些业务逻辑, 并且这些函数会在一些特定的场合下去执行。(在生命周期的某一个时刻进行触发) 组件的生命周期大体可以分为三个阶段: 初始化、运行中、销毁 初始化阶段:beforeCreate created beforeMount (render) mounted 运行中阶段:beforeUpdate updated 销毁阶段: beforeDestroy destroyed */ //初始化阶段 //1.一个组件或者实例的生命周期都是从new开始的 //2.实例化之后,内部会做一些初始化的事件与生命周期相关的配置 Vue.component("my-component",{ template:"#my-component", data(){ return { msg:"hello" } }, methods:{ destroy(){ this.$destroy() //组件销毁方法 } }, //3.beforeCreate这个钩子函数初始化的时候就会执行 //但是数据是获取不到的,并且真实dom元素也是没有渲染出来的 beforeCreate(){ console.log("beforeCreate...") console.log(this.msg,document.getElementById("title")) }, //4.created钩子函数内部可以访问到数据了,但是页面当中真实dom节点还是没有渲染出来 //在这个钩子函数里面,可以进行相关初始化事件的绑定、发送ajax操作 //当组件还没有挂载完毕之前,更改数据的话,是不会触发运行时钩子函数的执行! created(){ console.log("created...") this.timer = setInterval(()=>{ console.log("定时器开着哦...") this.msg = this.msg+"!" },2000) // this.msg = 11111111111 console.log(this.msg,document.getElementById("title")) }, //5.接下来的过程,就是组件或者实例去查找各自的模板结构,然后将其编译成虚拟dom //6.beforeMount代表dom马上就要被渲染出来了,但是却还没有真正的渲染出来 //这个钩子函数与created钩子函数用法基本一致,可以进行相关初始化事件的绑定、发送ajax操作 beforeMount(){ console.log("beforeMount...") console.log(this.msg,document.getElementById("title")) }, //生成好虚拟dom,然后内部通过render函数将对应的el进行替换,做一个初始化的虚拟dom渲染真实dom过程 // render(){ // console.log("render....") // } //7.mounted钩子函数是挂载阶段的最后一个钩子函数 //数据挂载完毕,真实dom元素也已经渲染完成了 //这个钩子函数内部可以做一些实例化相关的操作 拖拽 mounted(){ console.log("mounted...") console.log(this.msg,document.getElementById("title")) }, //8.这个钩子函数初始化的不会执行 //当组件挂载完毕的时候,并且当数据改变的时候,才会立马执行 //这个钩子函数获取dom的内容是更新之前的内容 beforeUpdate(){ console.log("beforeUpdate...",this.msg ,document.getElementById("title").innerHTML) }, //9.这个钩子函数获取dom的内容是更新之后的内容 //生成新的虚拟dom,新的虚拟dom与之前的虚拟dom进行比对,差异之后,就会进行真实dom渲染。 //在updated钩子函数里面就可以获取到因diff算法比较差异得出来的真实dom渲染了。 updated(){ console.log("updated....", this.msg,document.getElementById("title").innerHTML) }, //10.当组件销毁的时候,就会触发 //这个钩子函数代表销毁之前,可以做一些善后操作 //可以清除一些初始化事件、定时器相关的东西。 beforeDestroy(){ console.log("beforeDestory....") clearInterval(this.timer) }, //11.组件销毁的时候执行 //watch/数据劫持等功能已经完全丧失 destroyed(){ console.log("destroyed...") } }) new Vue().$mount("#app"); </script> </body>

    如图

    keep-alive

    //当你通过keep-alive标签包裹动态组件的时候,那么动态组件就没有被销毁了,也就不会去执行beforeDestroy钩子函数。 //所以当被keep-alive包裹的一些动态组件的时候,提供了两个钩子函数***,activated deactivated*** //后续只需要把初始化的事件放入到activated里面即可,在deactivated中将初始化的定时器干掉 //通过include属性可以规定到底哪些组件可以被缓存**,默认是缓存所有的动态组件。**

    <div id="app"> <button @click="type=type==='my-a'?'my-b':'my-a'">切换</button> <keep-alive> <component :is="type"></component> </keep-alive> </div> <script src="./base/vue.js"></script> <script> Vue.component("my-a",{ template:"<div>my-a组件</div>", created(){ console.log("my-a-created") }, beforeDestroy(){ console.log("my-a-beforeDestroy") }, activated(){ console.log("my-a-activated") }, deactivated(){ console.log("my-a-deactivated") } }) Vue.component("my-b",{ template:"<div>my-b组件</div>", activated(){ console.log("my-b-activated") }, deactivated(){ console.log("my-b-deactivated") } }) new Vue({ el:"#app", data:{ type:"my-a" } }) </script> </body>
    Processed: 0.012, SQL: 8