对着官网的demo写例子,碰到了生命周期钩子方法,之前只是根据官网的图,了解了大概,

现在忍不住想去深扒一下,因此找了几个博客看了下,受益匪浅,故此笔记;

参考:http://www.cnblogs.com/duanyue/p/7088569.html

beforeCreate:

  实例创建后,此时data observer和 event /watch等都为执行;data observer就是data中的所有数据,通过Object.defineProperty设置get 和set

  此时 this.$el   this.$data都是未初始化

created:

  此时已经经过了data observer 和init event/watch等事件的初始化;但还未挂载,也就是还未和dom产生联系,个人觉得此阶段为数据准备阶段,故一些请求啥的可以放在这个阶段来做

  此时this.$el 仍为undefined   而this.$data可用

beforeMount:

  官方的这个阶段和上一个钩子(created)之间多的过程为:compile template into render function 和 compile el's outHTML as template ;

  通过字面理解,为模板的编译过程,即如果有el选项,则对应id里面html拿出来,对其进行编译,期间会解析各种v-语法,形成各种模板关系。但此时并没有渲染html;所以打印出el中的内容,还是不变

  此时this.$el可用;

mounted:

  此时已经将各种解析后的模板,替换到el对应的内容中去

  此时的this.$el和上面的beforeMount的this.$el值不一样,一个是编译前的,一个是编译后的

beforeUpdate:

  数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。

  理论上,此时只有对应的数据值变了,但是变化的值还没有作用到虚拟dom里去,更没有渲染到dom里去,故可以在此对数据进行二次加工。不会造成渲染浪费。

   但是,实际打印此时的this.$el已经受影响被改变,只是这个改变还没被渲染到实际的dom中去,在这个方法里打断点,可以发现this.$el的内容和网页上展示的不一样。此点暂存疑惑,按照打印的结果,可以理解为,已经作用到虚拟dom了,更费解的是,加上断点一句句执行,结果又是符合预期的。如下图

未打断点的打印:                                                                  打断点执行的打印:

              

updated:

  数据更新完成,虚拟dom和实际dom都被修改完成后调用。

  理论上,该钩子里不可以继续修改数据,否则,会成为死循环。

  该钩子在服务器端渲染时不被调用?暂时不解

beforeDestroy:

  实例销毁之前调用。在这一步,实例仍然完全可用。

destroyed:

  Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

  该钩子在服务器端渲染期间不被调用。

测试代码:

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>
</head>
<body> <div id="app">
<p>{{ message }}</p>
</div> <script type="text/javascript"> var app = new Vue({
el: '#app',
data: {
message : "xuxiao is boy"
},
beforeCreate: function () {
console.group('beforeCreate 创建前状态===============》');
console.log("%c%s", "color:red" , "el : " + this.$el); //undefined
console.log("%c%s", "color:red","data : " + this.$data); //undefined
console.log("%c%s", "color:red","message: " + this.message)
},
created: function () {
console.group('created 创建完毕状态===============》');
console.log("%c%s", "color:red","el : " + this.$el); //undefined
console.log("%c%s", "color:red","data : " + this.$data); //已被初始化
console.log("%c%s", "color:red","message: " + this.message); //已被初始化
},
beforeMount: function () {
console.group('beforeMount 挂载前状态===============》');
console.log("%c%s", "color:red","el : " + (this.$el)); //已被初始化
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data); //已被初始化
console.log("%c%s", "color:red","message: " + this.message); //已被初始化
},
mounted: function () {
console.group('mounted 挂载结束状态===============》');
console.log("%c%s", "color:red","el : " + this.$el); //已被初始化
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data); //已被初始化
console.log("%c%s", "color:red","message: " + this.message); //已被初始化
},
beforeUpdate: function () {
console.group('beforeUpdate 更新前状态===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message);
},
updated: function () {
console.group('updated 更新完成状态===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message);
},
beforeDestroy: function () {
console.group('beforeDestroy 销毁前状态===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message);
},
destroyed: function () {
console.group('destroyed 销毁完成状态===============》');
console.log("%c%s", "color:red","el : " + this.$el);
console.log(this.$el);
console.log("%c%s", "color:red","data : " + this.$data);
console.log("%c%s", "color:red","message: " + this.message)
}
})
</script>
</body>
</html>

  

最新文章

  1. 如何利用Python生成随机密码
  2. Java数组排序和查找
  3. 【GoLang】golang HTTP GET/POST JSON的服务端、客户端示例,包含序列化、反序列化
  4. web前端学习策略
  5. 每日学习心得:未定义的命名空间前缀&quot;xsd&quot;问题和&lt;%%&gt;、&lt;%=%&gt;、&lt;%$%&gt;、&lt;%@%&gt;的区别
  6. Creating Icon Overlay Handlers / 创建图标标记 Handlers (翻译自MSDN) / VC++, Windows, DLL, ATL, COM
  7. RESTful WebService入门
  8. Redis 入门第一发
  9. Codeforces554C:Kyoya and Colored Balls(组合数学计算+费马小定理)
  10. RHEL5.8安装Sybase 15.7_x86_64
  11. CaltrainTimes从设计到发布(基于Flex的手机应用)
  12. linux环境
  13. [Swift]LeetCode896. 单调数列 | Monotonic Array
  14. 关于node
  15. console.log()中的%d,%s等代表的输出类型
  16. file图片上传之前先预览
  17. 使用Maven+ssm框架搭建一个web项目
  18. 初级安全入门—— WEBshell与文件上传漏洞
  19. Android-ProgressDialog点击对话框外部是不让其消失
  20. 003.iSCSI客户端管理

热门文章

  1. 雷林鹏分享:jQuery EasyUI 窗口 - 创建简单窗口
  2. So you want to be a computational biologist?
  3. Twisted 简介
  4. JDK常用工具
  5. json -- dump load dumps loads 简单对比
  6. Integer To Roman leetcode java
  7. 漏洞复现——tomcat远程代码执行漏洞
  8. js动态检测加载 JQ
  9. C++ leetcode Longest Palindromic Substring
  10. ForkJoin