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



    前言

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

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

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



    1. 缓存路由组件

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

    App.vue

    <template>
      <div>
        
        <div class="row">
          <div class="col-xs-offset-2 col-xs-8">
            <div class="page-header">
              <h2>Vue Router Demoh2>
            div>
          div>
        div>
        <div class="row">
          <div class="col-xs-2 col-xs-offset-2">
            <div class="list-group">
              
              <router-link class="list-group-item" active-class="active" to="/about">Aboutrouter-link>
              <router-link class="list-group-item" active-class="active" to="/home">Homerouter-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>
    // 导入子组件
    
    export default {
      name: 'App',
    }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    About.vue

    <template>
      <div>
        <h2>About组件h2>
      div>
    template>
    
    <script>
    export default {
      name: 'About'
    }
    script>
    
    <style>
    
    style>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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">Newsrouter-link>
          li>
          <li>
            <router-link class="list-group-item" active-class="active" to="/home/message">Messagerouter-link>
          li>
        ul>
        <div>
          <router-view>router-view>
        div>
      div>
    template>
    
    <script>
    export default {
      name: 'Home'
    }
    script>
    
    <style>
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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>
    export default {
      name: 'News',
      beforeDestroy() {
        console.log('News组件即将被销毁...')
      }
    }
    script>
    
    <style>
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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>
    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    Detail.vue

    <template>
      <div>
        <ul>
          <li>消息编号: {{id}}li>
          <li>消息标题: {{title}}li>
        ul>
      div>
    template>
    
    <script>
    export default {
      name: 'Detail',
      props: ['id', 'title'],
      mounted() {
        console.log(this.$router)
      }
    }
    script>
    
    <style>
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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
                    }
                  },
                }
              ]
            }
          ]
        }
      ]
    })
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

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

    如果需要在通过路由切换组件时,将原来的组件进行保留,使得在切换组件时原来的组件不被销毁,需要使用 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">Newsrouter-link>
          li>
          <li>
            <router-link class="list-group-item" active-class="active" to="/home/message">Messagerouter-link>
          li>
        ul>
        <div>
          
          <keep-alive>
            <router-view>router-view>
          keep-alive>
        div>
      div>
    template>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

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

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

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

        <div>
          <keep-alive include="News">
            <router-view>router-view>
          keep-alive>
        div>
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

      <div>
         <keep-alive :include="['News', 'Message']">
           <router-view>router-view>
         keep-alive>
       div>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 总结 缓存路由组件

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

    2. 具体编码:

      <keep-alive include="News"> 
          <router-view>router-view>
      keep-alive>
      
      • 1
      • 2
      • 3

    3. activated()与deactivated()

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

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

    • activated路由组件被激活时触发。
    • deactivated路由组件失活时触发。
  • 相关阅读:
    谈谈 Redis 数据类型底层的数据结构?
    WMS系统4.0,仓库管理的20年历史变局你知道吗?
    CSDN课程推荐:《【专题】SecureBoot精讲》系列课程上线
    什么是反向代理,它是如何工作的?
    OpenCV自学笔记二十五:K均值聚类
    HTTPS对HTTP的加密过程
    MYSQL4:慢查询的优化方法和锁机制
    学术分享 | 清华大学 康重庆:电力系统碳计量技术与应用(Matlab代码实现)
    怎么办理建筑资质,四个步骤教你办理工程资质流程
    家政小程序开发制作,家政保洁上门维修小程序搭建
  • 原文地址:https://blog.csdn.net/m0_53022813/article/details/127465479