vue-动态路由+动态组件+动态页面
动态路由
- 路由组件是vue-router
- 动态路由即从后端请求路由信息,然后转化生成路由信息。所以这里的关键是不会提前知道什么菜单对应什么组件,因此路由声明的时候不再是写死的组件,而是可替换的动态路径。相关的功能就是路由懒加载,以及异步组件
- 具体过程就是导航守卫的前置守卫中,根据是否登录来判断是否请求用户信息以及路由信息,再将请求的路由信息转化成路由,最后添加到路由表
router.beforeEach((to, from, next) => {
if (store.getters.roles.length === 0) {
// 判断当前用户是否已拉取完user_info信息,得到用户信息后立即请求路由信息
store
.dispatch('GetUserInfo')
.then(res => {
// 拉取user_info
const roles = res.data.Data.Roles // note: roles must be a array! such as: ['editor','develop']
store
.dispatch('GenerateRoutes', {
roles
})
.then(() => {
// 执行GenerateRoutes动作后,store.getters.addRouters得到的就是内置的路由以及请求的路由的集合
router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
next({
...to,
replace: true
}) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
})
})
.catch(err => {
store.dispatch('FedLogOut').then(() => {
Message.error(err || 'Verification failed, please login again')
next({
path: '/'
})
})
})
} else {
// 在这里省略了根据当前用户角色判断是否有权限访问即将跳转的路由
next()
}
})
- 多级菜单
function formatRoutes(routes) {
const fmRoutes = []
routes.forEach(router => {
const component = router.component
router.component = resolve => {
require(['@/' + component + '.vue'], resolve)
}
} else if (router.template) {
router.component = resolve => {
resolve({
template: router.template
})
}
let children = router.children
if (children && children instanceof Array) {
children = formatRoutes(children)
}
router.children = children
fmRoutes.push(router)
})
return fmRoutes
}
动态加载组件
- 分析一下,千万不要全部都写变量,比如
require([component], resolve)
,这样 webpack 不知道你的组件会是什么也不知道位置,所以不会编译也不会匹配该组件。注意到没,一个是编译一个是匹配。像上面的写法,组件不会被编译,更别提匹配了。即使假设某组件被编译进去了,在这里单单用变量也是匹配不到的,因为路径的问题。即根据 component 的路径,匹配不到已编译的组件,因为匹配期间不会再计算代码所在文件路径相对 component 的路径。比如 component 的值分别为@/views/index.vue
、../views/index.vue
、./views/index.vue
,运行期间这些直接拿去跟已注册组件匹配,并不会再次计算真实路径 - 看不懂上面也没关系,没经历过确实不太容易理解。经过上面的解释再理解下面写法就 ok 了,把下面的写法看成常规的
require(['@/views/index.vue'], resolve)
没毛病吧,再换成下面写法,webpack 知道组件位于@/views/
,组件后缀名.vue
,该文件夹的 vue 文件统统编译,变的只有中间部分路径
router.component = resolve => {
require(['@/views/' + component + '.vue'], resolve)
}
动态生成页面
- 动态生成页面是指一个路由对应的组件如果存在则加载,不存在则用 template 赋值一个默认页面
- 此功能可用于大量结构类似的页面,比如很多菜单对应的都是表格页,常见于中后台管理系统。因为会先尝试加载默认路径,不存在才使用默认页,所以个别页面只需要在默认路径放置组件即可覆盖默认页面
if (router.component) {
const component = router.component
router.component = resolve => {
require(['@/' + component + '.vue'], resolve)
}
} else if (router.template) {
router.component = resolve => {
resolve({
template: router.template
})
}
} else {
// 如果没有指定component路径并且没有设置template,尝试加载默认路径位置组件或用默认页面
const component = `${router.name}/index`
router.component = async resolve => {
try {
// 尝试加载模块
await require(['@/views/' + component + '.vue'], resolve)
} catch {
// 加载失败,不存在此模块,使用默认模板
console.log('@/views/' + component + '.vue不存在,加载默认模板')
resolve({
template: `<table-base table-name="${router.name}" />`
})
}
}
}
vue-动态路由+动态组件+动态页面的更多相关文章
- Vue 实现动态路由及登录&404页面跳转控制&页面刷新空白解决方案
Vue实现动态路由及登录&404页面跳转控制&页面刷新空白解决方案 by:授客 QQ:1033553122 开发环境 Win 10 Vue 2.9.6 node-v ...
- vue的动态路由(登录之后拿到动态路由通过addRouters()动态添加路由)
登录后我们拿到路由动态路由,后端传的数据可能为这个 { path: '/index', meta: { title: '首页', icon: 'icon-shouye', tab_index: , / ...
- vue-cli3使用vue-router 使用动态路由,在刷新页面时报错
刚发现的一个问题,在使用vue-cli3创建项目之后,使用动=动态路由,demo: { path: '/aa/:id', name: 'aa', component: aa }, 编程式路由: thi ...
- vue刷新路由,不刷新页面
1.路由介绍 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来 ...
- react动态路由以及获取动态路由
业务中会遇到点击列表跳转到详情页, 1.在index.js修改我们的跟组件 新建router2的文件 import React from 'react' import { HashRouter as ...
- vue通过路由传值及在页面刷新后如何保存值
1.普通的路由跳转 方式一:通过routerLinkTo方式,转为a标签的跳转,to里面相当于a标签的href路径 如下: 方式二:通过this.$router.push方式: 如下: 2.带参数的路 ...
- Vue下路由History mode导致页面无法渲染的原因
用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件( ...
- vue中路由返回上一个页面,恢复到上一个页面的滚动位置
第一步:路由文件的配置(对你所需要的vue文件进行保存缓存标志的添加) import Vue from 'vue' import Router from 'vue-router' import Hel ...
- vue 多级路由嵌套后打开页面是空白
在多层路由嵌套时,一级子目录必须有一个页面并且添加一具<router-view>,否则路由跳转页面为空,没有任何显示 来自为知笔记(Wiz)
- 使用VUE开发用户后台时的动态路由问题、按钮权限问题以及其他页面处理问题
如今前后端分离是大势所趋,笔者虽然是做后台的,但也不得不学学前端的流行框架VUE -_-||| . 为了学习VUE,笔者搭建了一个简单的用户后台,以此来了解VUE的开发思路(注:本项目不用于实际开发, ...
随机推荐
- 在HTML中直接使用onclick很不专业
原因 1.onclick添加的事件处理函数是在全局环境下执行的,这污染了全局环境,很容易产生意料不到的后果: 2.给很多DOM元素添加onclick事件,可能会影响网页的性能,毕竟网页需要的事件处理函 ...
- HttpServletRequest&HttpServletResponse对象
HttpServletRequest&HttpServletResponse对象不是由我们来创建的,而是由tomcat服务器创建,那么我们就可以直接来使用这两个 对象 A: HttpServl ...
- ehcache快速入门
前言 JAVA缓存实现方案有很多,最基本的自己使用Map去构建缓存,或者使用memcached或Redis,但是上述两种缓存框架都要搭建服务器,而Map自行构建的缓存可能没有很高的使用效率,那么我们可 ...
- 关于对VGA、DVI、HDMI的区别
VGA接口: DVI接口: HDMI接口 可以这么理解: 1. VGA传输普通视频信号,DVI传输高清视频信号,HDMI传输高清视频信号并支持音频传输.2. HDMI的三种接口只有大小区别,功能没有任 ...
- Java操作excel_导出与读取(导入)
我自己的jar包下载 一.介绍 常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中,很多时候需要实现导入.导 ...
- unity读取灰度图生成三维地形mesh
准备灰度图 IGray.png及草地贴图 IGrass.jpg ,放入Assets下StreamingAssets文件夹中. 创建空材质,用作参数传入脚本. 脚本如下,挂载并传入材质球即可 ...
- JAVA数据结构和算法 2-数组
数组中使用的主要算法:插入.查找(线性查找-无序/二分查找-有序).删除 在JAVA中数组属于对象类型: 1.创建方法有3种: 或者 数组一旦创建,大小不可改变.数组大小可以通过length字段获得: ...
- python3 正则表达式 re模块之辣眼睛 计算器
额...学到几个常用模块了,也要其中考试了,每天晚上敲一点,敲得脑壳疼,不过又想到好一点的办法了,有时间再改吧. 此非吾所欲也,实属无奈也....复习之路漫漫,吾将到书上求索,在此不多逗留,我挥一挥衣 ...
- 【Qt开发】Qt5 中对 C++11 一些新特性的封装
C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...
- 【DSP开发】CMD文件
DSP的存储器的地址范围,CMD是主要是根据那个来编的. CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间. 所以不同的芯片就有不同大小的rom和ram.放用户程序的地方 ...