生命周期
生命周期钩子函数: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