03-Vue技术栈之生命周期

Vue实例经历创建、挂载、更新和销毁等阶段,每个阶段都有相应的生命周期钩子函数,如beforeCreate、created、mounted等,这些钩子允许开发者在特定时刻插入自定义逻辑。生命周期钩子不能使用箭头函数定义,以保证正确的上下文。在实例销毁前后,应进行收尾和清理工作,如清除定时器和解绑事件。此外,路由组件有激活和失活的特殊钩子,而$nextTick用于在DOM更新后执行回调。
摘要由CSDN通过智能技术生成

1、什么是生命周期

  1. 又名:生命周期回调函数生命周期函数生命周期钩子
  2. 是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数
  3. 生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的
  4. 生命周期函数中的this指向vm组件实例对象

2、分析生命周期

2.1 生命周期钩子函数

  • 每个Vue实例在创建时都要经过一系列的初始化过程。例如,需要设置数据侦听编译些生命周期钩子函数,给用户在不同阶段添加代码的机会。

2.2 生命周期钩子函数的作用

  • 有一些其他钩子,在实例生命周期的不同阶段被调用,如 mounted, updateddestroyed
  • 生命周期钩子的 this关键字上下文指向调用它的 Vue 实例,调用方法如 this.$el。

注:不能使用箭头函数(()=>)定义一个生命周期方法,如created:()=> this.fetchTodos()
这是因为箭头函数绑定了父上下文,因此 this与期待的Vue实例不同,this.fechTodos()的行为未定义。

2.3 生命周期钩子函数图例

请添加图片描述

基本语法:

			beforeCreate() {
				console.log('beforeCreate')
			},
			created() {
				console.log('created')
			},
			beforeMount() {
				console.log('beforeMount')
			},
			mounted() {
				console.log('mounted')
			},
			beforeUpdate() {
				console.log('beforeUpdate')
			},
			updated() {
				console.log('updated')
			},
			beforeDestroy() {
				console.log('beforeDestroy')
			},
			destroyed() {
				console.log('destroyed')
			}

语法说明:

Vue 实例有一个完整的生命周期,即 Vue 实例从创建到销毁的过程。具体可细分为开始 创建、初始化数据、编译模板、挂载 DOM 渲染、更新渲染、卸载等一系列过程,称为 Vue 的生命周期。在 Vue 的整个生命周期中,提供了一些生命周期钩子函数,为执行自定义逻辑 提供了机会。

  1. beforeCreate:在实例初始化之后,数据观测和 event/watch 事件配置之前被调用。

  2. created:实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测、属性和方法的运算、event/watch
    事件回调。然而,挂载阶段还没有开始,$el 属性目前不可见。

  3. beforeMount:在挂载开始之前被调用,相关的渲染函数首次被调用。在此阶段,它检查是否有任何模板可用于要在 DOM
    中呈现的对象:如果没有找到模板,那么将所定义元素的外部 HTML 视为模板。

  4. mounted:el 被新创建的 vm. $el 替换,并挂载到实例上,之后调用该钩子。一旦模板准备就绪,它将数据放入模板并创建可呈现元素。

  5. beforeUpdate:数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。可以在此钩子中进一步更改状态,不会触发附加的重渲染过程。

  6. updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在此之后调用该钩子。通过实际更新 DOM 对象并触发updated 钩子,屏幕上的变化得到呈现。

  7. beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。在 Vue 对象被破坏并从内存中释放之前,beforeDestroy 钩子被触发,并允许在其中处理自定义代码。

  8. destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑,所有事件侦听器会被移除,所有子实例也会被销毁。该钩子在服务器端渲染期间不被调用。 可以使用生命周期钩子函数在 Vue对象生命周期的不同阶段添加自定义代码。它将帮助 设计人员控制在 DOM 中创建对象的流程,以及更新和删除对象。

    完整生命周期钩子函数调用关系如下图所示:

请添加图片描述

2.4 生命周期钩子函数的应用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
</head>

