生命周期钩子

  所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算。这意味着你不能使用箭头函数来定义一个生命周期方法 (例如 created: () => this.fetchTodos())。这是因为箭头函数绑定了父上下文,因此 this 与你期待的 Vue 实例不同,this.fetchTodos 的行为未定义。

一、创建示例试验钩子函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app">
        <App></App>
    </div>
    <script type="text/javascript" src="./vue.js"></script>
    <script type="text/javascript">

        var Test = {    // 在Test组件中试验钩子函数
            data(){
                return {
                    msg:"啊哈哈"
                }
            },
            template:`
                <div>
                    <div>{{msg}}</div>
                    <button @click="changeHandler">修改</button>
                </div>
            `,
            methods:{
                changeHandler(){
                    this.msg = this.msg + ‘alex‘;
                }
            },
            beforeCreate(){   // 在当前组件创建之前调用
                console.log(this.msg);   // 输出undefined,说明当前数据为空
            },
            created(){        // 在当前组件创建之后调用
                // 使用该组件就会触发以上的钩子函数,created中可以操作数据、发送ajax,
                // 并且可以实现vue对页面的影响,应用主要是:发送Ajax请求
                console.log(this.msg);  // 控制台输出"啊哈哈"
                // this.msg="嘿嘿嘿";
            },
            beforeMount(){   // 装载数据到DOM之前会调用
                console.log(document.getElementById(‘app‘));
            },
            mounted(){   // 装载数据到DOM之后会调用
                // 这个地方可以操作DOM
                // 可以获取到真实存在的DOM元素,vue操作以后的DOM
                console.log(document.getElementById(‘app‘));
            },
            beforeUpdate(){  // 更新之前,调用此钩子,应用:获取原始的DOM
                console.log(document.getElementById(‘app‘).innerHTML);   // 获取所有元素
            },
            updated(){        // 更新之后,调用此钩子,应用:获取最新的DOM
                console.log(document.getElementById(‘app‘).innerHTML);   // 获取所有元素
            },
            beforeDestroy(){
                console.log(‘beforeDestroy‘);
            },
            destroyed(){
                console.log(‘destroyed‘);
            },
            activated(){
                console.log(‘组件被激活了‘);
            },
            deactivated(){
                console.log(‘组件被停用了‘);
            }
        };

        var App = {
            data(){
                return {
                    isShow:true
                }
            },
            template:`
                <div>
                    <keep-alive>
                        <Test v-if="isShow"></Test>
                    </keep-alive>
                    <button @click="changeHandler">改变组件的生死</button>
                </div>
            `,
            methods:{
                changeHandler(){
                    this.isShow = !this.isShow;
                }
            },
            components:{  // 挂载Test组件
                Test
            }
        };

        // 创建 销毁
        new Vue({
            el:‘#app‘,
            template:``,
            components:{
                App
            }
        });
    </script>
</body>
</html>

二、各个钩子函数介绍

1、beforeCreate与created

  beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

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

template:`
    <div>
        {{msg}}
    </div>
`,
beforeCreate(){   // 在当前组件创建之前调用
    console.log(this.msg);   // 输出undefined,说明当前数据为空
},
created(){        // 在当前组件创建之后调用
    // 使用该组件就会触发以上的钩子函数,created中可以操作数据、发送ajax,
    // 并且可以实现vue对页面的影响,应用主要是:发送Ajax请求
    console.log(this.msg);  // 控制台输出"啊哈哈"
    this.msg="嘿嘿嘿";
},

  显示效果如下所示:

  

2、beforeMount与mounted

  beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。该钩子在服务器端渲染期间不被调用。

  mounted:el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。该钩子在服务器端渲染期间不被调用。

template:`
    <div>
        {{msg}}
    </div>
`,

beforeMount(){   // 装载数据到DOM之前会调用
    console.log(document.getElementById(‘app‘));
},
mounted(){   // 装载数据到DOM之后会调用
    // 这个地方可以操作DOM
    // 可以获取到真实存在的DOM元素,vue操作以后的DOM
    console.log(document.getElementById(‘app‘));
},

  显示效果如下:

  

3、beforeUpdate与updated

  beforeUpdate:数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行

  updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。该钩子在服务器端渲染期间不被调用

