我了解的生命周期

109 阅读1分钟

11.jpg 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

生命周期

作用:特定的时间点,执行某些特定的操

场景: 组件创建完毕后,可以在created 生命周期函数中发起Ajax 请求,从而初始化 data 数据

生命周期分为 : 初始化阶段,挂载阶段,更新阶段,销毁阶段

1.初始化阶段

beforeCreate :

初始化前,开始给data,computed,methods等传递数据,但还没有传递完成

created

初始化完成 : 这个阶段已经数据初始化完成,data,computed,methods等传递数据完成,大多情况下,created钩子函数是我们用到最多的一个钩子

2.挂载阶段

beforeMount :

挂载前,开始渲染页面,但是页面还没有渲染完成,访问不到Dom

mounted

挂载后 : 页面渲染完成,可以访问真是的Dom

3.更新阶段

beforeUpdate

更新前,数据已经修改,但真实DOM还没有更新

updated

更新后 : 数据修改完成,真实DOM也更新完成,一般,在这个阶段,获取DOM

4.销毁阶段

beforeDestroy

销毁前,一般需要清除定时器,/全局的时间等

mounted

更新后 : 数据和DOM销毁

生命周期函数执行过程

    <template>
      <div>
        <ul id="myUl">
          <li v-for="(item, ind) in arr" :key="ind">{{ item }}</li>
        </ul>
        <button
          @click="arr.push(Math.random() * 10)"
        >
          增加一个元素
        </button>
      </div>
    </template>

    <script>
    export default {
      data () {
        return {
          msg: "我是变量",
          arr: [1, 2, 3, 4]
        }
      },
      beforeCreate () {
        // 1. 创建前
        console.log("beforeCreate --- 实例初始化前")
        console.log(this.msg) // undefined
      },
      created () {
        // 2. 创建后=> 发送ajax请求
        console.log("created ---  实例初始化后")
        console.log(this.msg) // "我是变量"

        // 给对象添加属性
        this.timer = setInterval(()=>{
          console.log(Date.now())
        }, 1000)
        this.fn = ()=>{ console.log(Date.now())}
        document.addEventListener('mousemove', this.fn)
      },
      beforeMount () {
        // 3. 挂载前
        console.log("beforeMount --- vue的虚拟DOM, 挂载到真实的网页之前")
        console.log(document.getElementById("myUl")) // null
        // console.log(document.getElementById("myUl").children[1].innerHTML) // 报错
      },
      mounted () {
        // 4. 挂载后=> 操作dom
        console.log("mounted --- vue的虚拟DOM, 挂载到真实的网页上 ")
        // console.log(document.getElementById("myUl").children[1].innerHTML)
        console.log(document.querySelector('#myUl').children[1].innerText)
      },
      beforeUpdate () {
        // 5. 更新前
        console.log("beforeUpdate --- 数据更新, 页面更新前")
        // 比如点击新增数组元素, vue会触发此生命周期函数, 但是此时页面并未更新, 所以获取不到新增的li标签
        // console.log(document.getElementById("myUl").children[4].innerHTML) // 报错
      },
      updated () {
        // 6. 更新后
        console.log("updated --- 数据更新, 页面更新后")
        console.log(document.getElementById("myUl").children[4].innerHTML)
      },
      beforeDestroy () {
        // 7. 销毁前
         // (清除定时器 / 解绑js定义的事件)
        console.log("beforeDestroy --- 实例销毁之前调用")
      },
      destroyed () {
        // document.removeEventListener('mousemove', 回调函数的名字)
        document.removeEventListener('mousemove', this.fn)
        // clearInterval(this.timer)
        // 8. 销毁后
        // (清除定时器 / 解绑js定义的事件)
        console.log("destroyed --- 销毁完成")
      }
    };
    </script>