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的开发思路(注:本项目不用于实际开发, ...
随机推荐
- Mysql 清空数据后,释放硬盘文件
删除表数据后执行:optimize table [表名]
- web开发的三层架构
Web层 接收客户端发送过来的数据,然后需要将数据传递给service层 Service层 业务逻辑层:业务:比如检验用户名的是否存在,如果不存在则需要把用户的数据存储在数据库中,如果存在,给web返 ...
- C# mongodb 类库
https://github.com/mongodb/mongo-csharp-driver/downloads https://github.com/mongodb/mongo-csharp-dri ...
- 003-jdk-数据结构-HashMap、HashTable、ConcurrentHashMap、TreeMap、LinkedHashMap、Set
一.Map概述 Map:“键值”对映射的抽象接口.该映射不包括重复的键,一个键对应一个值. 1.1.HashTable[不常用] 基于“拉链法”实现的散列表. 底层数组+链表实现,无论key还是val ...
- linux安装maven及配置环境变量 配图
Maven 3.5.0 maven安装和环境变量的配置 1 下载 maven 链接:http://pan.baidu.com/s/1qXXjXfe 密码:r92r 2 解压安装包 tar zvxf a ...
- Python字符串逐字符或逐词反转方法
Python字符串逐字符或逐词反转方法 这篇文章主要介绍了Python字符串逐字符或逐词反转方法,本文对逐字符或逐词分别给出两种方法,需要的朋友可以参考下 目的 把字符串逐字符或逐词反转过来,这个蛮有 ...
- python 内置数据结构 字符串
字符串 一个个字符组成的有序的序列,是字符的集合 使用单引号,双引号,三引号引住的字符序列 字符串是不可变对象 Python3起,字符串就是Unicode类型 字符串定义 初始化 s1 = 'stri ...
- AutoHome项目的学习
1.自定义UITabBar #import <UIKit/UIKit.h> @interface XHQTabBarViewController : UITabBarController ...
- Spring Aop(十)——编程式的Pointcut
转发地址:https://www.iteye.com/blog/elim-2396526 编程式的Pointcut 除了可以通过注解和Xml配置定义Pointcut之外,其实我们还可以通过程序来定义P ...
- Scrapy框架(1)
参考博客: 10.scrapy框架简介和基础应用 Scrapy框架(1)