1.vue路由守卫

路由守卫也叫路由钩子函数,它是在路由跳转过程中调用的函数,通过路由守卫可获取路由信息和阻止路由跳转。

1.1 路由守卫三种分类

1.1.1 组件内的路由守卫

beforeRouteEnter()、beforeRouteLeave()、beforeUpdate()

 export default {name: "About",data() {return {keyword: ""}},methods: {search() {// 点击搜索按钮时,跳转到搜索页(当前页)this.$router.push("/search");// 如果当前页直接跳转当前页会报错// 原因:原路由url和新路由url完全一致,会报错,路由避免重复跳转// 解决方案:在路由跳转时传入一个参数,参数不同就不会报错this.$router.push("/search?key=" + this.keyword)}},// 在组件中有三个路由首位函数beforeRouteEnter(to, from, next) {// 在路由跳转到到这一页之前,执行这个函数console.log("路由即将进入about");// 默认,这个守卫函数会阻止路由跳转到这一页console.log(from.path, to.path);next();},beforeRouteLeave(to, from, next) {// 在路由将要从这一页离开之前,执行这个函数// 默认,这个守卫函数会阻止路由离开next(); //允许路由离开},beforeEouteUpdate(to, from, next) {// 当路由更新之前,执行这个函数,当前页跳转到当前页表示路由更新console.log("路由更新");},}
1.1.2 全局路由守卫

beforeEach()、afterEach()

全局路由守卫是通过路由配置对象router调用

// 全局路由守卫通过路由配置对象router调用
router.beforeEach(function(to, from, next) {console.log("全局守卫:路由跳转之前");next()
})
router.afterEach(function() {console.log("全局守卫:路由跳转之后");// 路由跳转后调用此函数,不需要next,无法拦截路由
})
1.1.3 单个路由守卫

beforeEnter()

单个路由守卫是在作为路由的配置对象中,只对当前路由起效

const routes = [{path: '/',name: 'home',component: HomeView,// 单个路由守卫写在路由的配置对象中,只能对当前路由起效,是对象中函数beforeEnter: (to, from, next) => {console.log("主页守卫:", from.path, to.path);next()}}
]

1.2 路由守卫的参数

  • to:表示路由跳转的目标信息对象(到哪儿去)
  • from:表示路由跳转的来源信息对象(从哪儿来)
  • next:回调函数,表示是否允许路由跳转,调用允许,不调用则禁止

1.3 路由守卫的使用场景

  • beforeRouteEnter、beforeRouteLeave、beforeEach 这三个都是路由进入之前的守卫,这些路由守卫常用于做登录认证,在这里判断用户是否已经登录,如果已经登陆,调用next()允许进入,如果没有登录,不调用next(),禁止进入,主要针对一些需要登陆状态才能访问的 页面,如:个人信息页
  • beforeRouteLeave 是路由离开之前的守卫,在一些表单页面,在这个函数中提示,离开页面,填写的表单信息会丢失,如:在线测试页面,测试提交之前,不允许离开这一页
  • beforeUpdate 是路由更新时调用的钩子函数,当路由路径来源和目标相同(当前页跳转当前页),并且参数不同时,会调用这个钩子,常用于搜索页,当搜索关键字改变时,在这里更新数据。

1.4 使用路由守卫注意问题

1.4.1 由于在任何组件中都能使用this.$router,所以全局路由守卫可以在任意组件中调用
1.4.2 brforeRouteEnter路由进入之前,组件还未创建,打印this是undefined,如果想用组件对象,可以在next()的回调中拿到组件对象

next( vm=>{ console.log(vm) })

1.4.3 this.router和this.router和this.router和this.route的区别
  • this.$router是/src/router/index.js中创建的路由对象,全局唯一,用于编导式导航跳转和全局路由守卫
  • this.route是路由跳转的信息对象,每一个路由对应一个route是路由跳转的信息对象,每一个路由对应一个route是路由跳转的信息对象,每一个路由对应一个route对象,用于路由传值和路由监听
1.4.4 路由监听和路由守卫的区别
  • 路由监听:在组件中watch字段中监听$route,实现路由监听,只能监听路有变化,不能修改路由和限制路由跳转
  • 路由守卫:使用路由钩子函数实现守卫,路由不知可以监听路由,还能控制路由跳转
1.4.5 当路由跳转时,跳转的路径和参数与当前完全一致,没有变化,不会调用路由钩子函数,会报错

报错:NavigationDuplicated: Avoided redundant navigation to current location: “/about?page=5”.

报错原因:原路由url和新路由url完全一致,会报错,路由避免重复跳转

解决方案1:在/src/router/index.js中添加如下代码:原理是捕获push函数报错,不抛出错误

const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {return originalPush.call(this, location).catch(err => {//throw(err) // 抛出错误,控制台会显示错误信息, 如果不抛出,控制台不会报错return err;})
}

解决方案2:在路由跳转时传入一个参数,参数不同就不会报错

this.$router.push("/search?key=" + this.keyword)

2.vue-ajax请求

在vue项目中不能直接发送ajax请求,会被同源请求策略拦截,需要使用跨域代理器

2.1 代理服务器配置

ajax请求需要跨域的话,需要在vue.config.js中添加代理配置。以下是脚手架5.x版本的配置代码:

onst { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,publicPath: '/',    // 启动页地址outputDir: 'dist', // 打包的目录lintOnSave: true, // 在保存时校验格式productionSourceMap: false, // 生产环境是否生成 SourceMapdevServer: {open: true,host: 'localhost',port: 8080,proxy: {"/myDouyu": {target: "http://open.douyucdn.cn",changeOrigin: true,pathRewrite: {"^/myDouyu": ""}}}}
})
  • 在vue.config.js中的devServer.proxy字段代理服务器
  • 这个文件是服务器的配置对象,所以这个文件的修改需要重启项目生效

2.2 fetch请求方式

在组件中的created钩子函数中使用ajax请求。

<script>export default {name: 'HomeView',created() {fetch("/myDouyu/api/RoomApi/live?page=1").then(res => {res.json().then(res => {console.log(res.data);})})},}
</script>

2.3 axios请求

2.3.1 局部使用axios请求
2.3.1.1 安装axios模块

cnpm i axios --save

2.3.1.2 在组件的script标签中导入axios

import axios from ‘axios’;

2.3.1.3 在当前组件的函数发起ajax请求

            axios.get("/myDouyu/api/RoomApi/live", {params: {page: 1}}).then(res => {console.log(res.data);})
2.3.2 全局使用axios请求
2.3.2.1 安装axios模块

cnpm i axios --save

2.3.2.2 在main.js中导入axios并设置Vue原型

import axios from ‘axios’;
Vue.prototype.$axios = axios;

2.3.2.3 在任意组件中使用axios(添加$用于和组件内字段区分)
            this.$axios.get("/myDouyu/api/RoomApi/live", {params: {page: 1}}).then(res => {console.log(res.data.data);})

3.vue中的props自定义属性

props属性验证写法,props的值是一个对象,对象中的键是属性名,值是属性的限制条件。组件标签自定义属性传值时要根据属性验证的数据类型传值,不然会报错。

export default {name: 'HelloWorld',props: {msg: String}
}

vue路由守卫、vue-ajax请求相关推荐

  1. VUE路由守卫_前端实现权限验证

    VUE路由守卫_权限验证 引言: 本文在利用SpringBoot和Vue实现前后端分离一文的基础上追加的路由守卫:未登录时会限制访问某些页面(前台控制),与之前的Shiro不同: 文章目录 VUE路由 ...

  2. reactrouter4路由钩子_react router @4 和 vue路由 详解(八)vue路由守卫

    13.vue路由守卫 a.beforeEach 全局守卫 (每个路由调用前都会触发,根据from和to来判断是哪个路由触发) const router = new VueRouter({ ... }) ...

  3. vue路由守卫死循环及next原理解释

    ​ 在使用vue路由守卫的beforeEach方法时可能会出现无限递归,也就是死循环的问题,根本原因在于next()方法在不合适的地方错误调用所致,先来看一下官方对next()方法的解释: befor ...

  4. Vue路由守卫(导航守卫)及使用场景

    目录 前言 一.路由守卫是什么? 二.路由守卫全解析 先来看一下钩子函数执行后输出的顺序吧 1.全局路由守卫 2.组件路由守卫 3.路由独享守卫 单独介绍一下路由守卫钩子三个参数 前言 最近在学习vu ...

  5. vue路由守卫中next方法的理解

    vue路由守卫中next方法的理解 在网上看到了一篇通俗易懂的文章,此文章出处 在这里我用通俗点的说法解释上next(),next(false),next('/'),next(error),希望通过这 ...

  6. Vue之axios发送Ajax请求

    2.10 axios发送ajax请求 axios github 2.10.1 准备工程 创建一个django工程,例如 login.创建完成之后,再创建一个子应用,例如users.最后再设置一下模板文 ...

  7. 路由守卫-vue切换路由登录判断、条件判断

    在vue项目中,切换路由时肯定会碰到需要登录的路由,其原理就是在切换路径之前进行判断,你不可能进入页面再去判断有无登录重新定向到login,那样的话会导致页面已经渲染以及它的各种请求已经发出. 一.如 ...

  8. vue路由守卫实现登录状态管理

    有了这段代码,再也不用担心每进入一个页面发送一次checkLogin请求验证了 过多的名词等下次再来解释 看下面两部分: 1.路由文件 // 登陆页面不需要检测状态,所以不需要守卫// login{p ...

  9. vue路由守卫,axios拦截器,权限树

    K15项目案例-后台 1.分页问题 关于分页表格列中的序号问题: <el-table-column type="selection" label="序号" ...

  10. Vue如何mock数据模拟Ajax请求

    我们在做一个项目时前期可能没有后端提供接口模拟数据,那么作为前端就需要自己写json文件模拟数据加载.网上往往参考的都是不全面的,比如get请求没问题但是post请求就报错了.在Vue中只需要vue- ...

最新文章

  1. 浏览器安全检查己通过_百度主动推送三项合一功能
  2. 安卓 画板 学习笔记
  3. angular 触发 enter事件
  4. 以远程桌面访问Windows Azure虚拟机(转+译)
  5. python performance measure 01
  6. GridView列表数据的添加
  7. pytorch 笔记: 扩展torch.autograd
  8. ivona tts语音合成引擎_耳听也不一定为实,AI语音已能骗得百万巨款
  9. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务
  10. 【Postgresql】pg掉电后无法重启
  11. 双线性插值算法实现和opencv、matlab结果不一致问题
  12. 发牌游戏 java_解析扑克牌游戏发牌算法——java实现
  13. android动画源码合集、动态主题框架、社交app源码等
  14. C++与C调用so文件
  15. python图像边缘检测_Python进行图片水平边缘检测prewitt算子法
  16. 程序员转行做运营,曾被逼得每天想离职,最后...
  17. windows 用choco 安装nvm
  18. python在电力系统中的应用_SKIDL: 在PYTHON中描述你的电路
  19. 万豪酒店品牌进驻江苏盐城,持续华东区拓展
  20. 读书笔记 - 多智能体强化学习在城市交通网络信号的综述2018

热门文章

  1. 2013-06-16 读书笔记 大前研一 《无国界的世界》
  2. 【表格】从1G到5G的移动通信发展历程(精简版)
  3. 1597: [Usaco2008 Mar]土地购买
  4. c51中的_crol_和_cror_
  5. 路飞学城Python-Day37(practise)
  6. 89c51c语言程序,AT89C51单片机流水灯c语言程序及详解
  7. CTF_ctfshow_meng新_web1-web24
  8. 决策树原理及numpy实现版
  9. 与机器对话,阿里达摩院挑战新一代人机对话技术
  10. 试用bus hound来分析STM32CubeMX来生成USB_HID_Mouse工程