Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 反应路由器交换机和精确路径_Reactjs_React Router_React Router V4 - Fatal编程技术网

Reactjs 反应路由器交换机和精确路径

Reactjs 反应路由器交换机和精确路径,reactjs,react-router,react-router-v4,Reactjs,React Router,React Router V4,我已经阅读了这份文件 我理解交换机和路由的定义 但还是不能理解一些要点 如果我只想选择一条路径进行渲染,我们可以使用如下开关 <Switch> <Route exact path="/" component={Home} /> <Route path="/a" component={A} /> <Route path="/b" component={B} /> </Switch> <Switch> <

我已经阅读了这份文件

我理解交换机和路由的定义

但还是不能理解一些要点

如果我只想选择一条路径进行渲染,我们可以使用如下开关

<Switch>
  <Route exact path="/" component={Home} />
  <Route path="/a" component={A} />
  <Route path="/b" component={B} />
</Switch>
<Switch>
  <Route exact path="/" component={Home} />
  <Route path="/a" component={A} />
  <Route path="/b" component={B} />
  <Route component={SpecificComponent} />
</Switch>

我不明白的一点是,我可以在没有开关的情况下获得同样的效果

 <Route exact path="/" component={Home} />
 <Route path="/a" component={A} />
 <Route path="/b" component={B} />

那么我们为什么要使用交换机呢?我们什么时候需要使用交换机



我发现一个需要使用开关的情况

如果我想在没有路径匹配的情况下渲染特定组件

我们需要像这样把路线包在交换机里

<Switch>
  <Route exact path="/" component={Home} />
  <Route path="/a" component={A} />
  <Route path="/b" component={B} />
</Switch>
<Switch>
  <Route exact path="/" component={Home} />
  <Route path="/a" component={A} />
  <Route path="/b" component={B} />
  <Route component={SpecificComponent} />
</Switch>


我说的对吗?

虽然在你的情况下,你可以使用exact获得相同的效果,但情况可能并不总是如此。但是,如果其中一条管线包含嵌套管线,则如果顶层有确切的管线,则不能使用嵌套管线

开关
在上述情况下可用于此目的,因为它仅呈现第一个匹配

比如说,

假设主路线包含嵌套路线,如

const Home = (props) => (
     <div>
          <Route path="/dashboard" component={Dashboard}/>
          <Route path="/layout" component={Layout}/>
     </div>
)
基本上,“精确”和“精确”关键字都有相同的用途。(注意:匹配算法使用检查来查看当前URL是否以该路径开始。)但在我们使用时,路由声明或特定性的顺序很重要。需要在顶部添加更具体的路线。就你而言

<Switch>
<Route path="/a" component={A} />
<Route path="/b" component={B} />
<Route exact path="/" component={Home} />
</Switch>

在“精确”的情况下,当您通过“精确”时,仅当路径完全匹配时,此路由才会匹配。在您的情况下,主路径设置为“精确”

<Route exact path="/" component={Home} />
<Route path="/a" component={A} />
<Route path="/b" component={B} />

让我介绍一下
路线
精确
开关
的显著特点:

  • Route
    进行部分匹配。路由的路径包含匹配(匹配多个)

  • exact
    删除部分匹配。它可能匹配多个路由,以防我们在路由中使用通配符

  • 开关
    仅呈现第一个匹配的路由<代码>开关路径以独占方式匹配(仅匹配一个)

为了详细解释,我想说明路由匹配在使用和不使用
exact
时是如何工作的。假设我们有下面的代码,并且没有使用
exact

因此,如果我们访问
/pagetwo
URL,
Route
将进行部分匹配,并呈现两条路由。让我们看看它是怎么发生的。在下图中,我们查看地址栏和导航到的路径(提取路径)以及匹配的路径。因此,
Route
将在
extractedPath.contains(路由声明中的路径)
计算为true时呈现路由

希望这能澄清
路线
在幕后是如何运作的。为了避免这种部分匹配,我们使用
exact
。使用
exact
可以解决问题,直到遇到一些特殊情况。假设我们有两条路线,如:

  • /users/create
  • /users/*
    (路由中的通配符)

在上述情况下,
exact
将匹配两条路线。因此,要解决这些问题,我们可以使用
开关
。它只渲染一条路线,并且首先匹配的路线。因此,在这里,定义路线的顺序很重要。

谢谢您的回答。但我仍然不能理解你们的例子,所以如果我们想让这个例子正常工作,我们需要在Switch中包装Route?我发现了一种需要使用Switch的情况。我更新了我的问题,对吗?@是的,这是另一种情况,当您想在不匹配的情况下呈现默认路由时,您可以使用switch。我的答案指定了一种情况,您需要编写嵌套路由谢谢!。我想知道如何让你的例子正确运行,你能解释一下吗?