vue 2.0的生命周期(钩子函数)

首先大致看一下官网生命周期图
在这里插入图片描述

vue常用的有8种生命周期函数:

钩子函数触发的行为在此阶段可以做的事情
beforeCreadtedvue实例的挂载元素$el和数据对象data都为undefined,还未初始化。加loading事件
createdvue实例的数据对象data有了,$el还没有结束loading、请求数据为mounted渲染做准备
beforeMountvue实例的$el和data都初始化了,但还是虚拟的dom节点,具体的data.msg还未替换。-
mountedvue实例挂载完成,data.msg成功渲染配合路由钩子使用
beforeUpdatedata更新时触发-
updateddata更新时触发数据更新时,做一些处理(此处也可以用watch进行观测)
beforeDestroy组件销毁时触发-
destroyed组件销毁时触发,vue实例解除了事件监听以及和dom的绑定(无响应了),但DOM节点依旧存在组件销毁时进行提示

测试代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 
        1. 数据
        2. 节点
     -->
    <div id="app">
      <h1>{{msg}}</h1>
      <button @click="handleClick">获取app节点</button>
      <button @click="msg='😀'">改变msg</button>
      <!-- 通过 $destory 组件销毁 -->
      <button @click="handleDestory">销毁组件</button>
    </div>
  </body>
  <script src="./node_modules/vue/dist/vue.js"></script>
  <script>
    let vm = new Vue({
      el: "#app",
      data: {
        msg: "(*^_^*)",
      },
      // 1. 组件创建之前的生命周期
      beforeCreate() {
        console.log("元素", this.$el);//元素 undefined
        console.log("数据:", this.$data);//数据: undefined
      },
      /* 2. 
        组件创建的时候
        a. 发请求拿数据
         */
      created() {
        console.log("created 元素", this.$el);//created 元素 undefined
        console.log("created 数据:", this.$data);//created 数据: Object
        //拿数据  fetch axios ajax jQuery 
      },
      /* 3. beforeMounte 组件挂载前 */
      beforeMount() {
        let appInnerHtml = document.getElementById("app").innerHTML;//
        console.log("beforeMount 元素", this.$el); // beforeMount 元素 <div id=​"app">​…​</div>​
        console.log("beforeMount 数据:", this.$data);//beforeMount 数据: object
        console.log(appInnerHtml);//打印整个页面除app以外所有元素
      },
      /* 4. 
      mounted 组件挂载到 dom树上了 
      a. 请求数据
      b. 操作dom 节点
      */
      mounted() {
        let appInnerHtml = document.getElementById("app").innerHTML;
        console.log("mounted 元素", this.$el);//mounted 元素 <div id=​"app">​…​</div>​
        console.log("mounted 数据:", this.$data);//mounted 数据: Object
        console.log(appInnerHtml);//打印整个页面除app以外所有元素
      },
      /* 5.组件更新之前 */
      beforeUpdate() {
          console.log(" beforeUpdate 组件更新之前");
      },
      /* 6.组件更新 */
      updated() {
          console.log("updated 组件更新");  
      },
      /* 组件销毁前 */
      beforeDestroy() {
          console.log("beforeDestroy 组件销毁前");
      },
      /* 组件销毁
        a. 取消无用的请求,定时器和订阅取消
       */
      destroyed() {
          console.log("destroyed 组件销毁");
      },
      methods: {
        handleClick: function () {
          console.log(this.$el);
          console.log(this.$data);
        },
        handleDestory:function(){
            this.$destroy();
        }
      },
    });
  </script>
</html>

组件套用时的生命周期

  • 先执行父组件的created和beforeMounted函数;
  • 再按子组件的使用顺序,执行子组件的created和beforeMounted函数;
  • 再执行子组件的执行顺序执行mounted函数,最后是父组件的mounted函数;
  • 也就是说父组件准备要挂载还没挂载的时候,子组件先完成挂载,最后父组件再挂载;
  • 总结:在真正整个大组件挂载完成之前,内部的子组件和父组件之间的数据时可以流通的

也可以看看这位仁兄的 vue生命周期钩子函数详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值