iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue守卫零基础介绍
  • 347
分享到

Vue守卫零基础介绍

2024-04-02 19:04:59 347人浏览 独家记忆
摘要

目录1. 全局导航守卫2. 路由独享守卫3. 组件内守卫1. 全局导航守卫 语法: # 守卫参数    + to: Route: 即将要进入的目标 路由

1. 全局导航守卫

语法:

# 守卫参数
    + to: Route: 即将要进入的目标 路由对象
    + from: Route: 当前导航正要离开的路由
    + next: Function: 一定要调用该next方法,否则路由不向下执行,页面空白。

# 全局前置守卫,当一个导航触发时,立刻触发前置守卫,
router.beforeEach((to, from, next) => {
  // ...
  next()
})

//全局解析守卫,等到路由独享守卫和组件内守卫都解析完毕后执行
router.beforeResolve((to, from, next) => {
  // ...
  next()
})

# 全局后置钩子,全部守卫执行完毕后执行
// 此钩子不会接受 next 函数也不会改变导航本身
router.afterEach((to, from) => {
  // ...
})

全局导航守卫执行顺序:

news.js(这个文件是从 index.js 文件中抽取拆分出来的,最终要被引入到 insex.js 文件中):

import News from '@/views/News'
import Detail from '@/views/Detail'
import Login from '@/views/Login'
const routes = [
    {
        path: '/news',
        component: News,
    },
    {
        path: '/news/:id',
        name: 'xw',
        component: Detail,
    },
    {
        // 这是登录页
        path: '/login',
        component: Login,
    }
]
export default routes

index.js:

import Vue from 'vue'
import VueRouter from 'vue-router'
import news from './routes/news'
// 以插件的方式添加
Vue.use(VueRouter)
// 实例化路由对象及配置路由表
const routes = [...news]
const router = new VueRouter({
  // 路由模式
  mode: 'history',
  // 路由规则表
  routes
})
// 全局守卫 每次切换页面都会执行到
// 前置
router.beforeEach((to, from, next) => {
  console.log('全局 --- beforeEach')
  next()
})
// 解析
router.beforeResolve((to, from, next) => {
  console.log('全局 --- beforeResolve')
  next()
})
// 后置
router.afterEach((to, from) => {
  console.log('全局 --- afterEach')
})
export default router

登录页(index.vue):

<template>
  <div>
    <button>登录用户</button>
  </div>
</template>
<script>
export default {
}
</script>
<style lang="sCSS" scoped></style>

现在我们有这样一个需求,用户只有在登录成功之后,才能访问新闻页面,该怎么做呢?

index.js:

import Vue from 'vue'
import VueRouter from 'vue-router'
import news from './routes/news'
// 以插件的方式添加
Vue.use(VueRouter)
// 实例化路由对象及配置路由表
const routes = [...news]
const router = new VueRouter({
  // 路由模式
  mode: 'history',
  // 路由规则表
  routes
})
// 用全局前置守卫判断用户是否登录
router.beforeEach((to, from, next) => {
  // 在使用导航守卫来验证用户是否登录,一定要把登录页面路由排除掉,防止死循环
  // 如果没有在本地存储中获取到token值,并且即将跳转的页面不是登录页
  if (!sessionStorage.getItem('token') && to.path != '/login') {
    // 到登录页面
    // next('/login')
    // replace: true表示跳转到登录页面后,不允许回退
    next({ path: '/login', replace: true })
  } else {
    next()
  }
})
export default router

2. 路由独享守卫

语法:

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
		next()
      }
    }
  ]
})

使用:

news.js(这个文件是从 index.js 文件中抽取拆分出来的,最终要被引入到 insex.js 文件中):

import News from '@/views/News'
import Detail from '@/views/Detail'
import Login from '@/views/Login'
const routes = [
  {
    path: '/news',
    component: News,
  },
  {
    path: '/news/:id',
    name: 'xw',
    component: Detail,
  },
    {
      // 这是登录页
      path: '/login',
      component: Login,
      // 路由独享守卫 
      // 只有当前的路由规则才生效,比如登录页面的路由独享守卫在进入新闻页面时就不会生效
      // 路由独享守卫在每次进入到当前路由页面时都会执行
      beforeEnter: (to, from, next) => {
        console.log('路由独享守卫 ==login -- --- beforeEnter')
        next()
      }
    }
]
export default routes

3. 组件内守卫

语法:

你可以在路由组件内直接定义以下路由导航守卫:

const Foo = {
  template: `...`,
  //执行完全局前置守卫和路由独享守卫,就会执行当前函数
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  //动态路由参数改变就会触发这个函数
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  //离开当前页面时调用
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}

所有守卫和生命周期函数的执行顺序:

