-
2022-05-18 22:36:51
1、什么是动态路由?
2、动态路由的好处
3、动态路由如何实现1、什么是动态路由?
动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现及页面的渲染。动态的路由存储可分为两种,一种是将路由存储到前端。另一种则是将路由存储到数据库。动态路由的使用一般结合角色权限控制一起使用。
总结:1)路由可变,不是写死的,动态加载 2)存储分两种:存前端,存数据库
2、动态路由的好处
使用动态路由可以跟灵活,无需手工维护,我们可以使用一个页面对路由进行维护。如果将路由存储到数据库,还可以增加安全性。
总结:1)灵活,无需手工维护 2)增加安全性
3、动态路由如何实现
在此以路由存储在数据库为例
流程:一般我们在登录的时候,根据登录用户的角色返回此角色可以访问的页面的路由,前端将路由存储到vuex(vuex存储的数据必须可持久的,不要一刷新页面就不见),我们在路由前置守卫处动态添加拿到的路由,对页面进行渲染。1)此为我的router目录,index.js对路由添加,守卫拦截等处理。static-route.js为前端定义的静态路由,不需要动态加载的,如登陆页面,忘记密码页面,404页面等。
index.js
import Vue from 'vue' import $cookies from 'vue-cookies' import VueRouter from 'vue-router' import store from '../store' import staticRoute from './static-route.js' Vue.use(VueRouter) const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes: staticRoute //staticRoute为静态路由,不需动态添加 }) let isToken = true router.beforeEach(async (to, from, next) => { //定义isToken为true和vuex不为空时添加路由 if (isToken && store.state.routers.routers.length != 0) { //从vuex中获取动态路由 const accessRouteses = await store.state.routers.routers; //动态路由循环解析和添加 accessRouteses.forEach(v => { v.children = routerChildren(v.children); v.component = routerCom(v.component); router.addRoute(v); //添加 }) isToken = false //将isToken赋为 false ,否则会一直循环,崩溃 next({ ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次) replace: true, // 重进一次, 不保留重复历史 }) } else { if (to.name == null) { next("/404") } else { if (to.meta.title) { //判断是否有标题 document.title = to.meta.title //给相应页面添加标题 } next() } } }) function routerCom(path) { //对路由的component解析 return (resolve) => require([`@/views/${path}`], resolve); } function routerChildren(children) { //对子路由的component解析 children.forEach(v => { v.component = routerCom(v.component); if (v.children != undefined) { v.children = routerChildren(v.children) } }) return children } export default router
2)登陆成功后将获取到的动态路由存储到vuex
vuex—>index.jsimport Vue from 'vue' import Vuex from 'vuex' //数据持久化 import createPersistedState from "vuex-persistedstate"; Vue.use(Vuex) const routers = { namespaced: true, state: () => ({ routers:"", }), mutations: { routers(state, newsdata) { state.routers = newsdata }, }, actions: { routers(context) { context.commit('routers') }, }, getters: { routers(state) { console.log("getters", state) return state.routers }, } } const store = new Vuex.Store({ modules: { routers: routers, }, // 数据持久化 plugins: [createPersistedState({ //key是存储数据的键名 key: 'routersData', //paths是存储state中的那些数据,如果是模块下具体的数据需要加上模块名称,如user.token paths: ["routers.routers"] })] }) export default store
我的动态路由模板
//动态路由 const dynamicRoute = [{ "path": "/main", "name": "main", "redirect": "/main/index", "component": "main/main.vue", "children": [{ "path": "index", "name": "index", "component": "index/index.vue", "meta": { "name": "index", "title": "首页", "icon": "el-icon-location", "menu":true //true为菜单栏 } }, { "path": "Configuration", "name": "Configuration", "redirect": "Configuration/route", "component": "Configuration/index.vue", "roles": ['developer', "admin"], // developer、admin角色的用户才能访问该页面 "meta": { "title": "配置", "icon": "el-icon-location", "menu":true }, "children": [{ "path": "route", "name": "route", "component": "Configuration/route/index.vue", "meta": { "title": "菜单", "icon": "", "menu":true }, }, { "path": "user", "name": "user", "component": "Configuration/user/index.vue", "meta": { "title": "用户管理", "icon": "el-icon-location", "menu":true }, }, { "path": "admin", "name": "admin", "component": "Configuration/admin/index.vue", "meta": { "title": "管理员管理", "icon": "", "menu":true }, }, { "path": "userEdit", "name": "userEdit", "component": "Configuration/user/user-Edit.vue", "meta": { "title": "编辑用户", "icon": "", "menu":false }, }, ] }, { "path": "check", "name": "check", "redirect": "check/user", "component": "check/index.vue", "roles": ['developer', "admin", "check"], // developer、admin角色的用户才能访问该页面 "meta": { "title": "审核", "icon": "el-icon-location", "menu":true }, "children": [{ "path": "user", "name": "checkUser", "component": "check/check-user/index.vue", "meta": { "title": "用户实名审核", "icon": "el-icon-location", "menu":true } }, { "path": "enterprise", "name": "checkEnterprise", "component": "check/check-enterprise/index.vue", "meta": { "title": "企业认证审核", "icon": "el-icon-location", "menu":true }, }, { "path": "checkNormImage", "name": "checkNormImage", "component": "check/check-norm-image/index.vue", "meta": { "title": "标准照认证审核", "icon": "el-icon-location", "menu":true }, }, { "path": "checkHiringJobs", "name": "checkHiringJobs", "component": "check/check-hiring-Jobs/index.vue", "meta": { "title": "求职、招聘认证审核", "icon": "el-icon-location", "menu":true }, } ] } ] }, ] export default dynamicRoute
路由管理界面(可能有不完善的地方)
讲一讲遇到的坑及注意点-
“component”: “check/check-norm-image/index.vue”, 用字符串再在解析,不要像静态路由一样。否则第一次进去可以,刷新就变空白
-
此处为重要的一点,直接用next()不行
next({ ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次) replace: true, // 重进一次, 不保留重复历史 })
3)由于添加完路由还会重复执行一遍路由守卫,所有必须确保不要一直死循环添加路由。否则直接崩溃。这里我用的是isToken变量确保不循环。
分享:
走进了一间屋子,如果你是最牛的人,那么你就走错了地方。 我的理解:你将没有进步的空间,止步于此。
更多相关内容 -
-
vue用addRoutes实现动态路由的示例
2021-01-19 17:17:13之前在基于Vue实现后台系统权限控制一文中提到路由权限的实现思路,因为不喜欢在每次路由跳转的before钩子里做判断,所以在初始化Vue...用动态路由实现路由权限控制貌似是一个完美的方案,初始路由只有登录和404,登录 -
简述动态路由协议OSPF的特点及工作原理
2021-01-19 22:14:08根据是否在一个自治域内部使用,动态路由协议分为内部网关协议(IGP)和外部网关协议(EGP)。这里的自治域指一个具有统一管理机构、统一路由策略的网络。自治域内部采用的路由选择协议称为内部网关协议,常用的有... -
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2020-10-17 09:18:07主要介绍了vue动态添加路由addRoutes之不能将动态路由存入缓存的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
iView-admin 动态路由问题的解决方法
2020-10-17 22:04:14主要介绍了iView-admin 动态路由问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
思科模拟器上配置动态路由RIP的图文教程
2020-10-01 08:03:59在思科模拟器上怎么配置动态路由RIP?动态路由会自主选择最佳路径的,不像静态路由某个节点瘫痪了,整个网络就都瘫痪了,下面我们来看看思科模拟器上配置动态路由RIP的图文教程 -
ospf动态路由配置
2018-03-10 19:57:24利用三层交换机和ospf协议来实现实现动态路由。有完整的拓扑图和命令 -
Vue Router 实现动态路由和常见问题及解决方法
2021-01-21 11:08:38个人理解:动态路由不同于常见的静态路由,可以根据不同的「因素」而改变站点路由列表。常见的动态路由大都是用来实现:多用户权限系统不同用户展示不同导航菜单。 如何利用Vue Router 实现动态路由 Vue项目实现动态... -
策略路由、直连路由、默认路由、动态路由.pdf
2019-08-26 14:09:09最全网络路由学习手册,建议网络初级工程师下载使用 -
95 – 在Flask中如何使用动态路由
2020-12-21 18:04:081. 静态路由和动态路由有什么区别? 路由 Utl Path http://loaclhost/abc/test.html 静态路由 Path与路由函数一一对应 动态路由 多个Path与同一个路由函数对应 http://loaclhost/abc/test.html ... -
vue3.0+element-plus实现国际化语言,动态路由菜单demo
2022-01-27 10:56:54vue3.0+element-plus实现国际化语言,动态路由菜单demo -
vue router动态路由设置参数可选问题
2020-10-16 13:26:24主要介绍了vue-router动态路由设置参数可选,文中给大家提到了vue-router 动态添加 路由的方法,需要的朋友可以参考下 -
文字加代码搞懂vue中动态路由和嵌套路由区别
2021-01-08 09:57:34文章目录一、动态路由和嵌套路由区别二、代码实现过程动态路由嵌套路由三、总结 一、动态路由和嵌套路由区别 先看实现效果 区别: 形式来看:动态路由url中path有一个/,嵌套路由url中path有两个/ 本质上看:动态... -
vue自定义指令和动态路由实现权限控制
2020-11-19 16:19:54在Vue-element-admin模板项目的src/permission.js文件中,给出了路由守卫、加载动态路由的实现方案,在实现了基于不同角色加载动态路由的功能。我们只需要稍作改动,就能将基于角色加载路由改造为基于权限加载路由。... -
cisco packet tracer静态路由与动态路由配置教程
2019-05-09 08:06:30本人计算机网络课程的实验,兴许对大家有帮助,内含实验报告一份,还有Cisco的工程文件,静态路由和动态路由都以配置好。 -
三层交换机动态路由配置rip
2018-03-10 16:49:30利用三层交换机实现rip动态路由配置。有详细的拓扑图和命令 -
动态路由
2021-03-21 14:07:11动态路由一、动态路由1.什么是动态路由2.动态路由的特点3.动态路由协议阐述4.度量值5.收敛6.静态路由与动态路由的区别7.按照路由的算法分类二、RIP1.什么是RIP2.RIP的基本概念3.路由环路4.解决路由环路发生的方法5....动态路由
一、动态路由
1.什么是动态路由
动态路由指路由器能够自动地建立自己的路由表,并且能够根据实际情况的变化适时地进行调整。动态路由器上的路由表项是通过相互连接的路由器之间交换彼此信息,然后按照一定的算法优化出来;路由信息在一定时间间隙里不断更新,以适应不断变化的网络,以随时获得最优的寻路效果。
2.动态路由的特点
减少了管理任务
占用了网络带宽3.动态路由协议阐述
路由器之间路由交换信息的语言
4.度量值
跳数,带宽,负载,时延,可靠性,成本
路由器会通过度量值来确定最优的路由路径5.收敛
使所有路由表都达到一致状态的过程
6.静态路由与动态路由的区别
静态路由:是指由网络管理员手工配置的路由信息。当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息。
动态路由:是指路由器能够自动地建立自己的路由表,并且能够根据实际实际情况的变化适时地进行调整。动态路由机制的运作依赖路由器的两个基本功能:对路由表的维护;路由器之间适时的路由信息交换。7.按照路由的算法分类
二、RIP
1.什么是RIP
路由选择信息协议(英语:Routing Information Protocol,缩写:RIP)是一种使用最广泛的内部网关协议(IGP),属于网络层,一种在网关与主机之间交换路由选择信息的标准。
它可以通过不断的交换信息让路由器动态的适应网络连接的变化,这些信息包括每个路由器可以到达哪些网络,这些网络有多远等。
2.RIP的基本概念
RIP度量值为跳数
最大跳数为15跳,16跳不可达
RIP更新时间
RIP每30s更新一次,UDP520端口
RIP路由更新消息
发送整个路由表信息3.路由环路
4.解决路由环路发生的方法
5.RIP v1和RIP v2的区别
-
动态路由实验.zip
2019-10-20 18:26:06动态路由实验,清华大学动态路由实验课件报告 -
实验静态路由和动态路由_路由_静态路由和动态路由_
2021-10-01 09:12:57计算机网络的实验报告:静态路由和动态路由。。。。。 -
静态路由和动态路由同时存在,怎么配置
2014-12-16 12:53:03静态路由和动态路由同时存在,怎么使用动态路由和静态路由同时在一个路由上配置。 -
iOS 动态路由实现方案
2022-04-12 16:33:58动态路由的价值 基于CNRouter URL跳转,我们又实现了动态路由功能,它的职责主要有: 承担 App 内所有页面跳转逻辑 通过Apollo配置,支持获取/配置路由替换规则 匹配所有的路由跳转规则,命中路由规则的直接进行...背景&痛点
随着CSDN App技术栈的扩展,从原本最最简单的原生页面到原生页面的跳转,扩展到目前同一个App中包含原生页面、H5页面、小程序页面、Flutter页面之间的跳转。
这样带来的问题是:随着App的版本迭代,很多原本原生实现的页面,需要通过新的H5页面进行升级/降级,或者原本PC或者H5页面,需要重定向到已有的原生页面。而这些基本都是硬编码的跳转逻辑,需要随着版本不停改动。总结下来,现有的,各个技术栈隔离的页面跳转逻辑面临的直接问题有:- 跳转的逻辑需要根据版本迭代走,无法统一远程进行改动(例如:每次新增一个需要拦截跳转原生的页面,都需要通过发版来解决)
- 跨技术栈跳转的实现成本比较高,必须在桥接模块中进行特殊适配
- H5页面中,某些跳转需要跳转原生或者其他页面,必须要通过WebView跳转的拦截做特殊判断处理
为了解决以上硬编码及灵活性差的问题,我们通过梳理现有的各技术栈跳转逻辑,将这些跳转整合,能够满足动态性、可配置的需求。
路由的意义
首先要明确的是,路由并非只是指的界面跳转,还包括数据获取,业务处理。
前端的路由
网络中路由概念是指路由器从一个接口上接收到数据包,根据数据包的目的地址进行定向转发到另一个接口的过程。直白一点就是,路由是一种数据的收集和分发过程。在前端开发中,路由的作用主要是保证视图和 URL 的信息同步,用户可以通过手动输入或者与页面进行交互来改变 URL,然后程序向服务端发送请求获取资源,接着重新绘制 UI。iOS 移动端可以借用前端的思路,遵循约定的路由协议,通过某种手段映射到具体的视图组件/控制器/功能等资源。
移动端(iOS)的路由
URI
统一资源标识符(Uniform Resource Identifier)是一种用于标识互联网资源的字符串,此种标识允许用于对网络中的资源通过特定的协议进行交互操作。URI 最常见的形式就是统一资源定位符 URL。
这是一段URL,每一段都代表类对应的含义,我们可以理解 URL 为一段携带了获取到某资源的所有必须的信息的特定组合字符串。URL Scheme
iOS 系统里面支持的 URL Scheme 方式打开应用。我们可以通过 TARGETS -> Info -> URL Types 添加应用的 Scheme,该 Scheme 可以理解为 App 的一个身份标识,用它可以打开我们的应用(在三方分享时经常需要我们去平台生成自己的 Scheme,三方平台用此字段跳转我们App)。
这样,我们运行App之后,通过 Safari 就可以跳转到我们的App。输入csdnapp://
跳转。你也可以通过
info.plist
文件中的URL types
字段管理你的URL Scheme
信息。即使你没有用过URL Scheme
,那么你一定使用过一些系统的服务,例如拨打电话,使用系统邮箱等功能。他们的协议头就像下面这样:mailto:// tel://110
如果你未使用过,那么最直观的,你在手机的系统浏览器 Safari 中输入上面的命令,系统就会提示你是否拨打电话或者编写邮件。
tel://
和mailto://
就是系统电话和邮件应用的路由协议头。一些热门的应用同样定义了自己的路由协议头,例如QQ、微信、微博等:
mqq:// weixin:// sinaweibo://
接收处理
通过
-openURL:
过来的的消息,我们可以通过AppDelegate
中的回调代理进行接收处理:- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
Universal Links
使用
URL Scheme
有两个弊端,第一个就是混乱,由于URL Scheme
是自定义字段,任何App都可以使用weixin://
这就可能导致系统跳转错误,这种情况在公司开发一系列的应用时经常发生。第二个就是如果用户未安装与URL Scheme
对应的应用时,系统则无法正常跳转,这时通常需要我们程序员手动判断是否可以打开此URL
:-canOpenURL:
,然后引导用户去安装对应的应用。在 iOS 9.0 之后,苹果新增了一项功能
Universal Links
,直译就是通用链接,这个功能让我们可以通过普通的 HTTP 链接就能启动我们的 App。使用 Universal Links 跳转应用的好处就是:
如果安装了App,无论是在系统浏览器 Safari 里,还是在其他使用了webView控件的页面中,都可以打开App。
如果没有安装App,就会打开对应的网页,这个网页可以是宣传官网,又或者是下载安装地址。
从iOS 系统里面支持的
URL Scheme
方式,我们可以看出,对于一个资源的访问,苹果也是用URI
的方式来访问的。解决了什么问题
借用iOS 组件化 —— 路由设计思路分析一文中的图,很形象的展示了项目中各个控制器模块之间错综复杂的关系。
我们项目中使用的路由组件是基于MGJRouter
进行二次开发实现的路由组件CNRouter
,各种页面之间的跳转都可以通过 URL 的方式进行路由,
使用Router之后大概是这样:
步骤
- APP内每个页面控制器都需要对应一个路由地址URL
- 路由页面跳转前,需要将对应的路由地址URL注册到CNRouter
- 不同页面跳转时,将消息发送到CNRouter中统一处理
- CNRouter根据其注册的URL来找到对应信息,然后负责实例化,解析参数,跳转页面等业务处理
通过上述步骤,我们可以看到,每个控制器之间并不需要相互依赖对方,可以完美的解决不同模块之间的耦合。
动态路由的价值
基于
CNRouter
URL跳转,我们又实现了动态路由功能,它的职责主要有:- 承担 App 内所有页面跳转逻辑
- 通过Apollo配置,支持获取/配置路由替换规则
- 匹配所有的路由跳转规则,命中路由规则的直接进行跳转
- 将实际跳转目标地址传递给路由组件执行实际的跳转行为(路由重定向)
实现方案
1、 路由注册与跳转
整个CNRouter就是由一个
NSMutableDictonary *routes
控制的,routes
中存放了所有已经注册的URL。@interface CNRouter () /** * 保存了所有已注册的 URL * 结构类似 @{@"blog": @{@":blogId": {@"_", [block copy]}}} */ @property (nonatomic) NSMutableDictionary *routes; @end
通过以下方法构造路由匹配规则的字典。- (NSMutableDictionary *)addURLPattern:(NSString *)URLPattern { NSArray *pathComponents = [self pathComponentsFromURL:URLPattern]; NSMutableDictionary* subRoutes = self.routes; for (NSString* pathComponent in pathComponents) { if (![subRoutes objectForKey:pathComponent]) { subRoutes[pathComponent] = [[NSMutableDictionary alloc] init]; } subRoutes = subRoutes[pathComponent]; } return subRoutes; }
例如注册以下两条路由:
[CNRouter registerURLPattern:@"https://blog.csdn.net/:userName/article/details/:articleId" toHandler:^(NSDictionary *routerParameters) { }]; [CNRouter registerURLPattern:@"csdnapp://app.csdn.net/blog/detail" toHandler:^(NSDictionary *routerParameters) { }];
按照上面构造路由匹配规则的字典的方法,该路由规则字典就会变成这个样子:
{ https = { blog.csdn.net = { :userName = { article = { details = { :articleId = { _ = < __NSMallocBlock__: 0x282240ac0 > ; }; }; }; }; }; }; csdnapp = { app.csdn.net = { blog = { detail = { _ = < __NSMallocBlock__: 0x282241bc0 > ; }; }; }; }; }
路由规则字典生成之后,等到路由匹配的时候就会遍历这个字典。所有注册的路由,都是以这种方式存放在
routes
中。
当有路由跳转时,调用以下方法:[CNRouter openURL:@"https://blog.csdn.net/weixin_36162680/article/details/123161859" withUserInfo:@{@"isLogin": @YES} completion:^(id result) { NSLog(@"result = %@",result); }];
上面的URL会匹配成功,那么生成的参数字典结构如下:
{ userName = "weixin_36162680"; CNRouterParameterUserInfo = { isLogin = 1; }; CNRouterParameterURL = "https://blog.csdn.net/weixin_36162680/article/details/123161859"; articleId = "123161859"; }
由上可见,路由组件
CNRouter
,它主要负责:- 启动时注册路由和页面
- 查询正确的页面进行跳转或者执行其他业务逻辑
2、 动态路由与规则配置
概念
动态路由:粗略的讲就是指你的URL地址与页面或者组件之间的映射关系。 本项目会根据Apollo配置,通过远端下发的方式,去动态构建这个路由映射表。实现动态显示可跳转的页面或组件。
路由重定向
对于移动端的路由重定向,实际上就是将一个路由转换为另一个路由,例如:
https://live.csdn.net/room/:id
转换为:
csdnapp://app.csdn.net/live/room?id=xxxx
规则配置
路由重定向中的一个关键节点就是“配置”,我们需要一个路由规则列表来记录和下发匹配规则。为了方便下发路由规则表,我们将这份配置表存放在Apollo,动态地下发到客户端。
一条路由规则,分为一个 Key 和对应的 Value,Key 为需要注册的路由(匹配规则),Value 为需要实例化的控制器名称或者需要重定向的URL,使用 JSON 格式定义。
例如:{ "https://blog.csdn.net/:userName/article/details/:articleId": { "class": "CNNewBlogDetailViewController" }, "https://live.csdn.net/room/:id": { "redirectUrl": "csdnapp://app.csdn.net/live/room" } }
流程
在APP启动阶段拉取正确的路由表(映射规则),进行注册并且保存下来。
实际代码实现中,我们在页面执行跳转前,判断是否有重定向路由,如果有重定向路由,则执行重定向跳转,否则直接初始化目标控制器。
代码实现如下:[CNRouter cn_addRoute:router handler:^(NSDictionary *routerParameters) { //判断是否有重定向 if ([routerParameters[kCNRouteClassRedirectUrl] isValid]) { //跳转重定向地址 [CNRouter cn_openURL: routerParameters[kCNRouteClassRedirectUrl] withUserInfo: routerParameters]; }else{ //初始化控制器 [self executeRouterClassName:className parameters: routerParameters]; } }];
实际应用
先来说下使用动态路由的背景,CSDN APP中技能树模块是用小程序来开发的,现在需要将PC URL在APP中不用H5打开,需要用小程序来展示页面。而APP小程序的URL与PC的URL是不一致的,如果直接用PC URL的话,会存在无法跳转小程序问题。以私信中技能树跳转为例:
- iOS中技能树小程序的路由URL:
csdnapp://app.csdn.net/mpTinyApp?id=__UNI__C92EAF9?language=cloud_native
- PC端私信中发送的URL:
https://edu.csdn.net/skill/cloud_native
那么解决这一问题,只需要在 iOS 的动态路由添加一个规则,将
https://edu.csdn.net/skill/cloud_native
动态替换成csdnapp://app.csdn.net/mpTinyApp?id=__UNI__C92EAF9&language=cloud_native
就可以了。
配置如下:{ "https://edu.csdn.net/skill/:language": { "redirectUrl": "csdnapp://app.csdn.net/mpTinyApp?id=__UNI__C92EAF9" } }
-
ospf动态路由设置实验
2018-02-09 14:39:33进行ospf动态路由设置的实验,了解ospf,了解动态路由含义。 -
react动态路由以及获取动态路由
2020-12-29 00:31:45CCNP路由实验之七 动态路由之BGP CCNP路由实验之七 动态路由之BGP 动态路由协议能够自己主动的发现远程网络,仅仅要网络拓扑结构发生了变化,路由器就会相互交换路由信息,不仅能够自己主动获知新添加的网络,还...业务中会遇到点击列表跳转到详情页,
1.在index.js修改我们的跟组件
新建router2的文件
import React from 'react'
import {
HashRouter as Router,
Route,
// Link,
Switch
} from 'react-router-dom'
import Main from './main'
import Info from './info'
import About from './../router1/about'
import Topic from './../router1/topic'
import Home from './home'
exact是精准匹配有时候会造成路由出不来
export default class IRouter extends React.Component {
render() {
return (
{/* */}
< Route exact path = "/"
component = {
Home
} />
< Route path = "/main"
render = {
() =>
< Main >
component = {
Info
} >
} >
component = {
About
} >
true
}
path = "/about/abc"
component = {
About
} >
component = {
Topic
} >
{/* */}
);
}
}
router后面直接加组件Home会报错
main.js文件中
home.js中,是默认页面
info.js作为动态组件的接收值,通过this.props.match.params.value来接收值
vue的动态路由(登录之后拿到动态路由通过addRouters()动态添加路由)
登录后我们拿到路由动态路由,后端传的数据可能为这个 { path: '/index', meta: { title: '首页', icon: 'icon-shouye', tab_index: , / ...
【原创】一篇学会vue路由配置 、 动态路由 、多层路由(实例)
先来看看效果图: 为了方便讲解,我没有使用vue脚手架,如果需要的,可以留言跟我要.不多说开工: 首先,html先组上
vue管理平台的动态路由(后台传递路由,前端拿到并生成侧边栏)
前端的路由从后台获取,包括权限: 大体步骤包括:路由拦截(钩子函数)---->后台获取路由数据 ----> 保存到本地或vuex中. 在router-->index.js中: rou ...
VueJs(10)---vue-router(动态路由,嵌套式路由,编程式路由)
vue-router(动态路由,嵌套式路由,编程式路由) 本文是基于官网学习,官网具体学习目录:vue-router 一.安装 基于vue-cli脚手架安装还是蛮简单的:在文件当前目录下运行: npm ...
CCNP路由实验之六 动态路由协议之IS-IS
CCNP路由实验之六动态路由协议之IS-IS 动态路由协议能够自己主动的发现远程网络.仅仅要网络拓扑结构发生了变化.路由器就会相互交换路由信息,不仅能够自己主动获知新添加的网络.还能够在当前网络 ...
CCNP路由实验之七 动态路由之BGP
CCNP路由实验之七 动态路由之BGP 动态路由协议能够自己主动的发现远程网络,仅仅要网络拓扑结构发生了变化,路由器就会相互交换路由信息,不仅能够自己主动获知新添加的网络,还能够在当前网络连接失 ...
React 性能优化之组件动态加载(react-loadable)
React 项目打包时,如果不进行异步组件的处理,那么所有页面所需要的 js 都在同一文件中(bundle.js),整个js文件很大,从而导致首屏加载时间过长. 所有,可以对组件进行异步加载处理,通常 ...
React 系列 - 写出优雅的路由
前言 自前端框架风靡以来,路由一词在前端的热度与日俱增,他是几乎所有前端框架的核心功能点.不同于后端,前端的路由往往需要表达更多的业务功能,例如与菜单耦合.与标题耦合.与"面包屑" ...
React通过dva-model-extend实现 dva 动态生成 model
前言 实现通过单个component 单个router通过相应的标识对应产生不同model实现数据包分离,model namespce将会覆盖基础的Model,其中的model[state|subsc ...
随机推荐
HTML5中使用SVG
SVG 即 Scalable Vector Graphics,是一种用来绘制矢量图的 HTML5 标签.你只需定义好XML属性,就能获得一致的图像元素. 使用SVG之前先将标签加入到HTML body ...
Ubuntu 14.04 LTS 下 android 2.3.5 源码编译过程
Ubuntu 14.04 LTS 下 android 2.3.5 源码编译过程 在新的Ubuntu 64位系统下去编译早期的安卓源码是会出现很多问题的,因为64位系统在安装完成后,很多32位的兼容 ...
MySQL瘦身
解压mysql-x.y.z-win32|64.zip 删除不用的目录:保留bin.data.share三个文件夹 删除bin里的多余文件:保留mysqld.exe.mysqladmin.exe (如果 ...
android C/C++ source files 全局宏定义 .
\system\core\include\arch\linux-arm AndroidConfig.h * ============================================== ...
【redis】03list类型
list类型 redis的list类型是一个链表结构,他的主要功能是push.pop.获取一个范围的所有值等等一些操作, 咱们push什么意思,push是不是相当于咱们php里面的array_push ...
(Problem 47)Distinct primes factors
The first two consecutive numbers to have two distinct prime factors are: 14 = 2 7 15 = 3 5 The fi ...
vue2 递归组件--树形
递归组件,官方给的教程太简便了,根本看不出到底怎么用.于是自己查网摸索了一下,这儿只把核心思想写出来. 效果如下图,点击后打开二级菜单,再点击后打开三级. //js //引子//思想:当v-if='f ...
微信小程序--录音
var app = getApp(), $ = require("../../utils/util.js"); const recorderManager = wx.getReco ...
mysql 查询优化 ~ 优化基础补充
一 简介:此文章是对于 sql通用基础的补充说明 二 虚拟列: mysql虚拟列是mysql5.7的新特性,对于函数计算形成的结果可作为虚拟列,并可以对虚拟列添加索引,这样就能加速sql的运行,不过有 ...
Redis 基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
-
vue实现动态路由一步到位
2020-12-04 18:13:52最近在写vue项目,需要由后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由),就是配置vue动态路由啦。 由于错信了一些网上的文章:(,导致在这个问题上耗费了不少时间,想想,还是自己写一... -
动态路由概述
2021-12-12 14:00:20一:动态路由概念 二:RIP是距离矢量路由选择协议 三:动态路由和静态路由的区别 四:度量值 五:RIP的度量值与更新时间 六:RIP的验证与配置 七:动态路由协议 1、动态路由 基于某种路由协议实现 ... -
论文研究-常用动态路由协议的算法分析与性能比较 .pdf
2019-08-16 15:16:30常用动态路由协议的算法分析与性能比较,王彦坤,宋茂强,动态路由能够随着网络运行情况和拓扑结构的变化而变化,路由器根据路由协议提供的功能自动计算数据传输的最佳路径,并由此动态地 -
vue实现权限控制路由(vue-router 动态添加路由)
2020-12-13 04:38:16四、为了防止刷新页面后路由数据被清空,这里用判断是否登录的方式,再次加载动态路由。 具体代码如下: router.js import Vue from 'vue' import {router} from './index' import login from '@/views/login/... -
详解vue路由篇(动态路由、路由嵌套)
2020-10-17 11:45:40主要介绍了详解vue路由篇(动态路由、路由嵌套),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