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日

相关文章

  • Win10正式版1511 Build 10586.965累积更新补丁KB4032693下载地址 32位/64位

    Win10正式版1511 Build 10586.965累积更新补丁KB4032693下载地址 32位/64位攻略 1. 确认系统版本和位数 首先,我们需要确认系统版本和位数。打开Windows 10操作系统,点击开始菜单,选择“设置”(齿轮图标),然后点击“系统”选项。在系统设置页面中,点击“关于”选项卡。在关于页面中,可以找到系统版本和位数的信息。 2.…

    other 2023年8月4日
    00
  • Vue中slot插槽作用与原理详解

    当然!下面是关于\”Vue中slot插槽作用与原理详解\”的完整攻略,包含两个示例说明。 … … … … 示例1:默认插槽 <template> <div> <h1>父组件</h1> <slot></slot> </div> </template>…

    other 2023年8月20日
    00
  • mysql 直接拷贝data 目录下文件还原数据的实现

    MySQL直接拷贝data目录下文件还原数据的实现攻略 有时候,我们可能需要将MySQL数据库从一个服务器迁移到另一个服务器,或者需要还原已备份的数据。在这种情况下,直接拷贝MySQL的data目录下的文件是一种快速且方便的方法。下面是实现这一过程的详细攻略: 停止MySQL服务:首先,停止正在运行的MySQL服务,以确保数据文件不会被修改或覆盖。 备份原始…

    other 2023年10月18日
    00
  • 为什么win10总是重启?win10重启的原因以及解决办法

    为什么win10总是重启? Win10在重启的情况下,可能有以下几种原因: 更新和安装软件 更新和安装软件可能会导致电脑重启,特别是在更新操作完成后,需要重启电脑才能够生效,重启可能是平稳的,也可能是强制性的。 解决方法: 等待更新或者安装程序完成,这通常需要一些时间。在完成之前,请确保系统满足所有更新的要求。 驱动程序问题 驱动程序问题也可能会导致Win1…

    other 2023年6月26日
    00
  • 魔兽世界达萨罗之战BOSS打法攻略 达萨罗之战全BOSS打法要点详解

    魔兽世界达萨罗之战BOSS打法攻略 BOSS介绍 达萨罗之战共有九个BOSS,分别是: 丰灵 国王的试炼(全明星赛) 低语者沃尔兹斯 大厅哨兵 天空队长热炮 纳特拉·血怒 玉火大师 拆解者米斯拉克斯 格洛恩,还有他的三个尖牙战士 每个BOSS都有独特的机制和技能,需要团队成员相互配合才能成功击败。 达萨罗之战全BOSS打法要点详解 丰灵 丰灵是达萨罗之战的第…

    other 2023年6月27日
    00
  • 沃尔玛swot分析

    以下是关于沃尔玛SWOT分析的完整攻略,包含两个示例。 沃尔玛SWOT分析 SWOT分析是一种常用的战略管理工具,用于评估企业的内部和外部环境。以下是沃尔玛SWOT分析的详细攻略。 1. 内部环境分析 沃尔玛的内部环境分析主要包括以下几个方面: 1.1 优势 沃尔玛作为全球最大的零售商之一,具有以下优势: 规模经济:沃尔玛拥有庞大的规模,可以通过采购、物流等…

    other 2023年5月9日
    00
  • C++ 实现单链表创建、插入和删除

    C++ 实现单链表创建、插入和删除的攻略如下: 创建单链表 创建一个单链表需要先定义一个链表节点结构体,包含两个元素:一个是节点的值,另一个是指向下一个节点的指针。 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 定义好节点结构体之后,…

    other 2023年6月27日
    00
  • 捆绑IP地址和MAC地址 避免IP盗用情况的发生 

    捆绑IP地址和MAC地址 避免IP盗用情况的发生 在网络中,为了确保IP地址的安全性和防止盗用,可以采取捆绑IP地址和MAC地址的措施。通过将IP地址与设备的MAC地址绑定,可以确保只有具有相应MAC地址的设备才能使用该IP地址。下面是一个详细的攻略,介绍如何实施这种措施。 步骤一:了解IP地址和MAC地址 首先,我们需要了解IP地址和MAC地址的概念。 I…

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