前端开发 大前端 W3Cbest

一个专注 WEB 开发的技术博客

0%

关于Vue的生命周期

所有生命周期钩子的 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在实例创建完成后被立即同步调用。beforeCreatedcreated 无法获取到 DOM,mountedDOM被创建,此时可以获取到DOM

父组件引入子组件,执行生命周期的顺序是什么

  • 父组件引入子组件会先执行父组件的beforeCreated created beforMounted 前三个生命周期。
  • 再执行子组件的beforeCreated created beforMounted mounted前四个生命周期。
  • 然后再执行父组件的 mounted生命周期

在created中获取DOM

created在实例创建完成后被立即同步调用。但此时DOM还未被创建,只有通过异步调用后,在异步中可以获取到DOM
例如:setTimeout、请求接口、$nextTick, $refs等

发送请求在created还是mounted?

发送请求在created还是mounted这个问题具体要看项目和业务的情况

  • 如果组件的加载顺序是父组件引入了子组件,那么会先执行父组件的beforeCreated createdbeforMounted的前三个生命周期,再执行子组件的再执行子组件的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 ===> 关闭页面记录浏览位置,初始化的时候从上一次的历史开始浏览

坚持技术创作分享,您的支持将鼓励我继续创作!