老莫的笔记本  
  
查看: 1150|回复: 0

VUE 生命周期函数【生命钩子函数】

[复制链接]

662

主题

878

帖子

5145

积分

超级版主

Rank: 8Rank: 8

积分
5145
发表于 2018-11-22 23:21:11 | 显示全部楼层 |阅读模式
来 先掰扯一下:嘛是生命周期函数? 嘛又叫生命周期钩子?
容我大白话翻译一下: 生命周期说白了,粗暴的理解方式就是  一个组件 从 开始创建, 到最后销毁的全过程。

先贴上VUE所有的 生命周期【胖爷写了一大一小两个组件做测试 home 内包含组件 head 】
Home.vue
  1. <template>
  2.     <div id="home">
  3.         <button @click="chan"> 点击切换触发生命周期 </button>   
  4.         <!-- 头部组件引入 -->
  5.         这是home组件 <span class="lmtest">测试值是否变色</span>
  6.         
  7.         <v-head  v-if="b" ></v-head>
  8.     </div>
  9. </template>
  10. <script>
  11. // 1.引入头部组件  【组件文件尽量放在 components/ 目录中,大写首字母的.vue文件 】
  12. // 2.注册组件 【 注意如果下面components内容为ES6 语法 则html 则写成对应的标签  】
  13. // 3.引入组件 【在页面中写入<v-head></v-head> 】
  14. import Head from "./Head.vue";
  15. export default {
  16.   data() {
  17.     return {
  18.       b:true
  19.     };
  20.   },
  21.   methods: {
  22.     chan(){
  23.       if(this.b){
  24.         this.b = false
  25.       }else{
  26.         this.b = true
  27.       }
  28.     }
  29.   },
  30.   name: "app",
  31.   components: {         //这用于组件的注册,
  32.     'v-head':Head
  33.   }
  34.   ,beforeCreate(){
  35.     alert('创建vue实例前')
  36.     console.log('创建vue实例前',this)
  37.   }
  38.   ,created() {
  39.     alert('创建vue实例后')
  40.     console.log(this)
  41.   }
  42.   ,beforeMount(){
  43.     alert('home挂载到demo前')
  44.   }
  45.   ,mounted(){
  46.     alert('home挂载到demo后')
  47.   }
  48.   ,beforeUpdate(){
  49.     alert('数据变化更新前')
  50.   }
  51.   ,updated(){
  52.     alert('数据变化更新后')
  53.   }
  54.   ,beforeDestroy(){
  55.     alert('Vue实例销毁前')
  56.   }
  57.   ,destroyed(){
  58.     alert('VUE实例销毁后')
  59.   }
  60. };
  61. </script>
  62. <style scoped>
  63. .lmtest {
  64.   background: #000;
  65.   color: #fff;
  66. }
  67. h2 {
  68.   font: 10px;
  69. }
  70. </style>
复制代码

Head.vue
  1. <template>
  2.     <div id="head">
  3.         <h2>  这是头部组件  </h2>
  4.     </div>
  5. </template>
  6. <script>
  7. export default {
  8.    beforeCreate(){
  9.     alert('head----创建vue实例前')
  10.     console.log('创建vue实例前',this)
  11.   }
  12.   ,created() {
  13.     alert('head----创建vue实例后')
  14.     console.log(this)
  15.   }
  16.   ,beforeMount() {
  17.     alert("head----挂载到demo前");
  18.   },
  19.   mounted() {
  20.     alert("head----挂载到demo后");
  21.   }
  22.   ,beforeDestroy(){
  23.     alert('head----Vue实例销毁前')
  24.   }
  25.   ,destroyed(){
  26.     alert('head----VUE实例销毁后')
  27.   }
  28. };
  29. </script>
  30. <style>
  31. </style>
复制代码

在 每个阶段打印 this 都会得到不同的值:
  1. vue对象初始化过程中,会执行到beforeCreate,created,beforeMount,mounted 这几个钩子的内容;
  2. beforeCreate :数据还没有监听,没有绑定到vue对象实例,同时也没有挂载对象;
  3. created :数据已经绑定到了对象实例,但是还没有挂载对象;
  4. beforeMount: 模板已经编译好了,根据数据和模板已经生成了对应的元素对象,将数据对象关联到了对象的 $el属性,
  5.     $el属性是一个HTMLElement对象,也就是这个阶段,vue实例通过原生的createElement等方法来创建这个html片段,准备
  6.     注入到我们vue实例指明的el属性所对应的挂载点;
  7. mounted:将$el的内容挂载到了el,相当于我们在jquery执行了$(el).html($el),生成页面上真正的dom,上面我们
  8.     就会发现dom的元素和我们$el的元素是一致的。在此之后,我们能够用方法来获取到el元素下的dom对象,并进
  9.      行各种操作. [这个最重要]
  10. 当我们的data发生改变时,会调用beforeUpdate和updated方法
  11. beforeUpdate :数据更新到dom之前,我们可以看到$el对象已经修改,但是我们页面上dom的数据还没有发生改变
  12. updated: dom结构会通过虚拟dom的原则,找到需要更新页面dom结构的最小路径,将改变更新到dom上面,完成更新
  13. 实例的销毁
  14. beforeDestroy,destroed :实例的销毁,vue实例还是存在的,只是解绑了事件的监听还有watcher对象数
  15.             据与view的绑定,即数据驱动
复制代码


参考文献:https://www.cnblogs.com/caizhenbo/p/6418291.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表