vue生命周期详解

vue生命周期详解,第1张

vue源码中最终执行生命周期函数都是调用 callHook 方法, callHook 函数的逻辑很简单,根据传入的生命周期类型 hook ,去拿到 vm.$options[hook] 对应的回调函数数组,然后遍历执行,执行的时候把 vm 作为函数执行的上下文。

1. new Vue(options) :创建一个vm实例;

2. mergeOptions(resolveConstructorOptions(vm.constructor), options, vm) :合并Vue构造函数里options和传入的options或合并父子的options。比如:在mergeOptions函数中会调用mergeHook方法合并生命周期的钩子函数,mergeHook方法原理是只有父时返回父,只有子时返回数组类型的子。父、子都存在时,将子添加在父的后面返回组合而成的数组。这也是父子均有钩子函数的时候,先执行父的后执行子的的原因;

3. initLifecycle(vm)、initEvents(vm)、initRender(vm) :在创建的vm实例上初始化生命周期、事件、渲染相关的属性;

4. callHook(vm, 'beforeCreate') :调用beforeCreate生命周期钩子函数;

5. initInjections(vm)、initState(vm)、initProvide(vm) :初始化数据:inject、state、provide。initState 的作用是初始化 props、data、methods、watch、computed 等属性;

6. callHook(vm, 'created') :调用created生命周期钩子函数;

7. vm.$mount(vm.$options.el) : $mount 方法在多个文件中都有定义,如"src/platform/web/entry-runtime-with-compiler.js"、"src/platform/web/runtime/index.js"、"src/platform/weex/runtime/index.js"。因为 $mount 方法的实现是和平台、构建方式相关的。以"entry-runtime-with-compiler.js"为例,关键步骤是查看 vm.$options 中是否有render方法,如果没有则会根据el和template属性确定最终的template字符串,再调用 compileToFunctions 方法将template字符串转为render方法,最后,调用原先原型上的$mount方法,即开始执行"lifecycle.js"中 mountComponent 方法;

8. callHook(vm, 'beforeMount') :调用beforeMount生命周期钩子函数;

9. vm._render() => vm._update() => vm.__patch__() :先执行vm._render方法,即调用createElement生成虚拟DOM,即VNode ,每个VNode有children ,children 每个元素也是⼀个 VNode,这样就形成了⼀个 VNode Tree;再调用vm._update方法进行首次渲染,vm._update方法核心是调用vm. patch 方法,这个方法跟vm.$mount一样跟平台相关;vm. patch 方法则是根据生成的VNode Tree递归createElm方法创建真实Dom Tree挂载到Dom上;

10. callHook(vm, 'mount') :调用mount生命周期钩子函数:VNode patch 到 Dom 之后会执行 'invokeInsertHook'函数,把 insertedVnodeQueue 中保存的mount钩子函数执行一遍,insertedVnodeQueue队列中的钩子函数是在根据VNode Tree递归createElm方法创建真实Dom Tree过程生成的钩子函数顺序队列,因此mounted钩子函数的执行顺序是先子后父;

11. data changes :数据更新,nextTick中执行 flushSchedulerQueue 方法,该方法会执行watcher队列中的watcher;

12. callHook(vm, 'beforeUpdate') :执行watcher时会执行watcher的before方法,即调用beforeUpdate生命周期钩子函数;

13. Virtual DOM re-render and patch :重新render生成新的Virtual DOM,并且patch到DOM上;

14. callHook(vm, 'updated') :调用updated生命周期钩子函数;

15. vm.$destroy() :启动卸销毁过程;

16. callHook(vm, 'beforeDestroy') :调用beforeDestroy生命周期钩子函数;

17. Teardown watchers, childcomponents and event listeners :执行一系列销毁动作,在 $destroy 的执行过程中,它又会执行 vm.__patch__(vm._vnode, null) 触发它子组件的销毁钩子函数,这样一层层的递归调用,所以 destroyed 钩子函数执行顺序是先子后父,和 mounted 过程一样。

18. callHook(vm, 'destroyed ') :调用destroyed 生命周期钩子函数。

vue生命周期分为8个阶段,即分别是创建前、创建后、载入前、载入后、更新前、更新后、销毁前、销毁后。VUE是iOS和Android平台上的一款Vlog社区与编辑工具,允许用户通过简单的 *** 作实现Vlog的拍摄、剪辑、细调、和发布,记录与分享生活,还可以在社区直接浏览他人发布的Vlog,与Vloggers互动。随着手机摄像头的发展,越来越多的人开始使用手机拍照和摄像。VUE软件通过点按改变视频的分镜数实现简易的剪辑效果,而剪辑能够让视频传达更多的信息。同时,该软件中有12款滤镜供用户选择,切换至前置摄像头会出现自然的自拍美颜功能。VUE支持40款手绘贴纸,还可以编辑贴纸的出现时间。

和wbpack生命周期方法一样, 都是在从生到死的特定阶段调用的方法

PS: 生命周期钩子 = 生命周期函数 = 生命周期事件

    2.1创建期间的生命周期方法beforeCreate:

        created:

        beforeMount:

        mounted:

    2.2运行期间的生命周期方法beforeUpdate:

        updated:

    2.3销毁期间的生命周期方法beforeDestroy:

        destroyed:

1.Vue特殊特性Vue特点: 数据驱动界面更新, 无需 *** 作DOM来更新界面

也就是说Vue不推荐我们直接 *** 作DOM, 但是在企业开发中有时候我们确实需要拿到DOM *** 作DOM

那么如果不推荐使用原生的语法获取DOM, 我们应该如何获取DOM?

在Vue中如果想要拿到DOM元素我们可以通过ref来获取2.ref使用2.1在需要获取的元素上添加ref属性. 例如: <p ref="mypp">我是段落

2.2在使用的地方通过 this.$refs.xxx获取, 例如this.$ref.myppp

3.ref特点ref添加到元素DOM上, 拿到的就是元素DOM

ref添加到组件上, 拿到的就是组件

1.Vue渲染组件的两种方式

    1.1先定义注册组件, 然后在Vue实例中当做标签来使用

    1.2先定义注册组件, 然后通过Vue实例的render方法来渲染

2.两种渲染方法的区别

    1.1当做标签来渲染, 不会覆盖Vue实例控制区域

    1.2通过render方法来渲染, 会覆盖Vue实例控制区域


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/bake/8015429.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存