react-router v4 之 啥是<Switch>

原文翻译:


<Switch>

  渲染第一个被location匹配到的并且作为子元素的<Route>或者<Redirect>

  使用<Switch>包裹和直接用一打<Route>s有什么区别呢?

  <Switch>是唯一的因为它仅仅只会渲染一个路径。相比之下(不使用<Switch>包裹的情况下),每一个被location匹配到的<Route>将都会被渲染。认真思考一下图1-1的代码:


图1-1

  如果URL是/about, 那么<About>,<User>,和<NoMatch>将都被渲染,因为它们的path全都被匹配到。设计如此,允许我们通过<Route>s以多种方式去构建我们的应用,比如:sidebars 和 breadcrumbs,bootstrap tabs,等。

  然而,有时,我们只想选择性的渲染一个<Route>。如果URL是/about我们并不想也匹配到/:user(或者显示给我们404页面)。参阅图1-2,看看如何使用<Switch>来处理这个问题的:


图1-2


  现在,如果URL是/about,<Switch>将会开始寻找相匹配的<Route>。<Route path="/about" />将会被匹配到,紧接着 <Switch>会停止继续匹配并且渲染<About>。同理,如果URL是/michael,那么<User>将会被渲染。

聊一聊:


  细心的同学会发现图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

至此,我可以关机下班了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,837评论 18 139
  • 作者:Tyler 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/de...
    胡子大哈阅读 2,211评论 3 15
  • React-Router v4 1. 设计理念1.1. 动态路由1.2. 嵌套路由1.3. 响应式路由 2. 快速...
    wlszouc阅读 8,573评论 0 14
  • 这几天闲下来想开发我个人网站的极客教程的移动web版本,然后发现之前弄的开发移动web的环境过于老旧,于是重新弄了...
    cbw100阅读 2,678评论 0 4
  • React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件。所...
    梁相辉阅读 97,589评论 24 195