react路由

一,为什么使用路由

使用路由可通过修改地址栏的URL来达到显示不同页面的效果(不依赖于服务端)
在react中使用路由需要下载并引入react-router-dom
$ npm i react-router-dom 使用NavLink来指定跳转的路由,其中的属性to指定路由名称 使用Route来匹配跳转的路由,其中的属性pathNavLinkto相对应,component指定要跳转的组件 `` Route用Switch包起来,这样在匹配到一个后,就不会继续往下匹配 

 <Switch>
                    <Route path='/cinema' component={Cinema}></Route>
</Switch>

 

二,一级路由和多级路由

(1).一级路由 

http://localhost:3000/home

`/home`就是一级路由 

(2).二级路由

http://localhost:3000/home/detail

`/home/detail`就是二级路由 

三,模糊匹配,精确匹配

Route标签中添加exact属性即可开启精确匹配,否则为模糊匹配

<Route path='/cinema' exact component={Cinema}></Route>

 在使用模糊匹配时,‘/cinemalist’也会匹配到‘cinema’,这样有可能会跳转到不被期望的页面,因此,在某些情况下,需要使用精确匹配,

但精确匹配不能滥用,因为使用精确匹配后,该路由就不能在使用嵌套路由了

四,重定向

使用redirect标签可以实现网页的重定向,这样在刚打开页面时可以指定默认跳转到哪个路由页面

<Redirect exact from='/' to='/cinema'></Redirect>

如果打开的页面时http://localhost:3000,则会自动跳转到http://localhost:3000/cinema

五,网页找不到

用户常常会存在网页输入错误的情况,这时将会得不到想要的页面,网页直接返回404,这里我们可以自己设置一个页面不存在的组件,并在Route列表最后添加一条Route

<Route component={NotFound}></Route>

这样当前面所有路由都没有匹配上时,会匹配到最后一条Route

六、嵌套路由

在路由组件里面再引入路由组件,形成嵌套关系

在App中

<Switch>
                    <Route path='/cinema' component={Cinema}></Route>
                    <Route path='/films' component={Films}></Route>
                    <Route path='/my' render={() => { return isAut() ? <My /> : <Login /> }}></Route>
                    <Route path='/detail' component={Detail}></Route>
                    <Route path='/login' component={Login}></Route>
                    {/* 动态路由 */}
                    {/* <Route path='/detail/:myid' component={Detail}></Route> */}
                    <Redirect exact from='/' to='/cinema'></Redirect>
                    <Route component={NotFound}></Route>

                </Switch>

在Films组件中

                <li><NavLink to='/films/onPlay'>正在热映</NavLink></li>
                <li><NavLink to='/films/coming'>即将上映</NavLink></li>
             <Switch>
                    <Route path='/films/onPlay' component={OnPlay}></Route>
                    <Route path='/films/Coming' component={Coming}></Route>
                    <Redirect from='/films' to='/films/onPlay'></Redirect>
             </Switch>

七,编程式导航,声明式导航

像前面提到的利用<NavLink>编写的导航栏以实现页面跳转称为声明式导航

而通过点击事件等调用函数来实现的页面的跳转称为编程式导航

const handleChange = (id) => {
        console.log(props)
        // 函数式导航
        //动态路由传参
        // props.history.push(`/detail/${id}`)
        props.history.push('/detail?id=wang&name=qwi')
        //query传参
        // props.history.push({ pathname: '/detail', id: id })

    }

 八,动态路由

在路由后面使用:参数的形式可以实现动态路由

这里/detail后面的/:myid只是占位符,具体是什么,需要看后续跳转的时候传递的参数

<Route path='/detail/:myid' component={Detail}></Route>
const handleChange = (id) => {
        console.log(props)
        // 函数式导航
        //动态路由传参
        props.history.push(`/detail/${id}`)
        

    }

九,路由拦截

有一些页面在用户满足某些条件前是不允许访问到的,因此需要做路由拦截,当验证通过后,用户才有访问的权限,例如一些APP中‘我的’页面,要在用户登录后才能访问

 <Route path='/my' render={() => { return isAut() ? <My /> : <Login /> }}></Route>

在Route中除了写 component属性外,也可以用render属性来指定组件,只不过render里面是一个函数,函数需要返回一个组件或可以显示在页面上的元素,而所谓的拦截,就可以利用render里面的函数进行一些验证,验证通过,则可以访问特定的页面,否则跳转到其他的页面

十,路由模式

