Vue / keep-alive

本文深入探讨了Vue.js中keep-alive组件的使用方法,包括如何通过配置scrollBehavior实现页面滚动位置的控制,以及利用include、exclude和meta属性精确控制组件缓存,确保应用性能的同时满足产品需求。

点击上方蓝字关注「悲伤日记      

半生花开,半世花落。

keep-alive

keep-alive是Vue提供的一个抽象组件,用来对组件进行缓存,从而节省性能,由于是一个抽象组件,所以在v页面渲染完毕后不会被渲染成一个DOM元素

<keep-alive>
    <loading></loading>
</keep-laive>

当组件在keep-alive内被切换时组件的activated、deactivated这两个生命周期钩子函数会被执行

被包裹在keep-alive中的组件的状态将会被保留,例如我们将某个列表类组件内容滑动到第100条位置,那么我们在切换到一个组件后再次切换回到该组件,该组件的位置状态依旧会保持在第100条列表处

关于这一点也是仁者见仁,有的产品可能会要求在每一次进入一个组件时页面的初始位置都是保持在顶部的,这里可以利用Vue中的滚动行为,但是前提是你是

HTML5 history模式

我们在创建一个router实例的时候,可以提供一个scrollBehavior方法,该方法会在用户切换路由时触发

const router=new VueRouter({
        routes:[
            {
                path:"/",
                component:Home
            }
        ],
        scrollBehavior(to,form,savedPosition){
        //scrollBehavior方法接收to,form路由对象
        //第三个参数savedPosition当且仅当在浏览器前进后退按钮触发时才可用
        //该方法会返回滚动位置的对象信息,如果返回false,或者是一个空的对象,那么不会发生滚动
        //我们可以在该方法中设置返回值来指定页面的滚动位置,例如:
         return {x:0,y:0}
        //表示在用户切换路由时让是所有页面都返回到顶部位置
        //如果返回savedPosition,那么在点击后退按钮时就会表现的像原生浏览器一样,返回的页面会滚动过到之前按钮点击跳转的位置,大概写法如下:
         if(savedPosition){
            return savedPosition
         }else{
           return {x:0,y:0}
         }
         //如果想要模拟滚动到锚点的行为:
         if(to.hash){
           return {
             selector:to.hash
           }
         }
     }
})

还有一个方法就是利用我们上面说过的,在keep-alive激活会触发activated钩子函数,那么在该函数内设置scrollTop为0

被keep-alive包裹的动态组件或router-view会缓存不活动的实例,再次被调用这些被缓存的实例会被再次复用,对于我们的某些不是需要实时更新的页面来说大大减少了性能上的消耗,不需要再次发送HTTP请求,但是同样也存在一个问题就是被keep-alive包裹的组件我们请求获取的数据不会再重新渲染页面,这也就出现了例如我们使用动态路由做匹配的话页面只会保持第一次请求数据的渲染结果,所以需要我们在特定的情况下强制刷新某些组件

    1. 利用include、exclude属性

<keep-alive include="bookLists,bookLists">
      <router-view></router-view>
</keep-alive>
<keep-alive exclude="indexLists">
      <router-view></router-view>
</keep-alive>

include属性表示只有name属性为bookLists,bookLists的组件会被缓存,(注意是组件的名字,不是路由的名字)其它组件不会被缓存exclude属性表示除了name属性为indexLists的组件不会被缓存,其它组件都会被缓存

    2. 利用meta属性