var Test = {    // 在Test组件中试验钩子函数
    data(){
        return {
            msg:"啊哈哈"
        }
    },
    template:`
        <div>
            <div>{{msg}}</div>
            <button @click="changeHandler">修改</button>

        </div>
    `,
    methods:{
        changeHandler(){
            this.msg = this.msg + ‘alex‘;
        }
    },

    beforeUpdate(){  // 更新之前,调用此钩子,应用:获取原始的DOM
        console.log(document.getElementById(‘app‘).innerHTML);   // 获取所有元素
    },
    updated(){       // 更新之后,调用此钩子,应用:获取最新的DOM
        console.log(document.getElementById(‘app‘).innerHTML);   // 获取所有元素
    },

};

  点击按钮后显示效果如下所示:

  

  第一个是获取了更新之前原始div下面所有dom对象。

  第二个是更新之后新div下面所有的dom对象。

4、beforeDestroy与destroyed

  beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。该钩子在服务器端渲染期间不被调用

  destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用

var Test = {    // 在Test组件中试验钩子函数
    data(){
        return {
            msg:"啊哈哈"
        }
    },
    template:`
        <div>
            <div>{{msg}}</div>
            <button @click="changeHandler">修改</button>
        </div>
    `,
    methods:{
        changeHandler(){
            this.msg = this.msg + ‘alex‘;
        }
    },
    beforeDestroy(){
        console.log(‘beforeDestroy‘);
    },
    destroyed(){
        console.log(‘destroyed‘);
    },
};

var App = {
    data(){
        return {
            isShow:true
        }
    },
    template:`
        <div>
            <Test v-if="isShow"></Test>
            <button @click="changeHandler">改变组件的生死</button>
        </div>
    `,
    methods:{
        changeHandler(){
            this.isShow = !this.isShow;
        }
    },
    components:{  // 挂载Test组件
        Test
    }
};

  显示效果如下所示:

  

  点击按钮后显示如下:

  

  组件的销毁和创建是对网页中的DOM是有性能消耗的,一般还是使用下面的激活/停用。

5、activated与deactivated

  activated:keep-alive 组件激活时调用。该钩子在服务器端渲染期间不被调用。

  deactivated:keep-alive 组件停用时调用。该钩子在服务器端渲染期间不被调用。

var Test = {    // 在Test组件中试验钩子函数
    data(){
        return {
            msg:"啊哈哈"
        }
    },
    template:`
        <div>
            <div>{{msg}}</div>
            <button @click="changeHandler">修改</button>
        </div>
    `,
    methods:{
        changeHandler(){
            this.msg = this.msg + ‘alex‘;
        }
    },
    activated(){
        console.log(‘组件被激活了‘);
    },
    deactivated(){
        console.log(‘组件被停用了‘);
    }
};

var App = {
    data(){
        return {
            isShow:true
        }
    },
    template:`
        <div>
            <keep-alive>
                <Test v-if="isShow"></Test>
            </keep-alive>
            <button @click="changeHandler">改变组件的生死</button>
        </div>
    `,
    methods:{
        changeHandler(){
            this.isShow = !this.isShow;
        }
    },
    components:{  // 挂载Test组件
        Test
    }
};

  keep-alive让当前组件产生缓存。组件的停用和激活只是和缓存有关,与生命周期没有关系。

  点击按钮显示效果如下:

  

  再次点击组件被停用,但dom并不发生修改:

  

6、errorCaptured

  当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false以阻止该错误继续向上传播。

  参见:https://cn.vuejs.org/v2/api/#选项-生命周期钩子

三、生命周期图示

  

  组件的停用和激活只是和缓存有关,与生命周期没有关系。

原文地址:https://www.cnblogs.com/xiugeng/p/9777399.html

时间: 2024-10-08 06:35:50

生命周期钩子的相关文章

Vue 实例中的生命周期钩子

Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑. Vue 实例 在文档中经常会使用 vm 这个变量名表示 Vue 实例,在实例化 Vue 时,需要传入一个选项对象,它可以包含数据(data).模板(template).挂载元素(el).方法(methods).生命周期钩子(lifecyclehook)等选项. Vue 实例化的选项 需要注意的

