百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

VUE路由拦截:Vue自定义全局弹窗组件

ztj100 2024-10-27 18:34 53 浏览 0 评论

点击右上方红色按钮关注“web秀”,让你真正秀起来

前言

在任何一个平台中,如果需要增加用户黏度,除了用户需要的基本内容外,用户登录注册提交信息也是非常重要的一环,可以了解用户基本信息,用户喜欢等。



抛出前后端混合开发外,vue可以轻松的实现路由拦截。Vue Router对路由集中统一管理,所以我们可以在main.js中添加如下代码,对所有路由进行拦截:

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

是不是非常便利呢?



Vue自定义全局弹窗组件

有了路由拦截,我们来撸一个全局弹窗组件login.vue

<template>
 <div v-if="visited">
 <div id="login">
 <div class="content">
 <div class="title">会员登录</div>
 <div class="item">
 <input type="text" v-model="phone" placeholder="手机号码" maxlength="11" />
 </div>
 <div class="item">
 <input type="text" v-model="smscode" placeholder="短信验证码" maxlength="4" />
 <span>
 <label>发送验证码</label>
 </span>
 </div>
 <div>
 <button class="submit" @click="submit">登录</button>
 </div>
 </div>
 </div>
 </div>
</template>

<script>
export default {
 data() {
 return {
 phone: "",
 smscode: '',
 visited: false,
 next: '' // 可以接受参数
 };
 },
 methods: {
 show() {
 this.visited = true
 },
 submit() {
 let vm = this;
 // 调用登录接口200即成功,next()渲染页面
 xxx.then(({data}) => {
 // 登录成功
 vm.next()
 });
 }
 }
};
</script>

<style lang="stylus" scoped>
@import './index.styl';
</style>

index.js

import Vue from 'vue'
import login from './login.vue'

const PopupBox = Vue.extend(login)

login.install = function (data) {
 let instance = new PopupBox({
 data
 }).$mount()

 document.body.appendChild(instance.$el)

 Vue.nextTick(() => {
 instance.show()
 })
}

export default login

然后我们就可以将其挂载到全局,main.js中

// main.js
import login from "./components/login";
Vue.prototype.$login = login.install;

后续,我们在vue页面可以直接使用this.$login(),调起登录弹框。

下面,我们对路由拦截进行处理



路由拦截,登录弹框

// routers.js
...
const routes = [
 {
 path: "/",
 name: "home",
 meta: {
 title: "首页"
 },
 component: () => import("../views/home.vue")
 },
 {
 path: "/order",
 name: "order",
 meta: {
 title: "订单列表",
 login: true
 },
 component: () => import("../views/order.vue")
 }
]
...

这里简单示例,home页面是不需要登录的,而order页面需要登录,我们在meta里面添加login字段来标识,同时去main.js路由拦截里面来判断meta.login处理。



// main.js
router.beforeEach((to, from, next) => {
 // 需要登录进行拦截
 if (to.meta.login === true) {
 // 比如这里调用一个需要登录的接口,
 xxx.then(data => {
 // 200成功表示已经登录
 next();
 }, (resp) => {
 // 错误即为未登录
 login.install({
 next: next 
 // 这里可以传任意值,在login.vue => data
 // 里面定义相同字段名字接收
 });
 })
 } else { // 不需要登录可以直接渲染页面
 next();
 }
})

这样做的本质意思就是,需要登录的页面,我们先调用一个需要登录的接口(后台配合处理,比如约定200表示已经登录,500表示未登录),如果接口返回200,可以把页面内容给用户看,否则,拦截弹出登录框,登录完成,页面给用户看。



router.beforeEach详细介绍

router.beforeEach(全局前置守卫),当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。



每个守卫方法接收三个参数:

1、to: Route: 即将要进入的目标 路由对象

2、from: Route: 当前导航正要离开的路由

3、next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

(1)next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

(2)next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

(3)next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: 'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。

(4)next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

总结

喜欢小编或者觉得小编文章对你有帮助的,可以点击一波关注哦!同时,要源码的小伙伴可以点击下方“了解更多”。

相关推荐

离谱!写了5年Vue,还不会自动化测试?

前言大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。Playwright是一个功能强大的端到...

package.json 与 package-lock.json 的关系

模块化开发在前端越来越流行,使用node和npm可以很方便的下载管理项目所需的依赖模块。package.json用来描述项目及项目所依赖的模块信息。那package-lock.json和...

Github 标星35k 的 SpringBoot整合acvtiviti开源分享,看完献上膝盖

前言activiti是目前比较流行的工作流框架,但是activiti学起来还是费劲,还是有点难度的,如何整合在线编辑器,如何和业务表单绑定,如何和系统权限绑定,这些问题都是要考虑到的,不是说纯粹的把a...

Vue3 + TypeScript 前端研发模板仓库

我们把这个Vue3+TypeScript前端研发模板仓库的初始化脚本一次性补全到可直接运行的状态,包括:完整的目录结构所有配置文件研发规范文档示例功能模块(ExampleFeature)...

Vue 2迁移Vue 3:从响应式到性能优化

小伙伴们注意啦!Vue2已经在2023年底正式停止维护,再不升级就要面临安全漏洞没人管的风险啦!而且Vue3带来的性能提升可不是一点点——渲染速度快40%,内存占用少一半,更新速度直接翻倍!还在...

VUE学习笔记:声明式渲染详解,对比WEB与VUE

声明式渲染是指使用简洁的模板语法,声明式的方式将数据渲染进DOM系统。声明式是相对于编程式而言,声明式是面向对象的,告诉框架做什么,具体操作由框架完成。编程式是面向过程思想,需要手动编写代码完成具...

苏州web前端培训班, 苏州哪里有web前端工程师培训

前端+HTML5德学习内容:第一阶段:前端页面重构:PC端网站布局、HTML5+CSS3基础项目、WebAPP页面布局;第二阶段:高级程序设计:原生交互功能开发、面向对象开发与ES5/ES6、工具库...

跟我一起开发微信小程序——扩展组件的代码提示补全

用户自定义代码块步骤:1.HBuilderX中工具栏:工具-代码块设置-vue代码块2.通过“1”步骤打开设置文件...

JimuReport 积木报表 v1.9.3发布,免费可视化报表

项目介绍积木报表JimuReport,是一款免费的数据可视化报表,含报表、大屏和仪表盘,像搭建积木一样完全在线设计!功能涵盖:数据报表、打印设计、图表报表、门户设计、大屏设计等!...

软开企服开源的无忧企业文档(V2.1.3)产品说明书

目录1....

一款面向 AI 的下一代富文本编辑器,已开源

简介AiEditor是一个面向AI的下一代富文本编辑器。开箱即用、支持所有前端框架、支持Markdown书写模式什么是AiEditor?AiEditor是一个面向AI的下一代富文本编辑...

玩转Markdown(2)——抽象语法树的提取与操纵

上一篇玩转Markdown——数据的分离存储与组件的原生渲染发布,转眼已经鸽了大半年了。最近在操纵mdast生成md文件的时候,心血来潮,把玩转Markdown(2)给补上了。...

DeepseekR1+ollama+dify1.0.0搭建企业/个人知识库(入门避坑版)

找了网上的视频和相关文档看了之后,可能由于版本不对或文档格式不对,很容易走弯路,看完这一章,可以让你少踩三天的坑。步骤和注意事项我一一列出来:1,前提条件是在你的电脑上已配置好ollama,dify1...

升级JDK17的理由,核心是降低GC时间

升级前后对比升级方法...

一个vsCode格式化插件_vscode格式化插件缩进量

ESlint...

取消回复欢迎 发表评论: