• Vue keep-alive的总结


    1.基本用法

      vue2.0提供了一个keep-alive组件用来缓存组件,避免多次加载相应的组件,减少性能消耗.

    <keep-alive>
        <component>
           <!-- 组件将被缓存 -->
        </component>
    </keep-alive>

      有时候 可能需要缓存整个站点的所有页面,而页面一般一进去都要触发请求的。
      在使用keep-alive的情况下:

    <keep-alive>
        <router-view></router-view>
    </keep-alive>

      将首次触发请求写在created钩子函数中,就能实现缓存,比如列表页,去了详情页 回来,还是在原来的页面。

    2.缓存部分页面或者组件

      (1)使用router.mate属性:

    <!--这是目前用的比较多的方式 -->
    <keep-alive>
        <router-view v-if="!$route.meta.notKeepAlive"></router-view>
    </keep-alive>
    <router-view v-if="$route.meta.notKeepAlive"></router-view>

        router设置:

    routes: [
        { path: '/', redirect: '/index',  component: Index, mate: { keepAlive: true }},
        {
          path: '/common',
          component: TestParent,
          children: [
            { path: '/test2', component: Test2, mate: { keepAlive: true } } 
          ]
        }
    // 表示index和test2都使用keep-alive

      (2)使用新增属性inlcude/exclude:  

      prop:

    • include: 字符串或正则表达式。只有匹配的组件会被缓存。
    • exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。
    <keep-alive include="test-keep-alive">
      <!-- 将缓存name为test-keep-alive的组件 -->
      <component></component>
    </keep-alive>
    
    <keep-alive include="a,b">
      <!-- 将缓存name为a或者b的组件,结合动态组件使用 -->
      <component :is="view"></component>
    </keep-alive>
    
    <!-- 使用正则表达式,需使用v-bind -->
    <keep-alive :include="/a|b/">
      <component :is="view"></component>
    </keep-alive>
    
    <!-- 动态判断 -->
    <keep-alive :include="includedComponents">
      <router-view></router-view>
    </keep-alive>
    
    <keep-alive exclude="test-keep-alive">
      <!-- 将不缓存name为test-keep-alive的组件 -->
      <component></component>
    </keep-alive> 

     注意:这种方法都是预先知道组件的名称的

    (3)使用$route.meta的keepAlive属性:

    <keep-alive>
        <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>

      需要在router中设置router的元信息meta: 

    //...router.js
    export default new Router({
      routes: [
        {
          path: '/',
          name: 'Hello',
          component: Hello,
          meta: {
            keepAlive: false // 不需要缓存
          }
        },
        {
          path: '/page1',
          name: 'Page1',
          component: Page1,
          meta: {
            keepAlive: true // 需要被缓存
          }
        }
      ]
    })

     (4)动态判断(实例)

    <keep-alive :include="cache_page.toString()">
      <router-view></router-view>
    </keep-alive>
    data() {
        return {
            cache_page: []
        }
    },
    watch: {
        $route(to, from){
            if(to.meta.modules !== from.meta.modules){
                this.cache_page = [];
            }
            if('modules' in to.meta){
                this.cache_page.push(to.name);
            }
        }
    }

    router配置:

    //...router.js
    
    export default new Router({
      routes:  [{
            path: '/aaa',
            name: 'aaa',
            component: aaa,
            meta: {
                modules: 'aaa'    //需要被缓存
            }
        },
        {
            path: '/bbb',
            name: 'bbb',
            component: bbb,
            meta: {
                modules: 'bbb'    //需要被缓存
            }
        },
        {
            path: '/ccc',
            name: 'ccc',
            component: ccc,
            meta: {
                modules: 'ccc'    //不要缓存
            }
        },
        {
            path: '/ddd',
            name: 'ddd',
            component: ddd,
            meta: {
                modules: 'ccc'    //不要缓存
            }
        }]
    });

      用router配置的meta.modules去判断,如果meta.modules不同,则push到数组,页面将会被缓存。

  • 相关阅读:
    Medium | LeetCode 142. 环形链表 II
    Easy | LeetCode 141. 环形链表
    Hard | LeetCode 23. 合并K个升序链表 | 分治 | 优先队列
    std(19)内置算法find find_if
    stl(18)内置算法for_each transform
    C++引用和指针比较 指针常量和常量指针
    #pragma once和#ifndef用法
    c++变量的一些注意点 extern关键字的使用
    比特 字节 地址 类型 编码 32位 64位
    stl(16)stl内置的一些函数对象
  • 原文地址:https://www.cnblogs.com/minozMin/p/9772521.html
Copyright © 2020-2023  润新知