对vue生命周期/钩子函数的理解

对于实现页面逻辑交互等效果,我们必须知晓vue的生命周期,才能愉快的玩耍,知道我们写的东西应该挂载到哪里,vue官方给出的api讲解的那叫一个简单啊,如下: 所有的生命周期钩子自动绑定this上下文到实例中,因此你可以访问数据,对属性和方法进行运算.这意味着你不能使用箭头函数来定义一个生命周期方法(例如created: () => this.fetchTodos()).这是因为箭头函数绑定了父上下文,因此this与你期待的 Vue 实例不同,this.fetchTodos的行为未定义. 下面附加

Angular2 -- 生命周期钩子

组件生命周期钩子 指令和组件的实例有一个生命周期:新建.更新和销毁.每个接口都有唯一的一个钩子方法,它们的名字是由接口名加上 ng前缀构成的.比如,OnInit接口的钩子方法叫做ngOnInit.指令和组件ngOnInit:当Angular初始化完成数据绑定的输入属性后,用来初始化指令或者组件.ngOnChanges:当Angular设置了一个被绑定的输入属性后触发.该回调方法会收到一个包含当前值和原值的changes对象.ngDoCheck:用来检测所有变化(无论是Angular本身能检测还是

自学ng -生命周期钩子

生命周期钩子 ngOnChange() -- 重新设置数据绑定输入的属性时相应 先于ngOnInit() ngOnInit() -- 第一次显示数据绑定和指令输入属性后,初始化指令,在ngOnChange后 ngOnDestroy() -- 当Angular每次销毁指令/组件之前调用并清扫  Angular会找到并调用像ngOnInit()这样的钩子方法,有没有接口无所谓,文档建议写接口 To Be Continued ......

Angular25 组件的生命周期钩子

1 生命周期钩子概述 组件共有9个生命周期钩子 1.1 生命周期的执行顺序 技巧01:测试时父组件传递对子组件的输入属性进行初始化操作 import { Component, Input, SimpleChanges, OnInit, OnChanges, DoCheck, AfterContentChecked, AfterViewInit, AfterContentInit, AfterViewChecked, OnDestroy } from '@angular/core'; let lo

React生命周期钩子

最近的工作都很忙,所以很少完整的时间可以用来总结和回顾知识点,今天就趁着是周末,我准备在这里复习和回顾一下React的基础.工作中主要用的vue比较多,在工作中使用React也已经是一年前了,当时用的蚂蚁金服的antd框架,相比vue,我个人还是比较喜欢写React的,其实vue跟React之间除了写法上的差异,也非常相似的,学会了其中一个,要学另一个的话都是很容易的. 用过React的同学都知道,React的特性之一就是组件化,组件都有一个生命周期,这个生命周期包括组件的实例化.更新与销毁阶段

Vue生命周期/钩子函数的理解

对于实现页面逻辑交互等效果,我们必须弄懂vue的生命周期,知道我们写的东西应该挂载到哪里.vue官方api给了简单的逻辑,如下: 所有的生命周期钩子自动绑定this上,因此你可以访问数据,属性和方法进行运算,所以要特别注意的是不能使用箭头函数来定义一个生命周期方法(例如created: () => this.fetchTodos()). 下面附加一张生命周期图示 <!DOCTYPE html> <html> <head> <title></tit

vue学习三:生命周期钩子

生命周期钩子介绍: 每个 Vue 实例在被创建时都要经过一系列的初始化过程--例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等.同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会. 这个生命周期钩子函数可以在官网上看到,只要记住最重要的mounted就可以了,是html进行发送请求后台进行数据交互的钩子函数: 这个生命周期函数的图片是可以在官网上看到的,所以可以进行官网进行理解: 比如 created 钩子可以用来在

vue 生命周期钩子

每个vue实例被创建时都会经历一系列初始化的过程,像是一个生命从无到有的过程,所以叫生命周期,而这个过程都有对应的不同阶段,也就对应了生命周期不同的钩子函数,这些生命周期函数,作为vue实例的属性使用,只有到了这一过程的时候,对应的函数才会被调用,总结下来有如下方法: beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用: created:在实例创建完成后被立即调用.在这一步,实例已完成以下的配置:数据观测 (d