生命周期
生命周期钩子函数:Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数(生命周期!==生命周期钩子函数)
不要在选项属性或者回调函数上使用箭头函数
vue的生命周期:vue实例从创建到销毁:
| 生命周期钩子 | 类型 | 描述 |
|---|---|---|
| beforeCreate | function | 实例初始化之后,数据观测event/watcher事件配置之前被调;挂载元素$el和数据对象data是undefined,未初始化, |
| created | function | 在实例创建完成后被立即调用,此时,实例已经完成以下配置: 数据观测,属性和方法的运算,watch/event事件回调。但是挂载阶段没有开始,$el属性目前看不见 |
| beforeMount | function | 在挂载开始之前被调用:相关的render函数首次被调用(创建虚拟dom,不是真实的dom,是js对象其中包含了渲染成dom元素信息) |
| mounted | function | 把vue的虚拟dom挂载到真实的dom上,在vue中获取的dom元素对象,一般在此钩子中获取,项目中的ajax请求一般也在这里或者created处发送(el 被新创建的 vm.$el 替换,并挂载到实例上去之,调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内) |
| beforeUpdated | function | 只有当数据发生变化时,会触发此函数(数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。) |
| updated | fucntion | 在虚拟dom重新渲染和打补丁(数据更改会导致的)之后才会调用updated,组成新的dom已经更新,避免在此钩子函数中操作数据,防止死循环 |
| beforeDestroy | function | 在vue的实例被销毁之前调用,实例可以使用,this也可以获取实例,如果页面中有定时器,则可以在此钩子里清除定时器解绑事件(该钩子在服务器端渲染期间不被调用) |
| destroyed | function | vue实例销毁后调用,实例的属性也不再是响应式,watch被移除(该钩子在服务器端渲染期间不被调用) |
| activated | function | keep-alive组件激活时调用,他在服务器渲染期间不被调用 |
| deactivated | function | keep-alive组件停用时调用,他在服务器端渲染期间不被调用 |
| errorCaptured | (err: Error, vm: Component, info: string) => ?boolean | 当捕获一个来自子孙组件的错误时调用,此钩子会受到三个参数:错误对象,发生错误的组件实例以及一个包含错误来源信息的字符串,返回false阻止该错误继续向上传播 |
- mounted,updated不会将所有的子组件都一起被挂载,如果是整个视图都渲染完毕,可以用vm.$nextTick替换掉mounted,updated
- http请求建议在created生命周期内发出
keep-alive
vue的内置组件,包裹动态组件,缓存不活动的组件实例。与transition相似,keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。要求同时只有一个子元素被渲染。
作用
- 保存组件状态
- 避免dom重复渲染
- 减少加载时间和性能消耗
-
原理
created函数调用时会将需要缓存的节点保存在this.cache中/在页面渲染时,如果虚拟dom的name符合条件(可以借助include和exclude控制),则会从this.cache中取出之前缓存的虚拟dom实例进行渲染。
include:字符串或正则表达式。只有名称匹配的组件会被缓存可以用
逗号分隔字符串、正则表达式或一个数组来表示- exclude:字符串或正则表达式。任何名称匹配的组件都不会被缓存可以用
逗号分隔字符串、正则表达式或一个数组来表示 - max: 数字,最多可以缓存多少组件实例
被包含在 keep-alive 中创建的组件,会多出两个生命周期的钩子: activated 与 deactivated 使用 keep-alive 会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在 activated 阶段获取数据,承担原来 created 钩子函数中获取数据的任务。 注意: 只有组件被 keep-alive 包裹时,这两个生命周期函数才会被调用,如果作为正常组件使用,是不会被调用的,以及在 2.1.0 版本之后,使用 exclude 排除之后,就算被包裹在 keep-alive 中,这两个钩子函数依然不会被调用!另外,在服务端渲染时,此钩子函数也不会被调用
include和exclude匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称(父组件 components 选项的键值)。匿名组件不能被匹配。不会在函数式组件中正常工作,因为它们没有缓存实例。
原文:https://www.kancloud.cn/hanxuming/vue-iq/733837
1. 缓存所有页面
在app.vue页面
<template><div id="app"><keep-alive><router-view/></keep-alive></div></template><script>export default {name: 'App'}</script>
根据条件缓存
在app.vue里面
<template><div id="app">// 1. 将缓存 name 为 test 的组件<keep-alive include='test'><router-view/></keep-alive>// 2. 将缓存 name 为 a 或者 b 的组件,结合动态组件使用<keep-alive include='a,b'><router-view/></keep-alive>// 3. 使用正则表达式,需使用 v-bind<keep-alive :include='/a|b/'><router-view/></keep-alive>// 5.动态判断<keep-alive :include='includedComponents'><router-view/></keep-alive>// 5. 将不缓存 name 为 test 的组件<keep-alive exclude='test'><router-view/></keep-alive></div></template>//6.<script>export default {name: 'App'}</script>
结合Router,缓存部分页面
- 在 router 目录下的 index.js 文件里
import Vue from 'vue'import Router from 'vue-router'const Home = resolve => require(['@/components/home/home'], resolve)const Goods = resolve => require(['@/components/home/goods'], resolve)const Ratings = resolve => require(['@/components/home/ratings'], resolve)Vue.use(Router)export default new Router({mode: 'history',routes: [{path: '/',name: 'home',component: Home,redirect: 'goods',children: [{path: 'goods',name: 'goods',component: Goods,meta: {keepAlive: false // 不缓存}},{path: 'ratings',name: 'ratings',component: Ratings,meta: {keepAlive: true // 存}}]}]})
- App.vue 里面
<template><div id="app"><keep-alive><router-view v-if="$route.meta.keepAlive"></router-view></keep-alive><router-view v-if="!$route.meta.keepAlive"></router-view></div></template><script>export default {name: 'App'}</script>
原文链接:https://blog.csdn.net/fu983531588/article/details/90321827
生命周期图

