所有生命周期钩子的
this
上下文将自动绑定至实例中,因此你可以访问 data、computed 和 methods。这意味着你不应该使用箭头函数来定义一个生命周期方法 (例如created: () => this.fetchTodos()
)。因为箭头函数绑定了父级上下文,所以this
不会指向预期的组件实例,并且this.fetchTodos
将会是 undefined。
vue的生命周期有哪些?
beforCreated
类型:Function
详细:
在实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用。
参考:生命周期图示
created
类型:Function
详细:
在实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,且 $el property 目前尚不可用。
参考:生命周期图示
beforMounted
类型:Function
详细:
在挂载开始之前被调用:相关的 render
函数首次被调用。
该钩子在服务器端渲染期间不被调用。
参考:生命周期图示
mounted
类型:Function
详细:
实例被挂载后调用,这时 el
被新创建的 vm.$el
替换了。如果根实例挂载到了一个文档内的元素上,当 mounted
被调用时 vm.$el
也在文档内。
注意 mounted
不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕再执行某些操作,可以在 mounted
内部使用 vm.$nextTick:
mounted: function () {
this.$nextTick(function () {
// 仅在整个视图都被渲染之后才会运行的代码
})
}
该钩子在服务器端渲染期间不被调用。
参考:生命周期图示
beforUpdated
类型:Function
详细:
在数据发生改变后,DOM 被更新之前被调用。这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器。
该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务器端进行。
参考:生命周期图示
updated
类型:Function
详细:
在数据更改导致的虚拟 DOM
重新渲染和更新完毕之后被调用。
当这个钩子被调用时,组件 DOM
已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher
取而代之。
注意,updated
不会保证所有的子组件也都被重新渲染完毕。如果你希望等到整个视图都渲染完毕,可以在 updated
里使用 vm.$nextTick:
updated: function () {
this.$nextTick(function () {
// 仅在整个视图都被重新渲染之后才会运行的代码
})
}
该钩子在服务器端渲染期间不被调用。
参考:生命周期图示
beforDestroy
类型:Function
详细:
实例销毁之前调用。在这一步,实例仍然完全可用。
该钩子在服务器端渲染期间不被调用。
参考:生命周期图示
destroyed
类型:Function
详细:
实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。
该钩子在服务器端渲染期间不被调用。
参考:生命周期图示
activated
类型:Function
详细:
被 keep-alive 缓存的组件激活时调用。
该钩子在服务器端渲染期间不被调用。
参考:
构建组件 - keep-alive
动态组件 - keep-alive
deactivated
类型:Function
详细:被 keep-alive 缓存的组件失活时调用。
该钩子在服务器端渲染期间不被调用。
参考:
构建组件 - keep-alive
动态组件 - keep-alive
errorCaptured
类型:(err: Error, vm: Component, info: string) => ?boolean
详细:
在捕获一个来自后代组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。
参考:渲染函数
进入组件会执行那些生命周期
进入到页面或进入到组件,会执行 beforeCreated
created
beforMounted
mounted
这四个生命周期。beforeCreated
在实例初始化后进行数据监听和事件监听之前同步调用。created
在实例创建完成后被立即同步调用。beforeCreated
和 created
无法获取到 DOM
,mounted
时DOM
被创建,此时可以获取到DOM
父组件引入子组件,执行生命周期的顺序是什么
- 父组件引入子组件会先执行父组件的
beforeCreated
created
beforMounted
前三个生命周期。 - 再执行子组件的
beforeCreated
created
beforMounted
mounted
前四个生命周期。 - 然后再执行父组件的
mounted
生命周期
在created中获取DOM
created
在实例创建完成后被立即同步调用。但此时DOM还未被创建,只有通过异步调用后,在异步中可以获取到DOM
例如:setTimeout、请求接口、$nextTick, $refs等
发送请求在created还是mounted?
发送请求在created还是mounted这个问题具体要看项目和业务的情况
- 如果组件的加载顺序是父组件引入了子组件,那么会先执行父组件的
beforeCreated
created
和beforMounted
的前三个生命周期,再执行子组件的再执行子组件的beforeCreated
created
beforMounted
mounted
前四个生命周期,然后再执行父组件的mounted
生命周期。 - 如果业务是父组件引入子组件,并且优先加载子组件的数据,那么在父组件中当前的请求应放在
mounted
中。 - 如果当前组件没有依赖关系那么放在哪个生命周期中请求都可以的。
beforCreated 中发请求的优劣势,beforeCreate和created有什么区别?
优势:可以提前加载好数据,整理数据
劣势:如果请求是在methods封装好了,在beforeCreate调用的时候,beforeCreate阶段是拿不到methods里面的方法的(会报错了) 。
区别:
$data | methods | |
---|---|---|
beforeCreate | 无 | 无法获取 |
created | 有 | 可以获取 |
created和mounted的区别
created()
和 mounted()
之间的根本区别在于访问DOM,在 created()
中返回 null,在 mounted()
中返回 DOM 元素。因此,任何 DOM 操作,甚至使用诸如 querySelector 之类的方法获取 DOM 元素结构将无法在 created()
中使用。因此根据这点区别 created()
非常适合调用 API,而 mounted()
非常适合在 DOM 元素完全加载后执行任何操作。
加入keep-alive会执行哪些生命周期?
如果使用了keep-alive组件会额外增加2个生命周期activated
deactivated
如果当前组件加入了keep-alive第一次进入这个组件会执行5个生命周期 beforeCreated
created
beforMounted
mounted
activated
第二次或者第N次进去组件会执行哪些生命周期?
如果当前组件加入了keep-alive,只会执行一个activated
生命周期
如果没有加入keep-alive就会执行beforeCreated
created
beforMounted
mounted
前四个生命周期
你在什么情况下用过哪些生命周期?说一说生命周期使用场景
created ===> 单组件请求
mounted ===> 同步可以获取dom,如果先子组件请求后父组件请求
activated ===> 用于缓存同页面使用,判断id是否相等,如果不相同发起请求
destroyed ===> 关闭页面记录浏览位置,初始化的时候从上一次的历史开始浏览