实例化vue发生了什么?(详解vue生命周期)

本文将对vue的生命周期进行详细的讲解,让你了解一个vue实例的诞生都经历了什么~

我在Github上建立了一个存放vue笔记的仓库,以后会陆续更新一些知识和项目中遇到的坑,有兴趣的同学可以去看看哈(欢迎star)!

传送门

实例化一个Vue

const app = new Vue({el:"#app',data:{message:'hello,lifePeriod'},methods:{init(){console.log('这是一个方法!')}}
})

1.触发 beforeCreate 钩子函数

组件实例刚被创建,此时无法访问到 el 属性和 data 属性等..

beforeCreate(){console.log(`元素:${this.$el}`)   //undefinedconsole.log(`属性message:${this.message}`) //undefinedconsole.log(`方法init:${this.init}`)   //undefined
}

2.对data进行双向绑定,初始化方法(Observer Data && init events)

当一个 vue 实例被创建时,他向 Vue 的响应式系统中加入了其 data 对象中能找到的所有属性.

利用 es5 特性 Object.defineProperty,遍历 data 对象下所有属性,将其转化为 getter/setter,以便拦截对象赋值与取值操作,然后利用发布/订阅者模式,从而实现数据的双向绑定!

所以只有当实例被创建时 data 中存在的属性才是响应式的!!!!

将methods 下的所有方法进行声明.

将methods下的方法和data下的属性通过遍历和利用 es5 特性 Object.defineProperty代理到实例下.

this.a = this.$data.a = this.data.a;this.fn = this.$methods.fn = this.methods.fn;

3.触发 created 钩子函数

组件实例创建完成,属性已绑定,但 DOM 还未生成,$el 属性还不存在!

created(){console.log(`元素:${this.$el}`)   //undefinedconsole.log(`属性message:${this.message}`) //message:hey,vue-lifePeriod!console.log(`方法init:${this.init}`)   //function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}
}

4.将模板编译成函数 (compile template into render function)

将模板 template 编译成 AST 树、render 函数(new Watch 将模板与数据建立联系)以及 staticRenderFns 函数(通过 diff 算法优化 dom 更新);
运行 render 方法,返回一个 vnode 对象(virtual dom)

5. 触发 beforeMount 钩子函数

模板编译/挂载之前

