【问题标题】:React Router not switching to non-base routes反应路由器不切换到非基本路由
【发布时间】:2019-11-18 12:02:33
【问题描述】:

我正在一个以前使用 Reach Router 的项目中设置 React Router。

以前,使用 Reach 的路线如下所示:

import { Router } from '@reach/router';

...

<Router>
      {anon ? <AnonHomepage /> : <Homepage />}
      <Explore path="explore/:category" />
</Router>

然后,切换到 React Router,我的文件设置如下:

import { BrowserRouter, Switch, Route } from 'react-router-dom';

...

<BrowserRouter>
      <Switch>
        {anon ? (
          <Route path="/" component={AnonHomepage} />
        ) : (
          <Route path="/" component={Homepage} />
        )}
        <Route
          path="/explore/:category"
          component={Explore}
        />
      </Switch>
</BrowserRouter>

但是,路由器只在 / 路由中显示 AnonHomepage 和/或主页,不再显示 /explore(或任何其他)路由。我究竟做错了什么?如何让它使用正确的组件,而不是总是显示基本路由的组件?

【问题讨论】:

    标签: reactjs react-router reach-router


    【解决方案1】:

    简短回答:您需要将布尔属性 exact 传递给您的根路由,如下所示:

    <Switch>
      <Route exact path='/' component={YourComponent} />
      <Route path='path/to/other/component' component={OtherComponent) />
    </Switch>
    

    说明:查看&lt;Switch&gt; 组件here 的文档。 Switch 仅呈现 first 路由,其 path 属性与当前位置匹配。本质上,当 React Router 接收到一个新的导航并寻找与之匹配的 Route 时,它​​会使用 Route 路径测试导航路径,就好像 Route 路径是一个正则表达式一样。因为您网站上的每个导航路径都包含根路径,path='/' 将匹配所有可能的导航。由于根Route 是列出的第一个路由,它是Switch 将测试的第一个路由,并且由于该测试必然会导致匹配,Switch 从不测试其他路由,它只是呈现根组件。

    exact 属性添加到路由可以达到您的预期——它可以防止Switch 检测到匹配项,除非Route 中的路径完全 是导航路径。所以 '/root/other/folder' 将 匹配设置了 exact 属性的路由上的 '/',因为 '/' 不完全 等于 ' /root/其他/文件夹'。

    【讨论】:

      【解决方案2】:

      您可以在路线上使用exact prop

      import { BrowserRouter, Switch, Route } from 'react-router-dom';
      
      ...
      
      <BrowserRouter>
            <Switch>
              {anon ? (
                <Route exact path="/" component={AnonHomepage} />
              ) : (
                <Route exact path="/" component={Homepage} />
              )}
              <Route
                path="/explore/:category"
                component={Explore}
              />
            </Switch>
      </BrowserRouter>
      

      【讨论】:

      • 谢谢!这是exactly 我需要的!
      猜你喜欢
      • 2021-06-18
      • 1970-01-01
      • 2019-08-03
      • 2021-03-17
      • 2021-12-21
      • 2017-05-27
      • 2020-08-22
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多