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

article/2025/11/7 12:31:47

Vue生命周期

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

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

是根组件,el指定了它挂载到哪里(id为app的元素包裹的部分)
也可以跟普通组件一样这样写:

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

也可以跟普通组件一样在里面定义template属性指定模板,比如

new Vue({el: '#app',router,components: { App },template: '<App/>',methods:{}})

根组件里面可使用子组件,并起一个名字:

 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/vue@2.5.16/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}},还没有替换为真实的数据
    el指定组件挂载的地方,如果组件没有定义template,vue就会把el对应元素包裹的块拿出来渲染(比如data数据渲染)后再放回去,el对象可以操作里面的各个html子节点,如果指定了template,就会渲染template再挂载到el里面
    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


http://chatgpt.dhexx.cn/article/AXLisSmm.shtml

相关文章

LVS(三)lvs+keeplive

一 场景引入1 我们知道LVS仅仅是做根据调度算法和策略来做负载均衡的&#xff0c;LVS本身只是调度后端服务器&#xff0c;并不管后端服务器的死活&#xff0c;想想这样一个场景&#xff1a;如果由于由于某种原因&#xff0c;后端服务器挂掉&#xff0c;而调度服务器却不知道&am…

lvs+keeplive

Keepalived概述 调度出现单点故障&#xff0c;如何解决&#xff1f;Keepalived实现了高可用集群Keeepalived最初是为LVS设计的&#xff0c;专门监控各服务器节点状态Keepalived后来加入了VRRP功能&#xff0c;防止单点故障 Keepalived运行原理 Keepalived检测每个服务器节点…

使用keeplive处理socket网络异常断开

网络异常断开原因主要有那些呢&#xff1f;归纳起来主要有以下两种&#xff1a; 1、客户端程序异常。 对于这种情况&#xff0c;我们很好处理&#xff0c;因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常&#xff08;就是WinSock2中的10054异常&#xff09;。…

mysql mm keeplive_mysql +keeplive

下载tar包 ./configure --prefix/usr/local/keepalived --with-kernel-dir/usr/src/kernels/2.6.32-431.el6.x86_64/ \ 注意加内核 &&make && make install cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived…

解决keep-live使用之后的问题

keep-aliv能够帮助我们实现页面ajax请求只被请求一次&#xff0c;在你跳转页面的时候&#xff0c;也不会被请求多次&#xff0c;可是比如在旅游页面中&#xff0c;当我们在城市选择页面重新选择城市&#xff0c;这个时候就需要重新发送一个ajax请求&#xff0c;来显示对应城市的…

nginx和keeplive实现负载均衡高可用

一、 Keeplive服务介绍 Keeplive期初是专门为LVS设计的&#xff0c;专门用来监控LVS集群系统中各个服务节点的状态&#xff0c;后来又加入VRRP的功能&#xff0c;因此除了配合LVS服务以外&#xff0c;也可以作为其他服务&#xff08;nginx&#xff0c;haroxy&#xff09;的高可…

php用Ajax传递数组

代码如下: 定义array数组 var array [1,2,3];$.ajax({url:"cart.php?actdelcart",async:false,type:POST,data:{array:array},dataType:json,traditional: true,success:function(data){alert(data)},error:function(){alert("#");}}); 当我们用ajax传递…

【JQuery】Ajax 参数为数组 的方法

背景介绍 前端页面为HTML&#xff0c; 后端为Spring html中根据多选框的值&#xff0c;使用ajax请求接口动态加载其他元素的选项值。 代码 // select 下拉多选框的值var idCardType $("#idCardType").val();// [2075, 2077, 2078]$.ajax({url : url,type : "…

使用ajax传递数组和后台接收

使用ajax异步的提交多选框得到需要操作的对象的id&#xff0c;这时我们可以把每一个id做出一个对象&#xff0c;之后放到一个数组中&#xff0c;再使用JSON.stringify()对这个数组进行json的格式化&#xff1b;在后台中再inputStream中解析出我们的json字符串&#xff0c;之后只…