beforeMount(){console.log(`元素:${(this.$el)}`)console.log(this.$el)  //<div id="app">{{message}}</div> ,我们发现此时的el还未对数据进行渲染.(虚拟dom的内容)}

6. 触发 mounted 钩子函数

模板编译/挂载之后

mounted(){console.log(`元素:${(this.$el)}`)console.log(this.$el)   //<div id="app">{{hello,vue-lifePeriod!}}</div>   ,已将数据渲染到真实dom}

我们这时将 app.message 改变为'hey,vue-lifePeriod';

7.触发 beforeUpdate 钩子函数

组件更新之前

beforeUpdate(){console.log(this.$el.innerHTML);  //hello,vue-lifePeriod   ,此时,元素的真实dom内容还未改变.}

8.重新渲染虚拟 dom,并通过 diff 算法对比 vnode 节点差异更新真实 dom (virtual DOM re-render and patch)

9.触发 updated 钩子函数

组件更新之后

updated(){console.log(this.$el.innerHTML);  //hey,vue-lifePeriod   ,此时,元素的真实dom内容已经改变.}

我们这时调用 app.$destroy()函数对组件进行销毁

10.触发 beforeDestroy 钩子函数

组件销毁之前

beforeDestroy(){console.log(this.$el)   //<div id="app">{{hey,vue-lifePeriod!}}</div>console.log(`属性message:${this.message}`) //message:hey,vue-lifePeriod!console.log(`方法init:${this.init}`)   //function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}}

11. 销毁数据监听,子组件和解除事件监听!

12. 触发 destroyed钩子函数

组件销毁之后

destroyed(){console.log(this.$el)   //<div id="app">{{hey,vue-lifePeriod!}}</div>console.log(`属性message:${this.message}`) //message:hey,vue-lifePeriod!console.log(`方法init:${this.init}`)   //function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}
}

实例销毁后虽然 dom 和属性方法都还存在,但改变他们都将不再生效!

app.message = 'hu,vue-lifePeriod';

console.log(app.message) //hey,vue-lifePeriod

实例化vue发生了什么?(详解vue生命周期)相关推荐

  1. Vue实例详解与生命周期

    Vue实例详解与生命周期 http://www.jianshu.com/p/b5858f1e6e76 Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理. ...

  2. 详解servlet生命周期

    详解servlet 生命周期(转载) Servlet 有良好的生存期的定义,包括如何加载.实例化.初始化.处理客户端请求以及如何被移除.这个生存期由 javax.Servlet.Servlet 接口的 ...

  3. 详解spring生命周期的扩展点

    详解spring生命周期的扩展点,加速你追赶高手的脚步 详解spring生命周期的扩展点

  4. vue 监控元素宽度_Vue入门系列之Vue实例详解与生命周期

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着. ...

  5. 05Vue.js快速入门-Vue实例详解与生命周期

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着. ...

  6. vue 调取本地wps_详解VUE调用本地json的使用方法

    开始的时候我以为,用vue去调取json要多么的麻烦,完咯就先去的百度,找了几个,看上面又要配置这配置那的,看的我都头大,像一些思维逻辑清晰的肯定不会出现这种情况. 下面我说下我这的情况,大家依情况代 ...

  7. 微信小程序02【配置详解、生命周期-app对象使用、页面跳转详解】

    学习地址:https://www.bilibili.com/video/BV1sx411z77P 笔记01:https://blog.csdn.net/weixin_44949135/article/ ...

  8. 活跃用户数怎么计算_不懂LTV,怎么做用户增长?详解用户生命周期价值计算方法...

    什么是 LTV? LTV的全称是Life Time Value,用来衡量用户的生命周期价值. LTV是通常被应用于营销领域,用来衡量用户在其生命周期内,为企业贡献了多少收入或利润(根据算法微调可分别计 ...

  9. 详解react生命周期

    生命周期函数是指在某一特定时刻组件会自动调用执行的函数. react生命周期可分为3个阶段:挂载,更新及销毁. 在挂载前会先进行初始化过程,这个阶段组件会初始化自己的数据,如state.props. ...

最新文章

  1. Java黑皮书课后题第10章:*10.22(实现String类)Java库中提供了String类,给出你自己对下面方法的实现(将新类命名为MyString1)
  2. Django-启动文件的制作
  3. MHA+LAMP+Keepalived实现高可负载均衡综合实验
  4. vim中跳到第一行和最后一行
  5. cmd oracle 连接实例_C#连接Oracle数据库的实例方法
  6. 使用gitlab初次上传代码
  7. 智能仓储管理系统分析?
  8. 如何清空_回收站删除的文件怎么恢复?回收站清空如何恢复?
  9. python柱状图代码_python+matplotlib实现礼盒柱状图实例代码
  10. android阴影edittext,android – 将阴影效果添加到EditText字段
  11. laravel 文档
  12. 后台管理系统项目整体流程
  13. python新打包工具,最好用的版本之一,不接受反驳
  14. 按照角度进行图片旋转
  15. mac添加Chrome插件的方法
  16. 以太坊区块链 POA本地搭建多节点私有链
  17. 蓝牙AoA精准定位产品
  18. win11+虚拟机VMware+win10+Anaconda+Tensorflow
  19. JavaScript编写日历(简单易懂,代码可以直接运行)
  20. FPGA数字系统设计(8)——可综合电路及状态机

热门文章

  1. 用Python实现ax²+by的图灵机【形式语言与自动机】
  2. python定时重新初始化类_如何重新初始化类对象
  3. str python3_python3.4.3如何转换str字符串?
  4. linux系统安装klocwork,linux下klocwork的使用
  5. 的pro文件添加opencv配置_VS2013+OpenCV3.1.0配置方法
  6. 替代left join方法_你应该使用pathlib替代os.path
  7. Java 8 Stream.distinct() 列表去重示例
  8. java bean jsonobject_利用JSONObject将json 字符串转换为java bean对象
  9. 电脑鼠标失控自己乱点_在这款沙盒游戏里,你只需要乱点鼠标就能成为建筑艺术家...
  10. 酒店管理系统-数据库设计说明书