【问题标题】:react router relative link does not link properly反应路由器相对链接未正确链接
【发布时间】:2018-01-03 21:50:48
【问题描述】:

所以我正在使用 npm 包 react-router-relative (https://www.npmjs.com/package/react-router-relative),但它似乎没有正确切换 url。

这是我的链接的样子:

<Link to='items' className="btn btn-default submission-button">Items</Link>
<Link to='maps' className="btn btn-default submission-button">Maps</Link>

这是我的路线:

<Route path="submissions" component={SubmissionPage}>
    <Route path="items" component={ItemSubmissions}></Route>
    <Route path="maps" component={MapSubmissions}></Route>
</Route>

发生的情况是我第一次点击链接时它会正确链接,即

http://localhost:3000/#/account/submissions/items

但是当我再次点击它时,它会转到:

http://localhost:3000/#/account/submissions/items/items

此时结束部分将切换而不是追加,但会引发错误。

但是,我正在尝试在“提交”切换之后立即制作该部分,即account/submissions/itemsaccount/submissions/maps

我做错了什么?


我已经尝试过这个的非相对链接变体,即{this.props.location.pathname + '/items'},但它只是做同样的事情。

【问题讨论】:

  • 你试过to="/items"吗?
  • @DayanMorenoLeon 就是http://localhost:3000/#/items。这基本上就像命令行路径。
  • 从 react-router-dom 导入 Switch 并将路由标签放在其中。有帮助吗?
  • 它已被废弃,不再维护,但正如@DayanMorenoLeon 建议的那样,您可以尝试&lt;Link to='/submissions/items' &gt;
  • @Ozan 你能举个例子吗?我目前正在尝试,但似乎无法正确完成。

标签: javascript reactjs react-router


【解决方案1】:

首先,让我们强调相对链接的概念。 这是一个链接,可将您带到取决于您已经在哪里。

意思是,如果您在不同位置(URL)使用相同相对链接,结果会有所不同。直接的含义是,如果您希望相对链接只有一个给定的行为,则不能在多个地方使用它。

在您的情况下会发生 same 相对链接出现在不同的 URL 中,从而导致不同的结果。

你能做什么: 如前所述,您可以使用链接here 的页面中建议的currentPath 道具。 结果会是这样的:

<Link to='items' currentPath='/submissions'>Items</Link>
<Link to='maps' currentPath='/submissions'>Maps</Link>

看起来像是伪装的绝对路径:

<Link to='/submissions/items'>Items</Link>
<Link to='/submissions/maps'>Maps</Link>

相对路径的解决方案是:

<Link to='../items'>Items</Link>
<Link to='../maps'>Maps</Link>

但请记住,这些链接是相对的,应该只显示在一个地方,在你的情况下是#/submissions/somewhere

如果您想要一个无论当前位置如何都能将您带到同一页面的链接,您应该使用绝对链接。

到目前为止,我还没有想出很多相对链接的用途。 返回:&lt;Link to=".."&gt;Go back&lt;/Link&gt; 或者常见的操作:&lt;Link to="./edit"&gt;Edit&lt;/Link&gt;

总而言之,我想说,当只期望一种行为时,不需要相对链接。一种行为意味着一种路线,如果您知道路线,您还不如使用绝对链接。仅当您期望不同的行为时才应使用相对链接。

【讨论】:

    【解决方案2】:

    我已经搜索了你的问题,我找到了这个有用的包react-router-relative-links

    要在终端中安装它:

    npm install react-router-relative-links react-router-apply-middleware
    

    然后在您的路由文件中,您将像这样应用中间件:

    import { Router, Route, browserHistory } from 'react-router';
    import applyMiddlewareRouter from 'react-router-apply-middleware'
    import { useRelativeLinks } from 'react-router-relative-links'
    
    
    <Router history={browserHistory} render={applyMiddlewareRouter(useRelativeLinks())}>
      <Route path="submissions" component={SubmissionPage}>
        <Route path="items" component={ItemSubmissions}></Route>
        <Route path="maps" component={MapSubmissions}></Route>
      </Route>
    </Router>
    

    那么任何时候你需要添加一个导航链接,你可以像这样添加它: 我们假设当前路径是localhost:8080/account/submissions

    <RelativeLink to='./items'>test</RelativeLink> # to localhost:8080/account/submissions/items
    <RelativeLink to='./maps'>test</RelativeLink> # to localhost:8080/account/submissions/maps
    

    ,不过最好使用react-router提供的Link组件

    【讨论】:

    • 软件包有点旧,因为它需要 router@2。但它确实有效
    • 我相信你最好的选择是react router提供的&lt;Link&gt;
    • 嗯,我可能不得不在当前路径上做正则表达式。如果到期没有人回答,我会给你赏金。
    • 我会对您的问题进行投票,以获得足够的关注,以便专业人士可以帮助您实现这一目标。
    【解决方案3】:

    如果您将currentPath 道具传递给您的链接,它将开始工作。否则,如果您不定义当前路径。它落到window.location.hash 这不好。

    <Link to='/items' currentPath='/submissions' className="btn btn-default submission-button">Items</Link>
    <Link to='/maps' currentPath='/submissions' className="btn btn-default submission-button">Maps</Link>
    

    我相信 npmreact-router-relative 有点错误。 就个人而言,我不建议您在生产中使用。

    【讨论】:

    • 是的,它给了我一个Warning: Accessing PropTypes via the main React package is deprecated. Use the prop-types package from npm instead.。任何其他类型的相对方式,可能没有 react-router-relative?也许我应该使用一些正则表达式来检查它是否以提交结束?
    • @A.Lau,我建议使用react-router,这是定义和使用路线的有效方式
    【解决方案4】:

    除此之外,我找不到任何其他方法。不幸的是,react-router 不支持相对路径,但解决方法是使用 Switch,然后在适合您使用的情况下在组件中生成绝对路径。在导入 Switch 方法之前,您必须将您的 react-router 更新到 4+。

    import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
    
    <Router>
        <Switch>
        <Route path="submissions" component={SubmissionPage} />
        <Route path="items" component={ItemSubmissions} />
        <Route path="maps" component={MapSubmissions} />
      </Switch>
    </Router>
    

    但如果我像你一样只使用两条路径,最终分别是 /accounts/submissions/items 和 /maps,我可能会坚持使用 &lt;Route path="/accounts/submissions/items" component={MapSubmissions} /&gt;

    P.S:我只是指出我的方法和解决方案。我不确定它是否会导致其他问题。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 1970-01-01
      • 2020-11-24
      • 2019-04-06
      • 2018-04-15
      • 2018-02-07
      • 2018-02-16
      • 2017-07-09
      • 2019-02-04
      相关资源
      最近更新 更多