程序员的知识教程库

网站首页 > 教程分享 正文

VUE教程-(六)生命周期(vue生命周期详解简书)

henian88 2024-09-10 14:11:41 教程分享 24 ℃ 0 评论

6.1 引出生命周期

生命周期函数,特殊的时间点调用特殊的函数

某个时间点调用某个函数,这些函数统称为生命周期函数

//vue完成模板的解析并把真实的DOM元素放入页面后(挂载完毕)调用mounted
            //第一次叫挂载,以后就叫更新了
            // 关键时刻调关键函数
            mounted() {
                // console.log('mounted')
                setInterval(() => {
                    this.opacity -= 0.01
                    if (this.opacity <= 0) this.opacity = 1
                }, 16)
            },

6.2 分析生命周期

Vue 实例有?个完整的生命周期,也就是从new Vue()、初始化事件(.once事件)和生命周期、编译模版、挂载Dom -> 渲染、更新 -> 渲染、卸载 等?系列过程,称这是Vue的生命周期。

--挂载流程

  1. beforeCreate(创建前):数据监测(getter和setter)和初始化事件还未开始,此时 data 的响应式追踪、event/watcher 都还没有被设置,也就是说不能访问到data、computed、watch、methods上的方法和数据。
  2. created(创建后):实例创建完成,实例上配置的 options 包括 data、computed、watch、methods 等都配置完成,但是此时渲染得节点还未挂载到 DOM,所以不能访问到 $el属性。
  3. beforeMount(挂载前):在挂载开始之前被调用,相关的render函数首次被调用。此阶段Vue开始解析模板,生成虚拟DOM存在内存中,还没有把虚拟DOM转换成真实DOM,插入页面中。所以网页不能显示解析好的内容。
  4. mounted(挂载后):在el被新创建的 vm.$el(就是真实DOM的拷贝)替换,并挂载到实例上去之后调用(将内存中的虚拟DOM转为真实DOM,真实DOM插入页面)。此时页面中呈现的是经过Vue编译的DOM,这时在这个钩子函数中对DOM的操作可以有效,但要尽量避免。一般在这个阶段进行:开启定时器,发送网络请求,订阅消息,绑定自定义事件等等

--更新流程

  1. beforeUpdate(更新前):响应式数据更新时调用,此时虽然响应式数据更新了,但是对应的真实 DOM 还没有被渲染(数据是新的,但页面是旧的,页面和数据没保持同步呢)。
  2. updated(更新后) :在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。此时 DOM 已经根据响应式数据的变化更新了。调用时,组件 DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。

--销毁流程

  1. beforeDestroy(销毁前):实例销毁之前调用。这一步,实例仍然完全可用,this 仍能获取到实例。在这个阶段一般进行关闭定时器,取消订阅消息,解绑自定义事件。
  2. destroyed(销毁后):实例销毁后调用,调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务端渲染期间不被调用。

6.3 总结生命周期

创建-挂载-更新-销毁

<div id="root">
        <h2 :style="{opacity}">欢迎学习vue</h2>
        <button @click="opacity='1'">点我透明度变1</button>
        <button @click="stop">点我停止变换</button>
</div>
<script>
        // 创建 vm 实例对象
        const vm = new Vue({
            el: '#root',
            data: {
                opacity: 1
            },
            methods: {
                stop() {
                    // clearInterval(this.timer)
                    this.$destroy()   //直接销毁vm   另一个按钮就点不动了
                }
            },
            mounted() {
                console.log('mounted', this)
                this.timer = setInterval(() => {
                    this.opacity -= 0.01
                    if (this.opacity <= 0) this.opacity = 1
                }, 16)
            },
            beforeDestroy() {
                console.log('vm即将被销毁')
                clearInterval(this.timer)
            }
        });
 </script>

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表