使用路由可通过修改地址栏的URL来达到显示不同页面的效果(不依赖于服务端)
在react中使用路由需要下载并引入react-router-dom
$ npm i react-router-dom
使用NavLink来指定跳转的路由,其中的属性to指定路由名称
使用Route来匹配跳转的路由,其中的属性path与NavLink的to相对应,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
大家好,又见面了,我是你们的朋友全栈君。学过简单的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
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金融级核心场景的服
很多朋友害怕算法,其实大可不必,算法题无非就那几个套路,一旦掌握,就会觉得算法实在是太朴实无华且枯燥了!本文选自硬核算法教程《labuladong的算法小抄》,带你学习套路,把握各类算法问题的共性!数据结构是工具,算法是通过合适的工具解决特定问题的方法。对于任何数据结构,其基本操作无非遍历+访问,再具体一点就是:增、删、查、改。那么该如何在力扣刷题呢?很多文章都会告诉你“按标签刷”“坚持下去”等。不说这些不痛不痒的话,直接给具体的建议。先刷二叉树先刷二叉树!!先刷二叉树!!这是我刷题一年的亲身体会,下图是2019年10月的提交截图:据我观察,大部分人对与数据结构相关的算法文章不感兴趣,而是更关心动态规划、回溯、分治等技巧。这是不对的,这些常考算法技巧在《labuladong的算法小抄》中都会有所涉及,到时候你就会发现,它们看起来高大上,但本质上就是一个多叉树遍历的问题,配合算法框架,并没有多难。为什么要先刷二叉树呢?因为二叉树是最容易培养框架思维的,而且大部分常考算法本质上都是树的遍历问题。刷二叉树时看到题目没思路?其实大家不是没思路,只是没有理解“框架”是什么。不要小看下面这几行代码
二、查看登录用户及修改密码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复
在使用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转
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回归是多项分布+对数最大似然估计的结果,最大熵是基于期望+对数似然估计的结果。前三者可以从广义线性模型角度来看。
最近我有幸参加在墨尔本召开的2017WebDirectionsCode大会。我和MarkDalgleish还有GlenMaddern(他的演讲非常精彩)被分到了一个演讲小组里。我们做了一系列关于CSS的演讲,在小组讨论中,我们讨论了一个问题:“只会写CSS和HTML、不会写JavaScript的人在行业中还有一席之地吗”。对我而言,这可以很简单的解释为:“不会写JavaScript的人是否还有价值?”,基于之后观众的一些评论,thisseemedtobehowmanyunderstoodquestion。简单直白的说:这并不是一篇CSSvsJS的文章。如果你在寻找这类文章,那么不好意思,你可能来错地方了。本文不谈优雅美好,只谈人和期望。So,我们向观众抛出了一个问题:你们是否会雇佣只会写CSS和HTML的人。结果没有一个人举手。我着实有点失望。谁都希望雇佣什么都能干的员工,这我能理解。但是我不理解的是,为什么“只会写JS”就ok了,“只会写HTML和CSS”就不ok了。如果每一个上线的网站拥有完美的、语义化的、可执行的HTML,拥有在异常情况下也可执行的、可以在任何设备和浏览器上运行的
在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
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章决策树 决策树算法是机器学习中最经典的算法之一。大家可能听过一些高深的算法,例如在竞赛中大杀四方的Xgboost、各种集成策略等,其实它们都是基于树模型来建立的,掌握基本的树模型后,再去理解集成算法就容易多了,本章介绍树模型的构造方法以及其中涉及的剪枝策略。 7.1决策树原理 先来看一下决策树能完成什么样的任务。假设一个家庭中有5名成员:爷爷、奶奶、妈妈、小男孩和小女孩。现在想做一个调查:这5个人中谁喜欢玩游戏,这里使用决策树演示这个过程,如图7-1所示。 图7-1决策树分类方法 开始的时候,所有人都属于一个集合。第一步,依据年龄确定哪些人喜欢玩游戏,可以设定一个条件,如果年龄大于15岁,就不喜欢玩游戏;如果年龄小于15岁,则可能喜欢玩游戏。这样就把5个成员分成两部分,一部分是右边分支,包含爷爷、奶奶和妈妈;另一部分是左边分支,包含小男孩和小女孩。此时可以认为左边分支的人喜欢玩游戏,还有待挖掘。右边分支的人不喜欢玩游戏,已经淘汰出局。 对于左边这个分支,可以再进行细分,也
笔者已经工作了十多年,在这十多年里,笔者在博客上也对自己所学的技术方面的事情记录成了博文。这些博文有些是笔者自己所学所记,有些是将网上的博文进行的转载。在经历了这么多的技术学习之后,笔者将自己的经验记录成了博文,也将自己的这些技术内容进行了整理,针对计算机的软硬件方面的知识进行了整理,形成了本系列的文章。 另一个系列的文章是笔者的管理系列的文章,同样是对笔者自己的管理方面的经验进行了编写。其它的系列文章,笔者在今后的过程中将另行编写,主要是将笔者的经验进行记录,对工作、学习方面的知识进行记录,以后也能够对文章进行回顾,增加自己的经验,所谓温故而知新,就是这个道理。 作为技术系列的开篇,这里对此系列的文章进行下说明。技术系列文章分为几大方向:软件、硬件、网络、弱电、系统集成这几大块,主要是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
代码: #-*-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
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很像,但是调用顺序是先调用第一个