[Vue]缓存路由组件 activated()与deactivated()

news/2024/7/9 23:47:48 标签: vue.js, 缓存, javascript, 前端框架, vue

前言

系列文章目录:
[Vue]目录
老师的课件笔记,不含视频 https://www.aliyundrive.com/s/B8sDe5u56BU

笔记在线版: https://note.youdao.com/s/5vP46EPC

视频:尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通


文章目录

  • 前言
  • 1. 缓存路由组件
  • 2. 总结 缓存路由组件
  • 3. activated()与deactivated()


1. 缓存路由组件

默认情况下,进行路由的切换原来展示在页面上的组件会被销毁,新的组件会被挂载在页面上。由于每次通过路由切换组件,原来的组件都会被销毁,所以原来组件中的状态将不被保留,即每次展示在页面上的都是一个全新的被创建的组件实例对象。

App.vue

<template>
  <div>
    <!-- 使用子组件 -->
    <div class="row">
      <div class="col-xs-offset-2 col-xs-8">
        <div class="page-header">
          <h2>Vue Router Demo</h2>
        </div>
      </div>
    </div>
    <div class="row">
      <div class="col-xs-2 col-xs-offset-2">
        <div class="list-group">
          <!-- Vue中借助router-link标签实现路由的切换 -->
          <router-link class="list-group-item" active-class="active" to="/about">About</router-link>
          <router-link class="list-group-item" active-class="active" to="/home">Home</router-link>
        </div>
      </div>
      <div class="col-xs-6">
        <div class="panel">
          <div class="panel-body">
            <!-- 指定当前路由对应组件的呈现位置 -->
            <router-view></router-view>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>javascript">
// 导入子组件

export default {
  name: 'App',
}
</script>

About.vue

<template>
  <div>
    <h2>About组件</h2>
  </div>
</template>

<script>javascript">
export default {
  name: 'About'
}
</script>

<style>

</style>

Home.vue

<template>
  <div>
    <h2>Home组件</h2>
    <ul class="nav nav-tabs">
      <li>
        <router-link class="list-group-item" active-class="active" to="/home/news">News</router-link>
      </li>
      <li>
        <router-link class="list-group-item" active-class="active" to="/home/message">Message</router-link>
      </li>
    </ul>
    <div>
      <router-view></router-view>
    </div>
  </div>
</template>

<script>javascript">
export default {
  name: 'Home'
}
</script>

<style>
</style>

News.vue

<template>
  <div>
    <ul>
      <li>news001 <input type="text"></li>
      <li>news002 <input type="text"></li>
      <li>news003 <input type="text"></li>
    </ul>
  </div>
</template>

<script>javascript">
export default {
  name: 'News',
  beforeDestroy() {
    console.log('News组件即将被销毁...')
  }
}
</script>

<style>
</style>

Message.vue

<template>
  <div>
    <ul>
      <li v-for="m in messageList" :key="m.id">
        <router-link :to="{
          name: 'messageDetail',
          query: {
            id: m.id,
            title: m.title
          }
        }">
          {{m.title}}
        </router-link>
      </li>
    </ul>
    <hr>
    <router-view></router-view>
  </div>
</template>

<script>javascript">
export default {
  name: 'Message',
  data() {
    return {
      messageList: [
        { id: '001', title: '消息001' },
        { id: '002', title: '消息002' },
        { id: '003', title: '消息003' }
      ]
    }
  },
  beforeDestroy() {
    console.log('Message组件即将被销毁...')
  }
}
</script>

<style>
</style>

Detail.vue

<template>
  <div>
    <ul>
      <li>消息编号: {{id}}</li>
      <li>消息标题: {{title}}</li>
    </ul>
  </div>
</template>

<script>javascript">
export default {
  name: 'Detail',
  props: ['id', 'title'],
  mounted() {
    console.log(this.$router)
  }
}
</script>

<style>
</style>

router/index.js

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import Message from '../pages/Message'
import News from '../pages/News'
import Detail from '../pages/Detail'

//创建并暴露一个路由器
export default new VueRouter({
  routes: [
    {
      name: 'about',
      path: '/about',
      component: About
    },
    {
      name: 'home',
      path: '/home',
      component: Home,
      children: [
        {
          name: 'news',
          path: 'news',
          component: News
        },
        {
          name: 'message',
          path: 'message',
          component: Message,
          children: [
            {
              name: 'messageDetail',
              path: 'detail',
              component: Detail,
              props($route) {
                return {
                  id: $route.query.id,
                  title: $route.query.title
                }
              },
            }
          ]
        }
      ]
    }
  ]
})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果需要在通过路由切换组件时,将原来的组件进行保留,使得在切换组件时原来的组件不被销毁,需要使用 keep-alive 标签将组件的展示区域的 router-view 标签进行包裹。

