图示解析:
此图为vue官网提供的vue生命周期的整个过程:
组件生命周期指的是组件从创建到销毁的过程,在这个过程中的一些不同的阶段,vue
会调用指定的一些组件方法
基本生命周期函数有下面几个阶段:
每一个阶段都对应着 之前 和 之后 两个函数
初始化阶段,应用不多。
此时,只初始化了组件的时间和生命周期等基本的东西,还无法获取组件的data和el数据,此时这些都还没有准备好
在实例创建完成后被立即调用,该阶段完成了对 data
中的数据的 observer
,该阶段可以处理一些异步任务。
但是此时el还没有准备好(要一直到beforeMount()后才准备好),所以这个阶段只能去处理一些与DOM操作无关的事情
在挂载开始之前被调用,应用不多。
此时已经可以访问数据和el等。注意:此时数据和el都已解析完成,但是还没有挂载到页面中,如果此时要去获取元素宽高等属性不一定能获取到。
如果有子组件,则根组件在执行完beforeMount()后,会先将子组件从beforeCreate()执行到mounted()渲染完成后,再执行根组件的mounted()函数。
该阶段执行完了模板解析,以及挂载。同时组件根组件元素被赋给了 $el
属性,该阶段可以通过 DOM 操作来对组件内部元素进行处理了。
数据更新时调用,但是还没有对视图进行重新渲染,这个时候,可以获取视图更新之前的状态
由于数据的变更导致的视图重新渲染,可以通过 DOM 操作来获取视图的最新状态
实例销毁之前调用,移除一些与组件无关的,不必要的冗余数据,比如定时器。
与组件有关的,如prop数据等,会自动销毁
Vue 实例销毁后调用。
当捕获一个来自子孙组件的错误时被调用,此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false
以阻止该错误继续向上传播。
由自己捕获并处理错误。
最后使用内置组件判断有错误和没有发生错误时的处理方式:
有错误发生了
需求:
监控子组件和根组件的生命周期执行过程;
根组件中按钮点击隐藏时,监控根组件和子组件生命周期的执行过程;(根组件的更新子组件同时也会更新)
如果想要更新子组件,改变根组件t的值,子组件接收数据t后就会进行更新;
错误处理;
步骤分析:
创建一个kkbComponent组件,组件中接收到父级传入的数据t,组件模板只有显示功能;
给子组件分别挂载了beforeCreate(),created(), beforeMount(),mounted(),beforeUpdate(),updated(),beforeDestory(),destoryed()所有生命周期的函数;
在根组件实例里绑定子组件,并绑定自己的所有生命周期函数;
根组件中按钮点击隐藏时,监控根组件(更新)和子组件(销毁(v-if))生命周期的执行过程;
根组件中按钮再次点击隐藏时,监控根组件(更新)和子组件(创建到销毁)生命周期的执行过程;
如果想要更新子组件,改变根组件t的值,子组件接收数据t后就会进行更新(此时子组件和根组件都会执行更新阶段函数);
因为使用的v-if所以点击隐藏时,就会执行销毁方法;
故意使用错误的数据输出,{{t.a.b}}形成错误,进行错误处理;
Document
{{title}}
有错误发生了
如果我们希望获取组件节点,进行 DOM 相关操作,可以通过 ref
和 $refs
来完成。
如果子组件中有ref属性,则父级组件可以通过$refs属性获取子组件实例对象及其内部方法,并对其进行DOM操作。
给元素或组件添加 ref
属性,则该元素或组件实例对象将被添加到当前组件实例对象的 $refs
属性下面
该属性的是一个对象,存储了通过 ref
绑定的元素对象或者组件实例对象
需求:
Document
{{title}}
这是内容
这是内容
这是内容
这是内容
这是内容
当数据更新的时候,视图并不会立即渲染,这个时候我们期望获取到视图更新后的数据,可以通过 nextTick
来进行操作 。
nextTick
方法将在更新队列循环结束之后立即调用。
需求:点击按钮后,重新渲染一个相同高度的div。此时数据更新后,视图不会立即渲染(每次获取到的是上一次渲染后的结果)
Document
{{title}}