Vue生命周期和钩子函数及使用keeplive缓存页面不重新加载

Vue生命周期

每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期,在这个过程中会有一些钩子函数会得到回调

  • Vue中能够被网页直接使用的最小单位就是组件,我们经常写的:
 var vm = new Vue({
        el: '#app',
        ......
}

是根组件,el指定了它的模板(id为app的元素包裹的部分),相对于template属性
也可以这样写:

 var vm = new Vue({
        ......
}
vm.$mount("#app");

根组件里面可以使用子组件:

 var vm = new Vue({
        ......
components: {
            'my-components': child
        }
}
vm.$mount("#app");

这样就可以在id为app的div中使用名字my-components来引用child组件

div id="app">
           ......
            <my-components :msg="msg1" v-if="show"></my-components>
           ......
    </div>
  • beforeCreate:在实例初始化之后,这时候el 和 data 并未初始化
  • created:实完成了 data 数据的初始化,但Vue 实例使用的根 DOM 元素el还未初始化
  • beforeMount:data和el均已经初始化,el并没有渲染进数据,el的值为“虚拟”的元素节点
  • mounted:此时el已经渲染完成并挂载到实例上

使用keeplive缓存组件视图

有时候我们显示页面的时候不需要重新加载,使用上次的缓存页面即可,比如单页面应用使用路由进行页面切换时,再切回来,很多时候并不需要重新加载

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

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <p>{{message}}</p>
        <keep-alive>
            <my-components msg="hello" v-if="show"></my-components>
        </keep-alive>
    </div>
</body>
<script>
    var child = {
        template: '<div><input></input></div>',
        props: ['msg'],
        data: function() {
            return {
                childMsg: 'child'
            };
        },
        created: function() {
            console.log('child reated!');
        },
        mounted: function() {
            console.log('child mounted!');
        },
        deactivated: function() {
            console.log('component deactivated!');
        },
        activated: function() {
            console.log('component activated');
        }
    };
    var app = new Vue({
        el: '#app',
        data: function() {
            return {
                message: 'father',
                show: true
            };
        },

        components: {
            'my-components': child
        }
    });
</script>

</html>

被keeplive包裹的组件会使用缓存,我们可以在input里输入文字
在控制台控制app.show=false,再app.show=true,可以发现前一次输入的文字还在,说明使用了缓存
deactivated、activated两个方法只在被keeplive包裹的组件中才会回调,deactivated在组件消失时调用,activated在组件显示时调用

综合示例

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
    <style>

    </style>
</head>

<body>
    <div id="app">
        <p>{{message}}</p>
        <keep-alive>
            <my-components :msg="msg1" v-if="show"></my-components>
        </keep-alive>
    </div>
</body>

<script>
    var child = {
        template: '<div>from child: {{childMsg}}</div>',
        props: ['msg'],
        data: function() {
            return {
                childMsg: 'child'
            }
        },
        beforeCreate: function() {
            debugger;
        },
        created: function() {
            debugger;
        },
        beforeMount: function() {
            debugger;
        },
        mounted: function() {
            debugger;
        },
        deactivated: function() {
            alert("keepAlive停用");
        },
        activated: function() {
            console.log('component activated');
        },
        beforeDestroy: function() {
            console.group('beforeDestroy 销毁前状态===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        destroyed: function() {
            console.group('destroyed 销毁完成状态===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
    };
    var vm = new Vue({
        el: '#app',
        data: {
            message: 'father',
            msg1: "hello",
            show: true
        },
        beforeCreate: function() {
            debugger;
        },
        created: function() {
            debugger;
        },
        beforeMount: function() {
            debugger;
        },
        mounted: function() {
            debugger;
        },
        beforeUpdate: function() {
            alert("页面视图更新前");

        },
        updated: function() {
            alert("页面视图更新后");
        },
        beforeDestroy: function() {
            console.group('beforeDestroy 销毁前状态===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        destroyed: function() {
            console.group('destroyed 销毁完成状态===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        components: {
            'my-components': child
        }
    });
</script>

</html>
  • debugger用于在chrome中加载时自动断点
  • 根组件的调用中:
    beforeCreate执行时,data和el均为undefined
    created执行时,data已经初始化,el为undefined
    beforeMount执行时,data和el均已经初始化,此时el并没有渲染进数据,此时用console.log(this.$el);打印el,p元素还是

    {{message}}

    ,{{message}}还没有替换为真实的数据
    el代表根组件的template,vue把它拿出来渲染(比如data数据渲染)后再放回去,el对象可以操作里面的各个html子节点
    mounted执行时,此时el已经渲染完成并挂载到实例上

  • 加载渲染调用顺序:
    父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->子activated(如果是缓存视图)->父mounted->父activated(如果是缓存视图)
  • 控制根组件更新
    控制台输入vm.msg1 = "123"
    数据变化之前会调用beforeUpdate,更新后调用updated,这两个方法只有在更新数据的时候才调用(包括隐藏或显示组件,不管是不是缓存视图)
  • 控制子组件更新
    vm.$children[0].childMsg = "111"
    只会调用自己的beforeUpdate和updated,跟父组件无关
  • 控制子组件隐藏显示:
    隐藏:
    父beforeUpdate->子deactivated(如果是缓存视图)->父updated
    显示:
    父beforeUpdate->子activated(如果是缓存视图)->父updated
  • 销毁流程
    vm.$destroy()
    父beforeDestroy->子deactivated(如果是缓存视图)->子beforeDestroy->子destroyed->父destroyed

原文地址:https://www.cnblogs.com/cowboybusy/p/11432465.html

时间: 2024-08-29 23:40:17

Vue生命周期和钩子函数及使用keeplive缓存页面不重新加载的相关文章

vue生命周期、钩子函数

https://segmentfault.com/a/1190000011381906    详解生命周期和钩子函数 每个vue实例再被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期. 可以看到在vue一整个的生命周期中会有很多钩子函数提供给我们在vue生命周期不同的时刻进行操作, 那么先列出所有的钩子函数,然后我们再一一详解: beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy

Vue的过滤器,生命周期的钩子函数和使用Vue-router

一.过滤器 1.局部过滤器 在当前组件内部使用过滤器 给某些数据 添油加醋 //声明 filters:{ '过滤器的名字':function(val,a,b){ //a 就是alax ,val就是当前的数据 } } //使用 管道符 数据 | 过滤器的名字('alex','wusir') <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">

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

对于vue的生命周期,官方文档上并没有太多的文字性说明,把自己对生命周期和钩子函数的理解记录下来 官方文档 自己的理解 vue生命周期的概念:vue对象从被创建,到执行逻辑,最后到被销毁的过程. 具体流程: 1)vue实例的创建 2)初始化事件和生命周期 3)初始化data和methods 4)生成虚拟dom $el(将没有解析的指令的dom加载到内存中) 5)使用$el 来替代el,并且将$el中的指令进行解析 6)进行状态mounted的循环 判断data中的数据是否发生改变,如果改变,则跟

生命周期的钩子函数

生命周期的钩子函数(写在方法的下面,一共有11个) 1.vue的整个生命周期的特定时刻,自动调用的函数 2.beforeCreate 实例创建之前调用, 数据没有挂载,不能访问数据 vue实例初始化的时候就被执行(数据加载之前执行的一个函数,拿不到data里面的数据) 3.created 实例创建之后调用,能访问.修改数据,单修改数据不会触发updated函数  在这里可以向服务器请求数据,(也可以拿到父组件的数组进行修改等操作,这一步骤是没有操作到模板,数据和模板还没有结合) 下一步就是开始找

vue2.0项目实战(3)生命周期和钩子函数详解

最近的项目都使用vue2.0来开发,不得不说,vue真的非常好用,大大减少了项目的开发周期.在踩坑的过程中,因为对vue的生命周期不是特别了解,所以有时候会在几个钩子函数里做一些事情,什么时候做,在哪个函数里做,我们不清楚. 下面来总结一下vue的生命周期. vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0都包括了哪些生命周期的函数了. 生命周期探究 对于执行顺序和什么时候执行,看上面两个图基本有个了解了.下面我们将结合代码去看看钩子函数的执行. <!DOCTYPE html>

Vue2.0 探索之路——生命周期和钩子函数的一些理解(转)

前言 在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这对后面的踩坑是相当不利的. 因为我们有时候会在几个钩子函数里做一些事情,什么时候做,在哪个函数里做,我们不清楚. 于是我开始先去搜索,发现vue2.0的生命周期没啥文章.大多是1.0的版本介绍.最后还是找到一篇不错的(会放在最后) vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0

Vue2.0 探索之路——生命周期和钩子函数的一些理解

前言 在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这对后面的踩坑是相当不利的. 因为我们有时候会在几个钩子函数里做一些事情,什么时候做,在哪个函数里做,我们不清楚. 于是我开始先去搜索,发现vue2.0的生命周期没啥文章.大多是1.0的版本介绍.最后还是找到一篇不错的(会放在最后) vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0

VUE生命周期中的钩子函数及父子组件的执行顺序

先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行一些叫做生命周期钩子的函数(回调函数),这给了用户在不同阶段添加自己代码的机会. 1.vue的生命周期图 在vue实例的整个生命周期的各个阶段,会提供不同的钩子函数以供我们进行不同的操作.先列出vue官网上对各个钩子函数的详细解析. 生命周期钩子 详细 beforeCreate 在实例初始化之后,数

VueRouter和Vue生命周期(钩子函数)

一.vue-router路由 1.介绍 vue-router是Vue的路由系统,用于定位资源的,在页面不刷新的情况下切换页面内容.类似于a标签,实际上在页面上展示出来的也是a标签,是锚点.router需要相应的js文件,可到官网下载或者使用CDN: https://unpkg.com/vue-router/dist/vue-router.js使用Vue需要引入相应的JS文件,可到官网下载或者直接使用CDN:https://cdn.jsdelivr.net/npm/[email protected