<template>
  <div>
    <h2>Home组件</h2>
    <ul class="nav nav-tabs">
      <li>
        <router-link class="list-group-item" active-class="active" to="/home/news">News</router-link>
      </li>
      <li>
        <router-link class="list-group-item" active-class="active" to="/home/message">Message</router-link>
      </li>
    </ul>
    <div>
      <!-- 展示在该区域的组件不会被销毁,会被保留 -->
      <keep-alive>
        <router-view></router-view>
      </keep-alive>
    </div>
  </div>
</template>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

默认情况下,如果只是单纯的使用 keep-alive 标签将 router-view 标签进行包裹,则展示在该区域的所有组件都将会被保留下来,不会被销毁。

如果需要指定保留的组件,则需要在 keep-alive 标签中使用 include 属性指定需要保留的组件,使用 include 属性之后只有指定的组件会被保留。

注意:include 属性中写的是组件名 name

    <div>
      <keep-alive include="News">
        <router-view></router-view>
      </keep-alive>
    </div>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果需要指定保留多个组件不被销毁,使用属性绑定指令数组形式的写法:

  <div>
     <keep-alive :include="['News', 'Message']">
       <router-view></router-view>
     </keep-alive>
   </div>

2. 总结 缓存路由组件

  1. 作用:让不展示的路由组件保持挂载,不被销毁。

  2. 具体编码:

    <keep-alive include="News"> 
        <router-view></router-view>
    </keep-alive>
    

3. activated()与deactivated()

activated()与deactivated()是两个生命周期钩子(生命周期函数)。

activated()与deactivated()是路由组件所独有的两个生命周期钩子,用于捕获路由组件的激活状态。

  • activated路由组件被激活时触发。
  • deactivated路由组件失活时触发。

http://www.niftyadmin.cn/n/317.html

相关文章

详解Java对象内存结构以及指针压缩原理

详解Java对象内存结构以及指针压缩原理 文章目录详解Java对象内存结构以及指针压缩原理HotSpot中的Java对象布局JOL工具简介对象头Mark Word标记字Klass Pointer类型指针为什么要在对象头中引入锁指针压缩原理解决方法HotSpot中的Java对象布局 在介绍对象在内存中的组成结构前…

sqlSessionFactory提示需要注入-mybatis版本升级问题排查过程

问题背景 我们在写业务需求的时候遇到这样一个场景&#xff1a;批量插⼊⼀批数据到⼀张表中&#xff0c;然后获取到插⼊的Id,并将这些Id返回。 ⾸先mybatis是⽀持单个数据插⼊返回Id的&#xff0c;实际上&#xff0c;mybatis也⽀持批量插⼊返回Id <!-- 批量新增 --> &…

关于pearl_house未来的一些思考

background pearl这个项目是我从前年开始维护的项目&#xff0c; 其中分为pearl_mind 和pearl_house。对于pearl_mind目前已经通过几千个思维导图分支进行了详细地整理&#xff0c; 帮助我在健康、金融、生活等方面建立了第一性原则&#xff0c; 目前基本处于修补状态&#xf…

刷爆leetcode第十二期 0026 数组中数字出现的次数

编号0026 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间复杂度是O(1)。 题目示例如下 这里其实是一道我一个月之前做的题目 在学弟的博客里刚好看…

初学算法——第二天:斐波那契数列

14天阅读挑战赛 1 定义 斐波那契数列的定义者&#xff0c;是意大利数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;&#xff0c;生于公元1170年&#xff0c;卒于1250年&#xff0c;籍贯是比萨。他被人称作“比萨的莱昂纳多”。1202年&#xff0c;他撰写了…

你只管生产,其他的请交给华为云大数据BI解决方案

你只管生产&#xff0c;其他的请交给华为云大数据BI解决方案 制造业已经占据了我国经济指标的主体地位&#xff0c;对经济增长产生着重要影响。随着世界经济一体化进程不断加快和全球产业链分工逐渐深化&#xff0c;"中国制造2025"将成为推动我国实现产业升级发展的…

应用层——HTTP协议

文章目录一、应用层1.1 应用层概念1.2 再谈协议二、网络版本的计算器网络计算器编码部分版本1&#xff1a;原生版本版本2&#xff1a;引入序列化和反序列化三、HTTP协议3.1 URL3.2 urlencode和urldecode3.3 HTTP协议格式3.3.1 请求报文3.3.2 响应报文3.4 HTTPDemo3.4.1改进3.4.…

Redis实战 - 11 Redis GEO 实现附近的人功能

各种社交软件里面都有附件的人的需求&#xff0c;在该应用中&#xff0c;我们查询附近1公里的食客&#xff0c;同时只需查询出20个即可。 文章目录1. Redis GEO常用命令2. 上传用户地理位置1. RedisKeyConstant2. 控制层 NearMeController3. 业务层 NearMeService4. 项目测试5.…