news.js(这个文件是从 index.js 文件中抽取拆分出来的,最终要被引入到 insex.js 文件中):

import News from '@/views/News'
import Detail from '@/views/Detail'
import Login from '@/views/Login'
const routes = [
  {
    path: '/news',
    component: News,
  },
  {
    path: '/news/:id',
    name: 'xw',
    component: Detail,
    beforeEnter: (to, from, next) => {
      console.log('路由独享守卫 -- detail --- beforeEnter')
      next()
    }
  },
    {
      // 这是登录页
      path: '/login',
      component: Login,
      // 路由独享守卫 
      // 只有当前的路由规则才生效,比如登录页面的路由独享守卫在进入新闻页面时就不会生效
      // 路由独享守卫在每次进入到当前路由页面时都会执行
      beforeEnter: (to, from, next) => {
        console.log('路由独享守卫 ==login -- --- beforeEnter')
        next()
      },
    }
]
export default routes

详情页(index.vue):

<template>
  <div>
    <h3>新闻详情页</h3>
  </div>
</template>
<script>
export default {
  // 当路由访问到此组件时,执行此钩子函数
  beforeRouteEnter(to, from, next) {
    console.log("组件 --- beforeRouteEnter");
    next();
  },
  // 离开当前路由组件
  beforeRouteLeave(to, from, next) {
    console.log("组件 --- beforeRouteLeave");
    next();
  },
  // 路由参数的改变,触发路由组件守卫
  beforeRouteUpdate(to, from, next) {
    console.log(this);
    console.log("组件 --- beforeRouteUpdate");
    next();
  },
  // 和生命周期函数比较以下执行顺序
  // 所有路由解析完毕以后,才开始执行生命周期函数
  beforeCreate() {
    console.log('组件 === beforeCreate')
  },
  beforeDestroy() {
    console.log('组件 === beforeDestroy')
  },
  destroyed() {
    console.log('组件 === destroyed')
  },
};
</script>
<style lang="scss" scoped></style>

下面我们来看beforeRouteUpdate函数什么时候执行。

详情页(index.vue):

<template>
  <div>
    <h3>新闻详情页</h3>
    <router-link to="/news/1">111</router-link><br />
    <router-link to="/news/2">222</router-link><br />
    <router-link to="/news/3">333</router-link>
  </div>
</template>
<script>
export default {
  // 当路由访问到此组件时,执行此钩子函数
  beforeRouteEnter(to, from, next) {
    console.log("组件 --- beforeRouteEnter");
    next();
  },
  // 离开当前路由组件
  beforeRouteLeave(to, from, next) {
    console.log("组件 --- beforeRouteLeave");
    next();
  };
  // 路由参数的改变,触发路由组件守卫
  // 可以用来监听页面是否发生变化
  beforeRouteUpdate(to, from, next) {
    // console.log(this);
    console.log("组件 --- beforeRouteUpdate");
    next();
  },
  // 监听器也可以用来监听页面是否发生变化
  // watch:{
  //   '$route'(n){
  //     console.log('watch --- ' ,n);
  //   }
  // },
  // 和生命周期函数比较以下执行顺序
  // 所有路由解析完毕以后,才开始执行生命周期函数
  beforeCreate() {
    console.log('组件 === beforeCreate')
  },

  beforeDestroy() {
    console.log('组件 === beforeDestroy')
  },
  destroyed() {
    console.log('组件 === destroyed')
  },
};
</script>
<style lang="scss" scoped></style>

到此这篇关于Vue守卫零基础介绍的文章就介绍到这了,更多相关Vue守卫内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue守卫零基础介绍

