|
react-router中,Switch到底是如何工作的?什么时候需要用到Switch?于是看到一篇比较详细的说明,分享一下。
<Switch> 渲染第一个被location匹配到的并且作为子元素的<Route>或者<Redirect> 使用<Switch>包裹和直接用一打<Route>s有什么区别呢? <Switch>是唯一的因为它仅仅只会渲染一个路径。相比之下(不使用<Switch>包裹的情况下),每一个被location匹配到的<Route>将都会被渲染。认真思考一下图1-1的代码: ![]() 图1-1 ![]() 图1-2 聊一聊: 细心的同学会发现图2中的<Route>有个exact属性,它是干嘛的呢?我们先保留疑问接着往下走。抱着试一试的心态,我偏不使用<Switch>,请看下面一组图代码: ![]() 图2-1 运行结果一: ![]() 图2-2 运行结果二: ![]() 图2-3 观图2-2,因为"/"只匹配到了path="/"的<Route>所以正常渲染了页面一。然而,观图2-3,"/second"先匹配到了path="/"的<Route>,接着又匹配到了path="/second/"的<Route>,于是把页面一和页面二都渲染了出来。 终于, 经过一番freestyle之后发现的确有坑需要用<Switch>来填。于是,代码微调,再看下面一组图代码: ![]() 图2-4 运行结果三: ![]() 图2-5 运行结果四: ![]() 图2-6 看到运行结果四(观图2-6),我不禁呵呵了一下,感叹世界真奇妙。此时,我们不妨暮然回首,其实答案就在原文翻译的第一句话,对,就像那句换说的一样,<Switch>只找到第一个被location匹配到的<Route>就立即停止继续匹配,并且把它渲染出来。"/second"同时和"/","/second/"相匹配,因为先匹配到了前者,所以只有页面一被渲染。验证一下,把两者前后顺序进行调整,请看下面一组图代码:![]() 图2-7 运行结果五: ![]() 图2-8 运行结果六: ![]() 图2-9 经过<Switch>的使用及顺序的调整,我们终于得到了想要的结果,可是这样就满足了么?难道每次写路由的时候都要严格控制书写顺序吗?答案当然是否定的! 还记得"聊一聊"第一句中提到的<Route>有个exact属性吗?其实,上过小学的人都知道它是汉语“精确”的意思。这样解释起来就简单很多,当<Route>添加exact属性后只有URL和该<Route>的path属性进行精确比对后完全相同该<Route>才会被渲染。 那么,我们把<Switch>和exact属性结合起来使用呢?请看最后一组图代码:![]() 图2-10 运行结果七: ![]() 图2-11 运行结果八: ![]() 图2-12 由此:我们可以知道: 有<Switch>标签,则其中的<Route>在路径相同的情况下,只匹配第一个,这个可以避免重复匹配; 无<Switch>标签,则其中的<Route>在路径相同的情况下全都会匹配。更严重的是,还会匹配上级路径的! 当我们只想匹配指定路径而不是全部路径都匹配的时候,<Switch>标签就显得非常的实用了! 链接:https://www.jianshu.com/p/ed5e56994f13 [Amber于2020-09-16 08:42编辑了帖子]
|
|
最新喜欢: |
|
沙发#
发布于:2020-09-11 16:49
doubleyong:楼主,看不到图回到原帖我重新上传了的,依旧看不到哇? |
|
|
板凳#
发布于:2020-09-11 15:13
楼主,看不到图
|
|
|