export default[
 {
  path:'/',
  name:'home',
  components:Home,
  meta:{
    keepAlive:true //需要被缓存的组件
 },
 {
  path:'/book',
  name:'book',
  components:Book,
  meta:{
     keepAlive:false //不需要被缓存的组件
 } 
]
<keep-alive>
  <router-view v-if="this.$route.meat.keepAlive"></router-view>
  <!--这里是会被缓存的组件-->
</keep-alive>
<keep-alive v-if="!this.$router.meta.keepAlive"></keep-alive>
<!--这里是不会被缓存的组件-->

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
<think>嗯,用户想了解Vue.js中keep-alive的使用方法和常见场景。首先,我需要回忆一下keep-alive的基本概念。记得keep-aliveVue的内置组件,用来缓存不活跃的组件实例,避免重复渲染。用户可能已经知道这,但需要更详细的信息。 接下来,我得整理使用方法。根据引用[2],基本用法是用<keep-alive>包裹动态组件,比如用is属性切换的组件。这时候应该提到include和exclude属性,这两个是用来指定哪些组件需要缓存或排除的。可能还需要提到max属性,限制缓存实例的数量,避免内存问题。 然后是生命周期钩子的变化。被缓存的组件会触发activated和deactivated,而不是created和destroyed。这很重要,用户可能需要调整他们的代码来处理这些钩子,比如重新获取数据。 常见应用场景方面,用户提到的标签页、列表-详情页切换都是典型例子。比如在后台管理系统里,多个标签页切换时保持状态,或者在移动端列表击进入详情后返回时保留滚动位置。这些例子能帮助用户更好地理解何时使用keep-alive。 还需要注意Vue 2和Vue 3的区别。比如Vue 3中keep-alive的插槽写法变化,使用v-slot:default,而Vue 2不需要。另外,组合式API中可能需要用onActivated和onDeactivated来替代原来的生命周期钩子。这些差异对于用户升级或跨版本开发很重要。 常见问题方面,用户可能会遇到缓存导致的数据不更新问题,这时候可以用动态key或者手动更新。另外,多个层级组件嵌套时的缓存配置,可能需要配置name属性或者匹配规则。这些都是实际开发中容易遇到的坑,需要给出解决方案。 最后,要确保回答结构清晰,分说明,并且结合引用中的信息。比如引用[1]提到Vue 2和Vue 3的实现差异,所以需要详细对比。引用[2]中的代码示例可以用来展示基本用法。同时,生成的三个相关问题要覆盖原理、对比和问题排查,帮助用户进一步学习。</think>### Vue.js keep-alive 使用方法及常见场景解析 #### 一、核心功能与基本用法 `<keep-alive>` 是 Vue.js 内置组件,用于**缓存非活跃组件实例**,避免重复销毁和创建。基本语法为: ```html <keep-alive> <component :is="currentComponent"></component> </keep-alive> ``` 通过 `include`/`exclude` 属性控制缓存范围: ```html <keep-alive :include="['Home','About']" :max="5"> <router-view/> </keep-alive> ``` * `max` 属性限制最大缓存实例数(LRU 淘汰机制)[^2] #### 二、生命周期变化 被缓存组件会触发特殊生命周期: ```javascript // 组件首次加载 created() => mounted() => activated() // 再次进入缓存组件 activated() // 替代 created/mounted deactivated() // 替代 destroyed ``` #### 三、典型应用场景 1. **多标签页系统** 后台管理系统切换不同功能模块时保留表单状态 2. **列表-详情页跳转** 电商商品列表页缓存滚动位置和筛选条件 3. **复杂表单分步填写** 保持各步骤表单数据不丢失 4. **数据看板切换** 保留图表渲染结果避免重复请求数据 #### 四、Vue 2 vs Vue 3 差异对比 | 特性 | Vue 2 | Vue 3 | |--------------|----------------------------|----------------------------| | 插槽语法 | 直接包裹组件 | 需使用 v-slot:default | | 组合式API | 无特殊处理 | 需使用 onActivated 钩子 | | 组件定义方式 | 通过 name 匹配 | 支持组件实例类型匹配 | ```html <!-- Vue 3 写法 --> <router-view v-slot="{ Component }"> <keep-alive> <component :is="Component"/> </keep-alive> </router-view> ``` #### 五、常见问题解决方案 1. **缓存失效问题** ```html <keep-alive :key="$route.fullPath"> // 添加动态 key ``` 2. **数据更新策略** ```javascript activated() { this.loadData() // 激活时刷新数据 } ``` 3. **内存泄漏预防** 避免缓存大量图片/视频组件,合理设置 `max` 属性 §§ 1. Vue 3 中如何通过组合式API处理keep-alive生命周期? 2. keep-aliveVue Router中的最佳实践是什么? 3. 如何排查keep-alive导致的组件状态异常问题? [^1]: Vue 2 与 Vue 3 中 keep-alive 组件的深入解析 : 【前端 - Vue】之 Keep-Alive缓存组件使用语法及原理解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值