路由缓存 keep-alive

本文介绍了Vue中路由缓存keep-alive的使用,强调了include生效的条件——需指向组件的name而非路由name,并且keep-alive必须放在组件的最内层。同时,建议路由name与组件name保持一致以便管理。针对特定需求,如A列表页缓存及B编辑页返回后刷新数据,提出了通过设置meta属性和在activated钩子中更新数据的解决方案。

  备注1 :keep-alive include 生效条件

        1、include 里面的 name 指的是单文件组件中的name,例如 ClientList.vue 中的name, 不是指路由中的name

        2、keep-alive 必须要放在最后一级,include才会生效,例如,A 页面嵌套 Asub 页面,则keep-alive要放在Asub页面,而不是放在A页面中


    备注2 :路由中的 name 需统一与单文件组件中的 name 一致, 这样的目的是为了后期好管理,它们两个name没有什么必然的联系

    需求:A 列表页缓存, 点击编辑进入B编辑页,B页面编辑完后返回A页面,A页面要刷新表格数据

    1、路由处理:增加meta ,keepAlive是否要缓存的标志

        {
          path: 'list',
          name: 'AList',
          component: () => import('../views/AList'),
          meta: { keepAlive:true },
        },
        {
          path: 'edit',
          name: 'BEdit',
          component: () => import('../views/BEdit'),
          meta: { keepAlive: false },
        },

    2、最后一级总页面 , 例如 layout.vue

   <template>
        <div>
            <keep-alive>
                  <!-- 需要缓存的视图组件 -->
                  <router-view v-if="$route.meta.keepAlive"/> 
                </keep-alive>
                <!-- 不需要缓存的视图组件 -->
                <router-view v-if="!$route.meta.keepAlive" />
        </div>
    </template>


    3、在A列表页面,activated 中重新调表格接口进行刷新表格数据

    activated () { // 使用了keep-alive,当页面激活的时候就会触发的函数
        let reqData = { // 接口参数
            page: this.currPage, 
            pageSize: this.currPageSize,
            ...this.curSearch
        }
        this.getColorList(reqData) // 获取表格数据
      },

 

在前端开发中,`keep-alive` 是 Vue.js 提供的一个内置抽象组件,用于缓存动态组件的状态和实例,避免在频繁切换时重复销毁和创建组件。这种机制不仅提升了性能,还保留了组件的当前状态,使得用户交互体验更加流畅。 ### 实现方式 1. **基本语法** 将需要缓存的组件包裹在 `<keep-alive>` 标签内即可实现缓存功能。通常与 `<component :is="...">` 配合使用,适用于动态组件切换场景: ```html <div style="border: 1px solid red;"> <keep-alive> <component :is="comName"></component> </keep-alive> </div> ``` 2. **生命周期钩子函数** 当组件被缓存时,会触发 `deactivated` 钩子;当组件被激活时,会触发 `activated` 钩子。可以在这两个生命周期中执行一些特定逻辑,例如数据更新或事件监听: ```javascript export default { activated() { console.log('组件被激活'); }, deactivated() { console.log('组件被缓存'); } }; ``` 3. **按名称缓存组件** 如果只需要缓存部分组件,可以通过 `include` 和 `exclude` 属性指定组件名进行过滤: ```html <keep-alive> <component :is="comName" v-if="showComponent"></component> </keep-alive> ``` 或者直接缓存某个具体组件: ```html <keep-alive> <NativeBtn /> </keep-alive> ``` 4. **结合路由使用** 在 Vue Router 中,`<router-view>` 可以嵌套在 `<keep-alive>` 中,从而缓存某些页面组件的状态: ```html <keep-alive> <router-view v-slot="{ Component }"> <component :is="Component" v-if="$route.meta.keepAlive" /> </router-view> </keep-alive> ``` 在路由配置中通过 `meta` 字段控制是否缓存该组件: ```javascript { path: '/dashboard', name: 'Dashboard', component: Dashboard, meta: { keepAlive: true } } ``` ### 最佳实践 - **选择性缓存**:并非所有组件都需要缓存,建议仅对频繁切换且状态复杂的组件启用 `keep-alive`,以避免不必要的内存占用。 - **清理缓存**:对于长时间不使用的组件,可以通过 `v-if` 控制其是否保留在 DOM 中,或者手动清除缓存实例。 - **配合异步加载优化**:在使用懒加载组件时,`keep-alive` 能有效减少重复加载的开销,提升用户体验。 - **注意内存管理**:虽然 `keep-alive` 提升了性能,但也会增加内存消耗。应根据实际业务需求合理使用,避免内存溢出。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值