vue的路由守卫和keep-alive后生命周期详解

针对“vue的路由守卫和keep-alive后生命周期详解”的攻略,本文将从以下几个方面逐一展开:

  1. 路由守卫

Vue.js提供了路由守卫,用于在路由切换前后进行回调处理,可以根据需求在路由切换前进行权限验证、登录态验证、路由拦截等操作,提高了应用的安全性和灵活性。路由守卫主要分为全局守卫和组件内守卫两种类型。

  • 全局守卫

全局守卫是在整个应用程序中进行的。Vue.js提供了三个全局守卫:beforeEach、beforeResolve和afterEach。这三个守卫分别在路由转换开始前、解析完异步组件后以及路由转换完成时进行回调处理。下面,我们通过一个示例来演示一下这几个守卫的使用。

router.beforeEach((to, from, next) => {
  if (to.meta.requireAuth) {
    if (localStorage.getItem('token')) {
      next();
    } else {
      next({
        path: '/login',
        query: {
          redirect: to.fullPath
        }
      })
    }
  } else {
    next();
  }
})

router.beforeResolve((to, from, next) => {
  // do something before resolving route
  next();
})

router.afterEach((to, from) => {
  // do something after route has been changed
})

在这段代码中,我们通过beforeEach全局守卫来进行路由拦截,如果需要访问的路由需要登录状态,而当前并未登录,则会跳转到登录页面,否则继续进行路由转换。beforeResolve全局守卫则在异步组件解析完毕后进行回调处理,可以在此时进行Loading动画的隐藏等操作。afterEach全局守卫则在路由转换完成后进行回调处理,可以在此时进行页面滚动、页面埋点等操作。

  • 组件内守卫

组件内守卫是在组件内部进行的。Vue.js提供了beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave三个组件内守卫。这三个守卫分别在组件创建前、路由参数变化时以及离开当前路由时进行回调处理。下面,我们通过两个示例演示一下这几个守卫的使用。

示例一:

export default {
  name: 'Home',
  beforeRouteEnter (to, from, next) {
    console.log('beforeRouteEnter')
    next()
  },
  beforeRouteUpdate (to, from, next) {
    console.log('beforeRouteUpdate')
    next()
  },
  beforeRouteLeave (to, from, next) {
    console.log('beforeRouteLeave')
    next()
  }
}

在这个示例中,我们定义了一个Home组件,并在组件内定义了beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave三个守卫。当我们从其他路由跳转到Home路由时,会触发beforeRouteEnter守卫;当我们在Home路由中切换路由参数时,会触发beforeRouteUpdate守卫;当我们离开Home路由时,会触发beforeRouteLeave守卫。

示例二:

export default {
  name: 'Detail',
  data () {
    return {
      detailData: {}
    }
  },
  beforeRouteEnter (to, from, next) {
    console.log('beforeRouteEnter')
    if (localStorage.getItem('token')) {
      axios.get(`http://xxx.com/detail/${to.params.id}`).then(res => {
        next(vm => {
          vm.detailData = res.data
        })
      })
    } else {
      next({
        path: '/login',
        query: {
          redirect: to.fullPath
        }
      })
    }
  },
  beforeRouteUpdate (to, from, next) {
    console.log('beforeRouteUpdate')
    axios.get(`http://xxx.com/detail/${to.params.id}`).then(res => {
      this.detailData = res.data
      next()
    })
  },
  beforeRouteLeave (to, from, next) {
    console.log('beforeRouteLeave')
    next()
  }
}

在这个示例中,我们定义了一个Detail组件,并在组件内定义了beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave三个守卫。当我们在从其他路由跳转到Detail路由时,会触发beforeRouteEnter守卫,我们可以在这里进行登录状态检查和获取详情数据的操作,并在next回调中将数据传递给组件实例;当我们在Detail路由中切换路由参数时,会触发beforeRouteUpdate守卫,我们可以在这里根据最新的路由参数重新获取数据,更新组件内的数据;当我们离开Detail路由时,会触发beforeRouteLeave守卫,可以在这里进行一些清理工作。

  1. keep-alive后生命周期

keep-alive是Vue.js内置的一个组件,用于缓存动态组件或者组件的状态,在组件被激活或者被销毁时控制缓存的生命周期。如果你的组件需要频繁切换,而其中的状态又比较复杂和重要,可以考虑使用keep-alive来进行性能优化。下面,我们将详细介绍keep-alive的生命周期以及如何利用生命周期进行缓存控制。

  • activated

activated生命周期钩子函数会在组件被激活时调用,可以在这里进行缓存处理。下面,我们通过一个示例来演示一下activated的使用。

<template>
  <div>
    <h2>{{title}}</h2>
    <p>{{content}}</p>
  </div>
</template>

<script>
  export default {
    name: 'MessageDetails',
    data () {
      return {
        id: '',
        title: '',
        content: ''
      }
    },
    created () {
      this.id = this.$route.params.id
      this.getMessageDetail()
    },
    activated () {
      this.getMessageDetail()
    },
    methods: {
      getMessageDetail () {
        // get message detail data by id
        // ...
        this.title = 'message title'
        this.content = 'message content'
      }
    }
  }
</script>

