路由拦截.gif

假设有这样的需求,点击这个“私密”,进不去这个组件页,Vue-router会进行拦截,然后弹窗提示信息。

这种情况,方案有好几种:全局守卫、路由独享守卫、组件内守卫均可实现

// router.js

const routes = [

{

path: "/protect",

name: "protect",

component: Protect

];

比如使用组件内守卫:

// Protect.vue

beforeRouteEnter (to, from, next) {

if (to.name === "protect") {

window.alert("请先登录");

next(false); // 禁止进入

}

},

但是, 某天我觉得浏览器的原生弹窗太丑了,我想自定义一个弹窗,不用window.alert()

于是开开心心的去自行封装一个弹窗组件了(过程先忽略)

投入使用:

// Protect.vue

export default {

data() {

return {

isShow: false // 用作判断是否显示弹窗

}

}

}

beforeRouteEnter (to, from, next) {

if (to.name === "protect") {

this.isShow = true; // 此时想让弹窗显示

next(false);

} else {

next();

}

},

结果报错。。

查了下文档,原来,在beforeRouterEnter 之前,此时的 this 是 undefined,并不是Vue实例对象。。因为当守卫执行前,组件实例还没被创建;

但是可以通过 next 传入回调函数获取到 Vue 组件实例

beforeRouteEnter (to, from, next) {

if (to.name === "protect") {

console.log(this); // undefined

next(vm => {

console.log(vm); // Vue 组件实例

vm.isShow = true;

});

}

},

但是,next()传入了回调函数,就不能传false进行拦截了。。。

next(vm => { // 传入回调函数

console.log(vm); // Vue 组件实例

vm.isShow = true;

});

next(false); // 无效了

解决方法:

利用 Vue.extend() 构造出一个实例,然后手动挂载

先把刚刚封装的弹窗组件放到一个Modal(名字随便)文件夹下,里面再创建文件index.js

// Modal/index.js

import Vue from 'vue';

import MyModal from './MyModal.vue';

const MyAlert = Vue.extend(MyModal); // 使用基础 Vue 构造器,创建一个“子类”

// 因为 MyAlert 是一个对象,若要把它当做插件使用,必须提供 install 方法

MyAlert.install = (data) => {

const ins = new MyAlert({

data,

}).$mount(); // 创建一个实例,并手动挂载

document.body.appendChild(ins.$el); // 把真实的DOM加到页面上

}

export default MyAlert;

然后到 main.js 中导入路由和这个插件即可食用了

// main.js

import router from './router';

import MyAlert from './Modal';

router.beforeEach((to, from, next) => {

if (to.name === "protect") {

MyAlert.install({

isShow: true // 这里传入的参数就是刚刚封装的MyModal里面的data参数

})

next(false);

} else {

next();

}

})

但是还是有问题,因为当挂在完成的时候,还没有把DOM添加到页面上,所以无法使用 进入时候的过渡动画,因为当挂载结束,过渡动画也结束了。此时还没有添加到页面。。

vue阻止弹窗_Vue,路由拦截,弹窗提示相关推荐

  1. vue 定义全局弹框_VUE路由拦截:Vue自定义全局弹窗组件

    前言 在任何一个平台中,如果需要增加用户黏度,除了用户需要的基本内容外,用户登录注册提交信息也是非常重要的一环,可以了解用户基本信息,用户喜欢等. 抛出前后端混合开发外,vue可以轻松的实现路由拦截. ...

  2. 阻止路由跳转得方式_vue路由拦截及页面跳转的设置方法

    路由设置:router/index.js main.js: { if (to.matched.some(res => res.meta.requireAuth)) { // 验证是否需要登陆 i ...

  3. 阻止路由跳转得方式_vue路由拦截及页面跳转设置的方法介绍

    这篇文章主要介绍了vue路由拦截及页面跳转的设置方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 路由设置:router/index.jsexport default new Router ...

  4. hach vue 跳转_Vue路由实现、路由导航、路由模式

    1.$router和$route区别 router为VueRouter的实例,相当于一个全局的路由器对象,里面含有很多属性和子对象,例如history对象,和router-link跳转一样,this. ...

  5. vue阻止默认_vue中,阻止默认事件

    用vue的写法就是: id="freeinput" :rows="6" placeholder="请输入自由条件内容(json格式)" @f ...

  6. vue 一直登录错误_vue中路由拦截无限循环的情况

    如下图,浏览器报出这个错误 这是因为路由守卫在拦截路由的时候,找不到跳转的地址,引起了无限循环. 在设置路由拦截的时候当指向另一个地址的时候还会触发一次路由拦截,既每次地址栏的变化都会触发一次路由拦截 ...

  7. vue面向切面_vue:在路由跳转中使用拦截器

    1:首先在路由对象中的某一个具体的路由对象加这样一个属性 meta: {  requireAuth:true  } 2:然后在main.js中添加这段代码 router.beforeEach((to, ...

  8. vue离开当前路由销毁当前路由_VUE 离开页面路由拦截

    业务场景 在页面内容被编辑后,用户跳转其他路由,需要提示用户:当前页面有改动,确认离开后再进行跳转,以防编辑数据丢失. 代码 beforeRouteLeave (to, from, next) { t ...

  9. 四十、Vue项目上手 | 用户管理系统 实现弹窗,搜索和详细页功能(下篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

最新文章

  1. Twitter 禁止未经用户同意分享照片和视频
  2. mysql启动warning: World-writable config file
  3. 每天一个linux命令(53)--ps命令
  4. TZOJ--1518: 星星点点 (二进制模拟)
  5. Vue学习心得记录之模板语法
  6. 月费10元起!中国移动推年轻人的第一张5G元素电话卡
  7. JAVA IO 以及 NIO 理解
  8. python elseif用法_Python关键字简介
  9. 斗地主服务器维护中,天天斗地主游戏问题解决方法
  10. 【Web前端】怎样用记事本写一个简单的网页-html
  11. mysql删除视图sql语句_删除视图的sql语句是什么
  12. ENVI监督分类图像分割
  13. word文档中在文字的右上角加标注快捷键
  14. 怎么将抖音上的多个视频合成一个视频
  15. 【2018年11月12日】其他化学制品行业的股票估值和排名
  16. Playframework介绍
  17. cdr 表格自动填充文字_长期伏案于表格,查看数据时你需要一个聚光灯效果
  18. 全球及中国便携式医用制氧机行业研究及十四五规划分析报告
  19. 2021无人配送三大场景之争
  20. python最小二乘法拟合圆_最小二乘法拟合圆

热门文章

  1. 在DLAP221上部署容器进行推理操作
  2. 自制蓝牙音响(小白零基础秒会)
  3. 微信小程序的基础知识点汇总
  4. xls所在服务器没有响应,服务器里面的excel表格打不开是怎么回事?!excle表格打不开怎么回事...
  5. mxGraph进阶(一)mxGraph教程-开发入门指南
  6. 几种常见的搜索引擎检索模型
  7. matlab中感应电机用哪种,基于MATLAB软件的感应电机3种非线性控制方法的比较
  8. 发布一个网站要多长时间?
  9. GitHub 项目被爆 刷 Star!阿里这波又摊上事了...
  10. 随机猜数~ 1-100以内 调用rand()函数