Vue的生命周期和监听函数(钩子函数)

基本说明
1. Vue 实例有一个完整的生命周期,也就是说从开始创建、初始化数据、编译模板、挂载
DOM 、渲染 - 更新 - 渲染、卸载等一系列过程,我们称为 Vue 实例的生命周期
2. 钩子函数 ( 监听函数 ): Vue 实例在完整的生命周期过程中 ( 比如设置数据监听、编译模
板、将实例挂载到 DOM 、在数据变化时更新 DOM ), 也会运行叫做生命周期钩子的函
3. 钩子函数的 作用 就是在某个阶段 , 给程序员一个做某些处理的机会
Vue 图(官方示意图加注释后如下)
下面我们来编写一段代码来证明vue的生命周期过程
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue的生命周期和监听函数</title>
</head>
<body>
<div id="app">
    <span id="num">{{num}}</span>
    <button @click="num++">赞!</button>
    <h2>{{name}},有{{num}}次点赞</h2>
</div>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: "#app", data: {//数据池
            name: "kristina", num: 0
        },
        methods: {
            show() {
                return this.name;
            }, add() {
                this.num++;
            }
        },
        beforeCreate() {//生命周期函数-创建 vue 实例前
            console.log("=============beforeCreate==========");
            console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[no]",
                this.name, " ", this.num);
            // console.log("自定义方法是否加载/使用?[no]", this.show());
            console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
            console.log(" 用 户 页 面 dom 是 否 被 渲 染 ?[no]", document.getElementById("num").innerText);
        },
        created() {//生命周期函数-创建 vue 实例
            console.log("=============created==========");
            console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
                this.name, " ", this.num);
            console.log("自定义方法是否加载/使用?[yes]", this.show());
            console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
            console.log(" 用 户 页 面 dom 是 否 被 渲 染 ?[no]", document.getElementById("num").innerText);
            //可以发出 Ajax
            //接收返回的数据
            //再次去更新 data 数据池的数据
            //编译内存模板结构
        },
        beforeMount() {//生命周期函数-挂载前
            console.log("=============beforeMount==========");
            console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
                this.name, " ", this.num);
            console.log("自定义方法是否加载/使用?[yes]", this.show());
            console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
            console.log(" 用 户 页 面 dom 是 否 被 渲 染 ?[no]", document.getElementById("num").innerText);
        },
        mounted() {//生命周期函数-挂载后
            console.log("=============mounted==========");
            console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
                this.name, " ", this.num);
            console.log("自定义方法是否加载/使用?[yes]", this.show());
            console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
            console.log(" 用 户 页 面 dom 是 否 被 渲 染 ?[yes]", document.getElementById("num").innerText);
        },
        beforeUpdate() {//生命周期函数-数据池数据更新前
            console.log("=============beforeUpdate==========");
            console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
                this.name, " ", this.num);
            console.log("自定义方法是否加载/使用?[yes]", this.show());
            console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
            console.log(" 用 户 页 面 dom 数 据 是 否 被 更 新 ?[no]", document.getElementById("num").innerText);
            //验证数据==>修正
            // if(this.num < 10 ) {
            // this.num = 8;
            // }
        },
        updated() {//生命周期函数-数据池数据更新后
            console.log("=============updated==========");
            console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
                this.name, " ", this.num);
            console.log("自定义方法是否加载/使用?[yes]", this.show());
            console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
            console.log(" 用 户 页 面 dom 数 据 是 否 被 更 新 ?[yes]", document.getElementById("num").innerText);
        }
    })
</script>
</body>
</html>

当运行该页面时,

可以看到beforeCreate(),created(),beforeMount(),mounted()方法被调用,印证了图中的步骤,那为何beforeUpdate()和update()函数没被调用呢?因为用户页面的dom数据没有被修改,当点击“赞!”按钮时,会触发上面代码的vue对象方法池中的num加1,也就是点赞次数会增加,数据被改动,就会调用beforeUpdate()方法,数据池(data)的数据就会更新,但是还没被渲染到页面上,随后会调用update()方法,将新的数据池(data)数据渲染到dom页面上,结果如下

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue生命周期函数Vue组件或实例在创建、更新和销毁过程中触发的一系列方法。这些方法可以用来在不同的生命周期阶段执行特定的操作。 Vue生命周期函数包括: 1. beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 2. created:在实例创建完成后被立即调用。在这一阶段,实例已经完成了数据观测,属性和方法的运算,watch/event事件的配置,但是DOM元素尚未被挂载。 3. beforeMount:在实例挂载之前被调用。这个阶段,Vue 实例的模板编译已经完成,但是DOM尚未被渲染出来。可以在这个阶段进行一些初始化的事件绑定或发送AJAX请求等操作。 4. mounted:在实例挂载到DOM元素上后被调用。此时,真实的DOM元素已经被渲染出来,并且可以通过DOM API进行操作。 5. beforeUpdate:在数据更新之前被调用,发生在虚拟DOM重新渲染和打补丁之前。可以在这个阶段进行一些实例化相关的操作。 6. updated:在数据更新之后被调用,发生在虚拟DOM重新渲染和打补丁之后。可以在这个阶段进行一些DOM的操作。 7. beforeDestroy:在实例销毁之前被调用。在这个阶段,实例仍然完全可用,可以进行一些清理工作,比如清除定时器、解绑事件等。 8. destroyed:在实例销毁之后被调用。在这个阶段,实例的所有指令和观察者都已解绑,所有的事件监听器都已移除,DOM元素也已被删除。 这些生命周期函数可以帮助我们在适当的时机执行特定的操作,比如在created钩子函数中做数据初始化,mounted钩子函数中操作DOM元素,beforeDestroy钩子函数中清除定时器等。通过合理使用这些生命周期函数,可以更好地控制Vue组件或实例的行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值