• 【Vue】Re18 Router 第五部分(KeepAlive)


    一、KeepAlive概述

    默认状态下,用户点击新的路由时,是访问新的组件

    那么当前组件是会被销毁的,然后创建新的组件对象出来

    如果某些组件频繁的使用,将造成内存空间浪费,也吃内存性能

    所以需求是希望组件能被缓存起来,不是立即销毁

    生命周期的创建函数 create(); 和销毁函数 destory(); 都将反复调用

    二、使用

    只需要把router-view做为keep-alive的子元素就行了

    <template>
      <div id="app">
        <router-link to="/home" tag="button" >去首页</router-link>
        <router-link to="/about" tag="button" >去关于</router-link>
        <router-link :to="/user/+username" tag="button" >用户管理</router-link>
        <router-link :to="ppp" tag="button" >profile</router-link>
    <!--    <button @click="toProfile" >profile</button>-->
    <!--    <button @click="toHome">首页</button>-->
    <!--    <button @click="toAbout">关于</button>-->
        <keep-alive>
          <router-view></router-view>
        </keep-alive>
        <p>
          <button @click="getRouterInstance">获取Router对象</button>
          <button @click="getCurrentRouteInstance">获取Route对象</button>
        </p>
      </div>
    </template>

    如果组件的周期不再销毁,那么生命状态则发生了改变

    在访问时是被激活的状态

    如果离开了组件时,则是非激活状态

    对应了两个生命周期函数:

    activated () {
      // todo ...  
    }
    deactivated () {
      // todo ...  
    }

    注意!!!上述的函数仅对keep-alive处理的组件有效

    三、关于重定向路由BUG问题

     /router/index.js 

    父级路由

      /* 重定向首页路由配置 */
      {
        path : '', /* 缺省值默认指向 '/' */
        redirect : '/home',
      },

    子级路由

        children : [ /* 设置子路由 */
          {
            path : '', /* 这个缺省默认/home */
            redirect : 'news',
          },

    重定向home的时候触发子路由的重定向

    向下继续重定向到/home/news

    解决方案:

    移除子路由的重定向,在组件初始化时重定向一次,后续不再重定向

    还有要记录用户之前访问的组件的路由,回到之前的父组件时访问的子组件

    <template>
      <div>
        <h3>这是首页Home组件</h3>
        <p>
          首页Home组件的内容 <br>
          <router-link to="/home/news">新闻列表</router-link>
          <router-link to="/home/messages">消息列表</router-link>
        </p>
        <router-view></router-view>
      </div>
    </template>
    
    <script>
    export default {
      name: "Home",
      created() {
    
      },
      data () {
        return {
          path : '/home/news'
        }
      },
      activated() {
        this.$router.push(this.path);
      },
      // deactivated() {
      //   this.path = this.$route.path;
      // }
      beforeRouteLeave (to, from, next) {
        this.path = this.$route.path;
        next();
      }
    }
    </script>
    
    <style scoped>
    
    </style>

    四、Keep-Alive的两个属性

        <keep-alive
          include="Home,Message"
          exclude="News,Profile"
        >
          <router-view></router-view>
        </keep-alive>

    include表示需要缓存在里面的组件

    exclude表示排除,不要缓存的组件

    默认是使用正则表达式,符合正则规则的组件名称,就会把该组件选中

    也可以是直接写组件的名称表示,注意不要有空格

    组件的名称就是这个:

    用途主要是为了排除特定不需要缓存的组件,一般需要缓存的不需要填写属性表示了

  • 相关阅读:
    EnterpriseLibrary
    如何只保证窗口只打开一次[即只运行一个进程]
    设计模式之工厂方法模式
    设计模式之代理类
    asp.net mvc应用架构的思考--Unity的应用及三层代码
    为什么我说不要用TransactionScope
    Redis入门学习
    实战分层架构
    asp.net mvc 4多级area实现技巧
    jsonp其实很简单【ajax跨域请求】
  • 原文地址:https://www.cnblogs.com/mindzone/p/13912104.html
Copyright © 2020-2023  润新知