keep-alive实现原理

本文介绍了Vue的内置组件keep-alive,它能缓存不活动的组件实例,防止重复渲染DOM,减少性能消耗。阐述了其原理、参数,以及对组件生命周期的影响,如多出activated和deactivated钩子。还介绍了在动态组件、vue-router中的应用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、keep-alive介绍应用

1.什么是keep-alive

keep-alive是Vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。keep-alive是一个抽象组件,它自身不会渲染一个DOM元素,也不会出现在父组件中。

2.作用

在组件切换过程中 把切换出去的组件保留在内存中,防止重复渲染DOM,减少加载时间及性能消耗,提高用户体验性

3.原理

在 created钩子函数调用时将需要缓存的 VNode 节点保存在 this.cache 中/在 render(页面渲染) 时,如果 VNode 的 name 符合缓存条件(可以用 include 以及 exclude 控制),则会从 this.cache 中取出之前缓存的 VNode实例进行渲染。

4.参数(Props)

  • include - 字符串或正则表达式。只有名称匹配的组件会被缓存。
  • exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。
  • max - 数字。最多可以缓存多少组件实例

5.对生命周期的变化

1.activated

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

2.deactivated

  • 在 keep-alive 组件停用时调用
  • 该钩子在服务器端渲染期间不被调用
  • 被包含在 keep-alive 中创建的组件,会多出两个生命周期的钩子: activated 与 deactivated
  • 使用 keep-alive 会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在 activated 阶段获取数据,承担原来 created 钩子函数中获取数据的任务。
注意:只有组件被 keep-alive 包裹时,这两个生命周期函数才会被调用,如果作为正常组件使用,是不会被调用的,以及在 2.1.0 版本之后,使用 exclude 排除之后,就算被包裹在 keep-alive 中,这两个钩子函数依然不会被调用!另外,在服务端渲染时,此钩子函数也不会被调用。

二.keep-alive用法

  • 在动态组件中应用
<keep-alive :include="whiteList" :exclude="blackList" :max="amount">
     <component :is="currentComponent"></component>
</keep-alive>
  • 在vue-router中应用
<keep-alive :include="whiteList" :exclude="blackList" :max="amount">
    <router-view></router-view>
</keep-alive>
  • 结合router,缓存部分页面
1、在App.vue中设置:(根据是否需要缓存切换模式)
<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

2、在router.js路由页设置:
new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home,
      redirect: 'goods',
      children: [
        {
          path: 'goods',
          name: 'goods',
          component: Goods,
          meta: {
        	keepAlive: false // 不需要缓存
      	  }
        },
        {
          path: 'seller',
          name: 'seller',
          component: Seller,
          meta: {
        	keepAlive: true  // 需要缓存
      	  }
        }
      ]
    }
  ]
})
  • 使用新增属性include/exclude,缓存部分页面
vue2.1.0 新增了include,exclude俩个属性,允许组件有条件的缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。
    <!-- 逗号分隔字符串 -->
    <keep-alive include="a,b">
        <component :is="view"></component>
    </keep-alive>
 
    <!-- 正则表达式 (需要 `v-bind`绑定) -->
<keep-alive :include="/a|b/">
    <component :is="view"></component>
</keep-alive>
 
    <!-- 数组 (需要 `v-bind`绑定) -->
<keep-alive :include="['a', 'b']">
    <component :is="view"></component>
</keep-alive>

注:匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值)。匿名组件不能被匹配。
### HTTP Keep-Alive 的工作机制及实现原理 HTTP Keep-Alive 是一种用于提高网络通信效率的技术,它允许在一个 TCP 连接上复用多个 HTTP 请求和响应,从而减少频繁建立和关闭连接带来的开销。以下是其工作机制及实现原理: #### 1. **基本概念** HTTP 协议默认情况下采用的是短连接模式,即每次请求都需要经历三次握手建立连接以及四次挥手断开连接的过程。这种模式在高频率的小数据量交互场景下会产生较大的性能损耗。而 HTTP Keep-Alive 则通过保持连接的状态,允许多个请求共享同一个 TCP 连接。 这一特性显著减少了因重复创建和销毁连接而导致的时间延迟和资源消耗[^1]。 #### 2. **协议支持** 为了启用 HTTP Keep-Alive 功能,客户端和服务端需要显式声明对该特性的支持。具体来说: - 在 HTTP/1.0 中,需手动设置 `Connection: keep-alive` 头部字段; - 而在 HTTP/1.1 中,默认启用了持久化连接功能(除非明确指定 `Connection: close`),因此无需额外配置即可享受 Keep-Alive 带来的优势。 #### 3. **超时管理** 尽管 HTTP Keep-Alive 提倡长时间维持连接状态,但由于服务器资源有限,不可能无限期地保留未使用的连接。为此,服务端通常会对空闲时间超过一定阈值的连接执行自动关闭操作。这个超时期限由具体的 Web 服务器决定,并可通过相应的参数调整。 #### 4. **技术细节** 当浏览器发起一系列连续的 HTTP 请求时,如果前一次请求已经建立了有效的 TCP 链路,则后续请求可以直接利用这条链路上发送数据包,而不必再次经过完整的 TCP 握手流程。这不仅加快了整体传输速度,还降低了带宽占用率。 ```python import requests headers = {'Connection': 'keep-alive'} response = requests.get('https://example.com', headers=headers) print(response.headers['Connection']) # 输出可能为'keep-alive' ``` 上述代码片段展示了如何向目标站点发出带有 `Connection: keep-alive` 标记的 GET 请求。注意实际效果取决于远程主机是否接受此类指令。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值