本文链接: https://www.lsjlt.com/news/168806.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue守卫零基础介绍
    目录1. 全局导航守卫2. 路由独享守卫3. 组件内守卫1. 全局导航守卫 语法: # 守卫参数    + to: Route: 即将要进入的目标 路由...
    99+
    2024-04-02
  • VueRouter路由守卫超详细介绍
    目录全局前置&后置路由守卫独享路由守卫组件内路由守卫全局前置&后置路由守卫 router/index.js import Vue from 'vue'; import...
    99+
    2023-01-28
    Vue Router路由守卫 Vue 路由守卫
  • Vue组件基础操作介绍
    目录一、组件二、组件的创建三、组件中的data四、组件中的methods一、组件 组件是vue的重要的特征之一,可以扩展html的功能,也可以封装代码实现重复使用。 二、组件的创建 ...
    99+
    2023-01-14
    Vue组件创建 Vue组件data Vue组件methods
  • VXLAN基础介绍
    VXLAN简介 VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网)采用MAC in UDP封装方式,是NVO3(Network Virtualization over Layer 3)中...
    99+
    2023-09-09
    网络 服务器 网络协议
  • Python基础---Python介绍
      python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。  2017年最新的TIOBE排行榜,Py...
    99+
    2023-01-31
    基础 Python
  • TypeScript基础类型介绍
    目录1.基础类型 2.对象类型 2.1数组 2.2元组 2.3对象 3.类型推断 3.1类型联合中的类型推断 3.2上下文类型 4.类型断言 TS 的静态类型可以人为的分为两类: 基...
    99+
    2024-04-02
  • PHP基础知识介绍
    php中的整形数是有符号的,不能表示无符号整数,当整形数超出范围时,会自动从整形数转化成float数,可以用php_int_size常量来查看php整数类型所占字节,一般为4个字节,...
    99+
    2022-11-15
    PHP 基础知识
  • ES6基础知识介绍
    目录一、ECMAScript和JavaScript关系二、let命令三、const命令四、变量的解构赋值1、数组的解构赋值2、对象的解构赋值一、ECMAScript和JavaScri...
    99+
    2024-04-02
  • typeScript入门基础介绍
    目录一、安装 TS二、Vscode 自动编译 ts三、入门 TS基础数据类型接口类TS 的特点: 始于 javaScript 归于 javaScript 。强大的类型系统。先进的 j...
    99+
    2024-04-02
  • JavaScript断言与类型守卫及联合声明超详细介绍
    目录一、TypeScript 断言1.1 类型断言1.尖括号语法2.as 语法1.2 非空断言1.3 确定赋值断言二、类型守卫2.1 in关键字2.2 typeof关键字2.3 in...
    99+
    2022-11-13
    JavaScript断言 JavaScript类型守卫 JavaScript联合声明
  • 基础知识:编程语言介绍、Python介绍
    2018年3月19日 今日学习内容: 1、编程语言的介绍 2、Python介绍 3、安装Python解释器(多版本共存) 4、运行Python解释器程序两种方式。(交互式与命令行式)(♥♥♥♥♥) 5、变量(♥♥♥♥♥) 6、数据类型的基...
    99+
    2023-01-31
    基础知识 编程语言 Python
  • Python基础语法介绍(3)
    基本概念、特性 顺序存储相同/不同类型的元素 定义:使用()将元素括起来,元素之间用“,”括开 特性:不可变,不支持添加,修改,删除等操作 查询:通过下标查询元组指定位置的元素 其他 空元组定义:non_tuple = () 只包含一...
    99+
    2023-01-31
    语法 基础 Python
  • Python基础语法介绍(1)
    环境配置 开发平台:Mac OS Version 10.13.2 开发工具安装 Python3.6.5 官网安装网址:https://www.python.org/downloads/ Pycharm 官网安装网址:http://w...
    99+
    2023-01-31
    语法 基础 Python
  • openstack-mitaka基础环境介绍
    针对openstack环境的搭建,大致涉及如下内容安全主要包括各项服务使用的密码,这里为了防止密码混乱,我建议使用同一个密码(生产环境中,不建议这么操作)主机网络配置如下图,仅供参考学习时间同步设置针对co...
    99+
    2024-04-02
  • JavaScript基础介绍与实例
    一、什么是JavaScript JavaScript是一种具有面向对象能力的、解释性的程序设计语言。更具体一点,它是基于对象和事件驱动并具有相对安全性的客户端脚本语言。因为他不需要在...
    99+
    2024-04-02
  • S3 Browser介绍、基础操作
    一、S3 Browser 8-1-15 简介 S3 Browser 8-1-15是Amazon S3的客户端应用程序,用于管理和操作Amazon S3存储桶和对象。 二、安装包 下载地址:百度网盘 请输入提取码 提取码:9acn 三、基础操...
    99+
    2023-09-04
    java 开发语言
  • Vue electron零基础使用教程
    需求:给vue项目加一个外壳(electron),顾名思义也就是使用electron应用程序运行vue项目,直接将写好上线的vue项目在线地址放入electron程序中即可 操作步骤...
    99+
    2022-11-13
    Vue electron Vue electron
  • Kotlin 基础语法详细介绍
    Kotlin 基础语法详细介绍基础语法定义包名包名的定义应当在源文件的头部package my.demoimport java.util.*// ......
    99+
    2023-05-31
    kotlin 基础语法
  • C#语言入门基础介绍
    目录一、.NET 体系结构二、Hello world三、类型和变量四、程序结构前言: C#(读作“See Sharp”)是一种新式编程语言,不仅面向对象,还类型安全。 开发人员利用 ...
    99+
    2024-04-02
  • Python基础中的元组介绍
    本篇内容主要讲解“Python基础中的元组介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python基础中的元组介绍”吧!一、概述元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作