ajax传数组,后端接收数组

ajax内容 使用JSON.stringify(&#xff09;将数组转换为JSON字符串 //发送ajax将数组发送给handler$.ajax({url:"admin/batch/remove.json", //服务器接收请求的URL地址type:"post", //设置请求方式postcontentType:"application/json;charsetUTF-8&…

教你怎么用ajax传数组(也可以是转为json)

我之前写过一个关于ajax的详解&#xff0c;那个是标准的ajax&#xff0c;今天介绍的是怎么用ajax传递数组这样的数据类型呢&#xff1f;很多的时候我们需要给后端的数据不是几个单独的数据&#xff0c;一般见到的代码的是这样的&#xff1a; data: { id : id, name : name, se…

Ajax传递数组到后台的两种方式

直接传输不可行 第一种 将ajax参数传递修改为tradition: traditional: true $.ajax({xhrFields: {withCredentials: true},async: true,url: basePath "/consumer/work",type: "post",dataType: "json",traditional: true,data : {sql :text,/…

前端ajax发送数组请求的两种方式

今天踩了一个大坑 就是使用ajax将数组发送到后台 后台的controller接收不到 好的 废话不多说 直接上干货 第一种方式&#xff1a; 直接传送数组 后台接收的话需要使用 RequestParam(value "userIds") Long[ ] 来接收 第二种方式&#xff1a; 将数组转换为List …

jquery ajax 向后台传递数组参数

Ajax 传递数组到后台 博客分类&#xff1a; JavaScript jquery ajax 向后台传递数组参数示例 Js代码 function login123(){ var nameArr new Array(); nameArr.push("adm,in"); nameArr.push("jo,in"); nameArr.p…

JFINAL+Ajax传参 array 数组方法 获取request中数组

前台代码js var _list [];for (var i 0; i < array.length; i) { _list[i] array[i]; } $.ajax({ type: "post",url: "",data: {"ids": _list },dataType: "json",success: function(data){alert("添加成功"); …

ajax向后端传递数组

https://blog.csdn.net/feinifi/article/details/81180673 https://blog.csdn.net/weixin_44150474/article/details/103526735 https://www.cnblogs.com/lijianda/p/9936775.html https://blog.csdn.net/weixin_44150474/article/details/103526735 ajax在web项目开发中经常…

ajax通过post方法传数组

ajax在web项目开发中经常会用到&#xff0c;平时我们传递数据&#xff0c;基本都是一个参数名对应一个参数值&#xff0c;后端通过参数名就可以得到参数&#xff0c;从而进行相关逻辑处理&#xff0c;但是有时候我们会遇到批量操作&#xff0c;比如批量删除一个列表&#xff0c…

ajax 传数组

使用 ajax 传数组&#xff0c;可以有很多种方式实现&#xff0c;如将数组序列化成 json字符串&#xff0c;或者将数组转换成字符串&#xff0c;都能实现。这里介绍一种方式&#xff0c;添加属性 traditional: true&#xff0c;直接传 代码如下 controller package com.approv…

Ajax传递数组

Ajax传递数组与后端接收 在此记录刚开始做开发的时候&#xff0c;Ajax都不怎么会用&#xff0c;都只是传一些简单的字符串&#xff0c;那Ajax怎么将数组传到服务器&#xff0c;先看一下Ajax的结构 //建立两种类型的数组,这两种类型的数组都是经常用到的var arryA new Array(…

ajax传递数组怎么传?ajax数组传递

在我们平时的开发中&#xff0c;经常会需要用到ajax&#xff0c;关于ajax是什么&#xff0c;又该如何传递参数&#xff0c;相信通过上几篇文章你们已经有所了解。但是&#xff0c;ajax中要如何传递数组你们又知道吗&#xff1f;今天我们就来聊一聊ajax中该如何传递数组。 ajax…