在这个示例中,我们定义了一个MessageDetails组件,用来显示消息详情页。在该组件的created生命周期函数中,我们通过$route.params获取路由参数,然后调用getMessageDetail方法来获取消息详情数据。在activated生命周期函数中,我们每次组件被激活时都会调用getMessageDetail方法来刷新数据,达到缓存的效果。

  • deactivated

deactivated生命周期钩子函数会在组件被停用时调用,可以在这里进行缓存处理。下面,我们通过一个示例来演示一下deactivated的使用。

<template>
  <div>
    <p>{{content}}</p>
  </div>
</template>

<script>
  export default {
    name: 'MessageItem',
    data () {
      return {
        content: ''
      }
    },
    created () {
      this.initContent()
    },
    deactivated () {
      this.clearContent()
    },
    methods: {
      initContent () {
        // init message content
        // ...
        this.content = 'message content'
      },
      clearContent () {
        // clear message content
        // ...
        this.content = ''
      }
    }
  }
</script>

在这个示例中,我们定义了一个MessageItem组件,用来显示消息列表中的每一个消息,当每一个消息的信息比较重要且状态比较复杂时,我们可以使用keep-alive来进行缓存优化。在该组件的created生命周期函数中,我们调用initContent方法来初始化消息内容,在deactivated生命周期函数中,我们调用clearContent方法来清空消息内容。这样,当该组件被缓存时,内容会被保存下来,当组件重新被激活时,内容会被恢复。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue的路由守卫和keep-alive后生命周期详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 第2课,python while循环的使用

    下面是关于Python while循环的使用的完整攻略,包括基本概念、使用方法和两个示例等方面。 Python while循环的基本概念 Python中的while循环是一种重复执行代码块的结构,只要指定的条件为真,就会一直执行循环体中的代码。while循环的基本语法如下: while 条件: 循环体 其中,条件是一个布尔表达式,循环体是需要重复执行的代码块…

    other 2023年5月6日
    00
  • Nuxt3 布局layouts和NuxtLayout的使用详解

    Nuxt3 布局(layouts)和 NuxtLayout 的使用详解 什么是 Nuxt3 布局(layouts)? 在 Nuxt3 中,布局(layouts)是一种用于定义页面结构的机制。布局可以包含共享的 HTML 结构、样式和逻辑,以便在多个页面中重复使用。通过使用布局,我们可以更好地组织和管理我们的页面。 NuxtLayout NuxtLayout …

    other 2023年8月20日
    00
  • 浅谈HDFS(三)之DataNote

    浅谈HDFS(三)之DataNote 在之前的文章中,我们已经探讨了HDFS的基础架构和数据流。今天,我们来谈一谈HDFS的DataNode。 DataNode的作用 在一个HDFS集群中,每个节点都需要开启DataNode服务。DataNode是HDFS的核心组成部分之一,其主要的任务是存储实际的数据块,并向NameNode汇报它持有的块信息。 当一个HD…

    其他 2023年3月28日
    00
  • 谈一谈html表单标签有什么

    以下是关于“HTML表单标签”的完整攻略,包含两个示例。 HTML表单标签 HTML表单标签用于创建交互式表单,允许用户向Web服务器提交数据。以下是一些常用的HTML表单标签及其用途的详细攻略。 1. \ 标签 \ 标签用于创建HTML表单。它包含一个或多个表单元素,例如输入字段、复选框、单选按钮、下拉列表等。以下是一个示例: <form actio…

    other 2023年5月9日
    00
  • SSH 登录工具常用命令

    下面是SSH登录工具常用命令的完整攻略。 1. SSH登录 SSH登录是将本地计算机与远程计算机之间进行安全加密通信的过程。这个过程需要使用SSH客户端和SSH服务器进行连接,并进行身份验证。 常用SSH登录命令: ssh username@remote_host 其中,username是你要登录的账户名;remote_host是你要登录的远程主机的IP地址…

    other 2023年6月26日
    00
  • Go语言基础学习之数组的使用详解

    Go语言基础学习之数组的使用详解 数组的定义 在Go语言中,数组是具有相同数据类型的一组连续内存空间的集合。数组可以用来存储一系列的同类型数据,数组名为数组在内存中的首地址。数组的定义格式如下所示: var 数组名 [元素数量]类型 其中,数组名是用户定义的标识符,元素数量必须是一个常量表达式,类型可以是任意基本类型。 数组的初始化 数组定义后,可以通过初始…

    other 2023年6月25日
    00
  • 百度帐号怎么修改昵称?

    当用户注册百度账号后,有时候会需要修改自己的昵称,以下是修改百度账号昵称的详细攻略。 前置条件 已经在百度网站注册并登录成功 已经有需要修改的昵称 操作步骤 进入百度个人中心网址,在页面中部附近找到“账号设置”选项,点击进入账号设置页面。 在账号设置页面的“基本资料”选项中,找到“昵称”一项,旁边是当前账户的昵称,点击昵称右侧的“修改”链接即可进入修改昵称页…

    other 2023年6月27日
    00
  • RedisTemplate中opsForValue和opsForList方法的使用详解

    下面我就来详细讲解一下RedisTemplate中opsForValue和opsForList方法的使用详解。 一、RedisTemplate在Spring Boot中的使用 RedisTemplate是Spring Data Redis提供的redis客户端操作工具类,它封装了redis的操作,同时提供了对对象的序列化和反序列化。 在Spring Boot…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部