<body>
    <div id="root">
        <h3>{{information}}</h3>
        <button @click="changeInformation">改变信息</button>
        <button @click="destroyVM">销毁Vue实例</button>
    </div>
    <script>
        new Vue({
            el: '#root',
            data() {
                return {
                    information: '东方青云欢迎您'
                }
            },
            methods: {
                changeInformation() {
                    this.information = '我来了,您在哪里?'
                },
                destroyVM() {
                    this.$destroy()//销毁Vue实例
                }
            },
            beforeCreate() {
                console.log('=====beforeCreate=====')
                console.log('el:' + this.$el)//未定义
                console.log("data:" + this.$data)//未定义
                console.log('=====beforeCreate=====')
            },
            created() {
                console.log('====created=====');
                console.log('el:' + this.$el)//未定义
                console.log("data:" + this.$data)//已被初始化为[object Object]
                console.log("information:" + this.information);//information:东方青云欢迎您
                console.log('====created=====');

            },
            beforeMount() {
                console.log('====beforeMount====');
                console.log('el:' + this.$el);//el:[object HTMLDivElement]
                console.log(this.$el);//当前挂载元素
                document.querySelector('h3').innerText = '1'//无效,虚拟dom
            },
            mounted() {
                // document.querySelector('h3').innerText = '1'//有效,已转化为真实dom
            },
            beforeUpdate() {
                console.log('====beforeUpdate====');
                console.log(this.information);
                // debugger;//断点调试
            },
            updated() {
                console.log(this.information);
            },
            beforeDestroy() {
                console.log('我要被销毁了');
            },
            destroyed() {
                console.log('销毁完毕');
            },
            
        })

    </script>
</body>

</html>

3、生命周期总结

常用的生命周期钩子:

  1. mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
  2. beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

关于销毁Vue实例:
3. 销毁后借助Vue开发者工具看不到任何信息。
4. 销毁后自定义事件会失效,但原生DOM事件依然有效
5. 一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。

4、补充:其他的三个生命周期钩子

具体名字:

  1. activated路由组件被激活时触发。
  2. deactivated路由组件失活时触发

作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态

  1. nextTick

语法:this.$nextTick(回调函数)

作用:在下一次 DOM 更新结束后执行其指定的回调。

使用时机:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行

注:这11个生命周期钩子都是Vue2里面的。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3和TypeScript(TS)是开发Web应用程序的常用技术栈之一。在Vue3中,通过TypeScript可以提供更强大的类型检查和代码提示功能,同时提高了代码的可读性和可维护性。 Vue3中的生命周期Vue2中的生命周期类似,但也有一些新的变化。下面是Vue3中的生命周期: 1. beforeCreate(在创建Vue实例之前):在这个阶段,Vue实例的数据对象和方法还没有初始化。 2. created(已创建Vue实例):在这个阶段,Vue实例的数据对象和方法已经被初始化,但尚未挂载到DOM中。 3. beforeMount(在挂载之前):在这个阶段,Vue实例已经准备好进行挂载,但尚未开始挂载。 4. mounted(已挂载):在这个阶段,Vue实例已经挂载到DOM中,并开始渲染。 5. beforeUpdate(在更新之前):在这个阶段,Vue实例的数据发生改变,但尚未更新到DOM中。 6. updated(已更新):在这个阶段,Vue实例的数据已经更新到DOM中,并重新渲染。 7. beforeUnmount(在卸载之前):在这个阶段,Vue实例即将被销毁,但尚未从DOM中卸载。 8. unmounted(已卸载):在这个阶段,Vue实例已经从DOM中卸载,并被销毁。 除了上述生命周期钩子函数之外,Vue3还引入了一些新的特性,例如: 1. setup函数:替代了Vue2中的beforeCreate和created钩子函数,用于初始化Vue实例的数据、方法和计算属性。 2. onBeforeMount、onMounted、onBeforeUpdate、onUpdated、onBeforeUnmount和onUnmounted函数:分别替代了Vue2中的beforeMount、mounted、beforeUpdate、updated和beforeDestroy钩子函数,用于在对应的生命周期阶段执行特定的逻辑。 总的来说,在Vue3中使用TypeScript可以更好地进行类型检查和代码提示,同时生命周期的使用方式和Vue2有一些变化,如引入了setup函数和新的生命周期钩子函数。通过合理使用这些生命周期函数和TypeScript的特性,可以更好地进行Vue3和TypeScript的开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方青云、

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值