路由模式分为两种,HashRouter和BrowserRouter

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 第五章 更换cdh版本,hive的安装使用,原理讲解

    大家好,又见面了,我是你们的朋友全栈君。学过简单的wordcount后就开始使用hive吧这里先介绍下,怎么设置hadoop的环境变量提示:始终记得我们是ubuntu操作系统。这里由于小编的这里在安装hive时,由于出现了启动hive时出现了和hadoop的版本不一致的原因,并且始终没有解决,所以就改变策略使用cdh版本的hadoop和hive.因为cdh版本的比较系统,兼容性好。因此要重新安装了。下载地址如下:http://archive.cloudera.com/cdh5/cdh/5/安装前先卸载之前的hadoop.这里卸载也很暴力,直接删掉之前的hadoop的安装目录。然后把下载好的cdh版本的hadoop,安装之前的方式,解压,修改解压后的文件夹目录名为hadoop。修改hadoop/etc/hadoop目录下的四个文件,分别是hadoop-env.sh;core-site.xml;hdfs-site.xml;mapred-site.xml其中hadoop-env.sh是配置java的安装目录,其余的三个分别如上篇博文配置即可。这里不再详述。最后还有就是设置环境变量,如下。1,

  • 线性代数:坐标系转换

    问题描述:已知一个全局坐标系,还有若干局部坐标系,如何将局部坐标系的坐标转成全局坐标系的坐标?反过来又如何进行? 这里的坐标系都是直角坐标系。本文通过下面几个方面的研究来回答上面的问题。1、简单示例2、求解过程 3、nodejs编程验证简单示例已知点A(6,6),B(14,14),C(-2,14),G(12,12),求当A为原点,AB为X轴,AC为Y轴时G点的坐标。可以见下图:通过查看图形,我们可以很快的计算出点G新的坐标如下:但是如果G为任意一点,我们还能轻松求出来么?显然我们不行。我们需要一种通用的方法来一次到位,这里就引入了矩阵变换的概念。求解过程重新理解坐标系的(x,y)。看下图:我们的某个点的坐标实际上表达的是坐标轴单位向量的个数。x表示X轴单位向量个数,y表示Y轴单位向量个数。有了这个概念之后,我们重新来看待上面的问题:假设AB单位向量为p(px,py),AC单位向量为q(qx,qy)。点G在新坐标系下为(x1,y1)换成矩阵计算的写法: 由于AG向量可以很容易的求出来,单位向量p,q也很容易求出来,所以我们的新的坐标系下面的(x1,y1)也可以很容易求出来。通过逆矩阵变换

  • 案例纠正一则

    《通过索引提升SQL性能案例一则》提到的案例,处理不太准确,有必要纠正下,更要谢谢老虎刘老师的耐心指正。原始SQL,跑出的执行计划,是INDEX SKIPSCAN,确实是低效的, selectt.AGENTasagent, nvl(sum(case whent.operation_type='A'then1else0end),0)as DflCount, nvl(sum(case whent.operation_type='B'then1else0end),0)as IfCount, nvl(sum(case whent.operation_type='C'then1else0end),0)as AecCount, nvl(sum(case whent.operation_type='D'then1else0end),0)as BsCount fromOP_LOGt where t.code='AA' andt.ORI_CODE='ABC' andt.T_DATEBE

  • 以开源力量引领下一个十年的数据库变革,PingCAP 获分布式数据库领导力奖

    4月7日至8日,由全球分布式云联盟、亚太CDN产业联盟、众视Tech主办的2021GDCC全球分布式云大会在北京举行,PingCAP联合创始人兼CTO黄东旭受邀参会发表演讲。同时,大会现场表彰了在分布式云领域做出卓越贡献的企业,PingCAP获得分布式数据库领导力奖。GDCC致力于推动分布式系统、分布式数据库等技术与产业深度融合,加速服务发展模式创新,引领技术变革。组委会在“分布式云”为核心技术理念的基础上,表彰在分布式云、云原生、边缘计算、分布式数据库、分布式存储、SD-WAN分布式连接等领域,为技术进步突破、为行业创造价值新高、为推动社会发展做出重大贡献的领先企业。PingCAP专注于新型分布式数据库TiDB的研发,致力于前沿技术领域的创新实现,以开源力量引领变革,获得了高度认可。PingCAP始终以研发最先进的前沿数据库为目标,TiDB4.0+TiFlash实现了一个云上水平扩展HTAP数据库的构想,刚刚GA的TiDB5.0版本成为迈向企业级核心场景的里程碑版本,是分布式数据库又一次跨时代的实践:TiDB5.0的性能和稳定性得到显著提升,从而具备更强大的OLTP金融级核心场景的服

  • 算法刷题指南,来自GitHub 68.8k star的硬核算法教程

    很多朋友害怕算法,其实大可不必,算法题无非就那几个套路,一旦掌握,就会觉得算法实在是太朴实无华且枯燥了!本文选自硬核算法教程《labuladong的算法小抄》,带你学习套路,把握各类算法问题的共性!数据结构是工具,算法是通过合适的工具解决特定问题的方法。对于任何数据结构,其基本操作无非遍历+访问,再具体一点就是:增、删、查、改。那么该如何在力扣刷题呢?很多文章都会告诉你“按标签刷”“坚持下去”等。不说这些不痛不痒的话,直接给具体的建议。先刷二叉树先刷二叉树!!先刷二叉树!!这是我刷题一年的亲身体会,下图是2019年10月的提交截图:据我观察,大部分人对与数据结构相关的算法文章不感兴趣,而是更关心动态规划、回溯、分治等技巧。这是不对的,这些常考算法技巧在《labuladong的算法小抄》中都会有所涉及,到时候你就会发现,它们看起来高大上,但本质上就是一个多叉树遍历的问题,配合算法框架,并没有多难。为什么要先刷二叉树呢?因为二叉树是最容易培养框架思维的,而且大部分常考算法本质上都是树的遍历问题。刷二叉树时看到题目没思路?其实大家不是没思路,只是没有理解“框架”是什么。不要小看下面这几行代码

  • Linux基本命令

    二、查看登录用户及修改密码1.查看我是谁-whoami命令提示:使用两次TAB键获取命令补充提示tc@box~$whoami复制2.修改我的密码输入passwd之后,回车,连续输入两次新密码就可以更新当前用户密码tc@box~$passwd复制3.退出系统再次登录退出系统后使用用户名tc及刚才设置的新密码登录tc@box~$exit复制三、命令管理1.清除屏幕-clear命令tc@box~$clear复制2.查看命令历史-historytc@box~$history 0whoami 1passwd 2clear 4history复制四、用户管理1.以tc用户登录用户管理需要root权限,所以此类命令需要用户为root或具有sudo权限,tc用户具有sudo权限,所以需要以用户tc登录。系统用户名tc,密码为前面设置的密码(若没有设置将为空)。tc@box~$exit CoreLinux boxlogin:tc tc@box~$复制2.添加组-addgroup提示:用户管理需要root权限,所以此类命令前需要加sudotc@box~$sudoaddgroupshiyanlougroup复

  • Django ValuesQuerySet转json方式

    在使用ValuesQuerySet存放查询结果时,有时需要转为json,但并不能直接使用json.dumps()直接转,而是需要经过下面一个步骤:result_set=Apple.objects.all().values() printtype(result_set) data_list=result_set[:]#queryset转为list printtype(data_list)复制output:<class'django.db.models.query.ValuesQuerySet' <type'list'复制经过转换之后,data_list可以使用json.dumps()转为json;为什么要有ValuesQuerySet?查询内容直接转为字典形式,方便后续使用;可以指定查询哪一列;例如Apple.objects.all().values(‘id’),只会查询表中的id这一列;补充知识:Python对象转json【包括嵌套对象转json,django的model转json】背景:给app写接口时经常会遇到将一个model转

  • 程序员面试金典 - 面试题 16.15. 珠玑妙算(map计数)

    1.题目珠玑妙算游戏(thegameofmastermind)的玩法如下。计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。 例如,计算机可能有RGGB4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。 作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。 要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。 注意,“猜中”不能算入“伪猜中”。给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪猜中的次数answer,其中answer[0]为猜中的次数,answer[1]为伪猜中的次数。示例: 输入:solution="RGBY",guess="GGRR" 输出:[1,1] 解释:猜中1次,伪猜中1次。 提示: len(solution)=len(guess)=4 solution和guess仅包含"R","G","B","Y"这4种字符复制来源:力扣(Le

  • 【机器学习】知否?知否?广义线性模型

    本文介绍了广义线性模型,其中线性回归、logistic回归,softmax回归同属于广义线性模型。从指数分布家族推导出高斯分布、伯努利分布对应的指数分布家族形式,以最大化期望为目标推导出线性回归、logistic回归,softmax回归的目标函数,进一步强调模型的概率解释性。作者|文杰编辑|yuquanle广义线性模型从线性回归,logistic回归,softmax回归,最大熵的概率解释来看,我们会发现线性回归是基于高斯分布+最大似然估计的结果,logistic回归是伯努利分布+对数最大似然估计的结果,softmax回归是多项分布+对数最大似然估计的结果,最大熵是基于期望+对数似然估计的结果。前三者可以从广义线性模型角度来看。

  • 不会写 JavaScript 的人是否还有价值?

    最近我有幸参加在墨尔本召开的2017WebDirectionsCode大会。我和MarkDalgleish还有GlenMaddern(他的演讲非常精彩)被分到了一个演讲小组里。我们做了一系列关于CSS的演讲,在小组讨论中,我们讨论了一个问题:“只会写CSS和HTML、不会写JavaScript的人在行业中还有一席之地吗”。对我而言,这可以很简单的解释为:“不会写JavaScript的人是否还有价值?”,基于之后观众的一些评论,thisseemedtobehowmanyunderstoodquestion。简单直白的说:这并不是一篇CSSvsJS的文章。如果你在寻找这类文章,那么不好意思,你可能来错地方了。本文不谈优雅美好,只谈人和期望。So,我们向观众抛出了一个问题:你们是否会雇佣只会写CSS和HTML的人。结果没有一个人举手。我着实有点失望。谁都希望雇佣什么都能干的员工,这我能理解。但是我不理解的是,为什么“只会写JS”就ok了,“只会写HTML和CSS”就不ok了。如果每一个上线的网站拥有完美的、语义化的、可执行的HTML,拥有在异常情况下也可执行的、可以在任何设备和浏览器上运行的

  • Java 的 String.substring 方法有什么问题?

    在Java7,Update6之前,substring方法会有内存泄漏的问题。substring会构造一个新的string对象,该string对象引用了原来的string对象的一个char数组。这会导致原有的string对象不会被垃圾回收。引发内存泄漏。看源码:publicStringsubstring(intbeginIndex,intendIndex){ if(beginIndex<0){ thrownewStringIndexOutOfBoundsException(beginIndex); } if(endIndex>count){ thrownewStringIndexOutOfBoundsException(endIndex); } if(beginIndex>endIndex){ thrownewStringIndexOutOfBoundsException(endIndex-beginIndex); } return((beginIndex==0)&&(endIndex==count))?this: newString(offset+b

  • ToDesk-----个人免费 极致流畅的远程协助软件

    ToDesk https://www.todesk.com/ 复制 ToDesk官方下载地址 https://www.todesk.com/ 还支持文件传输,用过许多远程的控制工具,这个自我感觉比向日葵好用todesk。 本文来自博客园,作者:BaldHead,转载请注明原文链接:https://www.cnblogs.com/strict/p/13337837.html

  • 前端使用docxtemplater导出word文档最佳实践 vue

    docxtemplater语法 {%img}图片 {#list}{/list}循环、if判断 {#list}{/list}{^list}{/list}ifelse {str}文字   复杂的数据,例如需要多选打√的,就需要使用docxtemplater 的条件判断语法来实现。     {#multi}{#checked}R{/checked}{^checked}£{/checked} {name}{/multi}            this.ruleForm.multi =[{name:"中毒",checked:true},{name:"窒息",checked:true},           {name:"爆炸",checked:true},{name:"灼烫伤",checked:true},  &nb

  • 《Python数据分析与机器学习实战-唐宇迪》读书笔记第7章--决策树

    python数据分析个人学习读书笔记-目录索引 第7章决策树    决策树算法是机器学习中最经典的算法之一。大家可能听过一些高深的算法,例如在竞赛中大杀四方的Xgboost、各种集成策略等,其实它们都是基于树模型来建立的,掌握基本的树模型后,再去理解集成算法就容易多了,本章介绍树模型的构造方法以及其中涉及的剪枝策略。 7.1决策树原理    先来看一下决策树能完成什么样的任务。假设一个家庭中有5名成员:爷爷、奶奶、妈妈、小男孩和小女孩。现在想做一个调查:这5个人中谁喜欢玩游戏,这里使用决策树演示这个过程,如图7-1所示。       图7-1决策树分类方法   开始的时候,所有人都属于一个集合。第一步,依据年龄确定哪些人喜欢玩游戏,可以设定一个条件,如果年龄大于15岁,就不喜欢玩游戏;如果年龄小于15岁,则可能喜欢玩游戏。这样就把5个成员分成两部分,一部分是右边分支,包含爷爷、奶奶和妈妈;另一部分是左边分支,包含小男孩和小女孩。此时可以认为左边分支的人喜欢玩游戏,还有待挖掘。右边分支的人不喜欢玩游戏,已经淘汰出局。   对于左边这个分支,可以再进行细分,也

  • IT技术:开篇 - IT技术系列文章

      笔者已经工作了十多年,在这十多年里,笔者在博客上也对自己所学的技术方面的事情记录成了博文。这些博文有些是笔者自己所学所记,有些是将网上的博文进行的转载。在经历了这么多的技术学习之后,笔者将自己的经验记录成了博文,也将自己的这些技术内容进行了整理,针对计算机的软硬件方面的知识进行了整理,形成了本系列的文章。   另一个系列的文章是笔者的管理系列的文章,同样是对笔者自己的管理方面的经验进行了编写。其它的系列文章,笔者在今后的过程中将另行编写,主要是将笔者的经验进行记录,对工作、学习方面的知识进行记录,以后也能够对文章进行回顾,增加自己的经验,所谓温故而知新,就是这个道理。       作为技术系列的开篇,这里对此系列的文章进行下说明。技术系列文章分为几大方向:软件、硬件、网络、弱电、系统集成这几大块,主要是IT业里的这些知识,其它行业领域的知识请读者另行搜索。这几大块主要是针对的IT业里的技术方面的知识,虽然经过了笔者的经验总结和整理,但是难免有遗漏,请读者指出,笔者也好进行相关的知识及经验的补充,更好更完善的对技术知识进行学

  • 模板合集(未完

    dijkstra priority_queue<pii,vector<pii>,greater<pii>>q; voiddijkstra(ints){ memset(dis,inf,sizeof(dis)); memset(vis,0,sizeof(vis)); q.push(make_pair(dis[s]=0,s)); while(!q.empty()){ intu=q.top().second;q.pop(); if(vis[u])continue;vis[u]=1; for(inti=head[u],v;i;i=e[i].nxt) if(dis[v=e[i].v]>dis[u]+e[i].w)dis[v]=dis[u]+e[i].w,q.push(make_pair(dis[v],v)); } } 复制 prim priority_queue<pii,vector<pii>,greater<pii>>q; voidprim(){ memset(dis,inf,sizeof(dis)); mem

  • 用数组显示裴波那契数列

    1#include<stdio.h> 2enum{num=30}; 3intmain() 4{ 5longfib[num]; 6inti; 7fib[0]=fib[1]=1; 8for(i=2;i<num;i++) 9{ 10fib[i]=fib[i-1]+fib[i-2]; 11} 12for(i=0;i<num;i++) 13{ 14printf("%d",fib[i]); 15putchar((i)%6==5?'\n':''); 16} 17}复制  

  • 初学Javascrip随笔记

    学得很老火,老师的教学方式是一回事,自己的问题也是硬伤。尽管是初级,现在才感慨之前写页面是件好幸福的事。相当不习惯!

  • python openpyxl自动化操作excel(xlsx)

    代码: #-*-coding:utf-8-*- importos,openpyxl fromopenpyxl.stylesimportBorder,Side,PatternFill if__name__=='__main__': #bug如果标题行里面有\r,会被转换成了_x000D_ #有一个安全过滤的库,叫什么来着? #作成一个新的空的Excel wb=openpyxl.Workbook() #保存 wb.save('example.xlsx') #打开 wb=openpyxl.load_workbook('example.xlsx') #当前打开的sheet页wb.active ws=wb.active #更改默认名称Sheet` ws.title="WorkSheetTitle" #定义第二个sheet页 ws2=wb.create_sheet("NewWorkSheet2") #定义第三个sheet页 #`0`的设定会将该sheet页置于wb最前面 ws3=wb.create_sheet("NewWorkSheet3",0) ws.title="WorkSheetTit

  • 52. Maximum Subarray

    Findthecontiguoussubarraywithinanarray(containingatleastonenumber)whichhasthelargestsum. Forexample,giventhearray [−2,1,−3,4,−1,2,1,−5,4],thecontiguoussubarray [4,−1,2,1] hasthelargestsum= 6. clicktoshowmorepractice. Morepractice: IfyouhavefiguredouttheO(n)solution,trycodinganothersolutionusingthedivideandconquerapproach,whichismoresubtle. --- Idea: -DP ”iftheprevioussumare +,whichisthenusefulforthecurrentelement,orifitis-,whynotstartthesubarrayfromcurrentelement?Wecan

  • 模式匹配与函数组合

    课程内容: 函数组合 compose andThen 柯里化vs偏应用 偏函数PartialFunctions 范围和域rangeanddomain 使用orElse进行组合 case之谜 函数组合 让我们创建两个函数: scala>deff(s:String)="f("+s+")" f:(String)java.lang.String scala>defg(s:String)="g("+s+")" g:(String)java.lang.String 复制 compose compose 组合其他函数形成一个新的函数 f(g(x)) scala>valfComposeG=f_composeg_ fComposeG:(String)=>java.lang.String=<function> scala>fComposeG("yay") res0:java.lang.String=f(g(yay)) 复制 andThen andThen 和 compose很像,但是调用顺序是先调用第一个

相关推荐

推荐阅读