【问题标题】:React-router Link, pass in paramsReact-router 链接,传入params
【发布时间】:2016-10-31 08:27:42
【问题描述】:

如果你有这样的路线:

<Route path="/users/:userId" />

然后您导出该路由,以便在您的应用中使用它,例如:

export const MY_ROUTE = '/users/:userId/';

<Route path={MY_ROUTE} />

如何动态设置链接中的参数?即我想这样做:

<Link to={MY_ROUTE} params={{userId: 1}} />

但是 params 完全被忽略了...查询只是进行查询 (?userId=) 而不是参数...有什么想法吗?

【问题讨论】:

  • 动态设置参数是什么意思?当您点击/users/123 时,应该会自动匹配路线

标签: reactjs react-router react-router-redux


【解决方案1】:

取自React Router official docs:

来自从 1.x 到 2.x 的升级指南:

&lt;Link to&gt;、onEnter 和 isActive 使用位置描述符

&lt;Link to&gt; 现在除了字符串之外还可以使用位置描述符。 不推荐使用查询和状态道具。

// v1.0.x

<Link to="/foo" query={{ the: 'query' }}/>

// v2.0.0

<Link to={{ pathname: '/foo', query: { the: 'query' } }}/>

很遗憾,不支持传入 param 对象,您自己也看到了。

为了动态使用您建议的路线,您必须按照以下方式进行操作:

<Link to={ MY_ROUTE.replace(':userId', '<someUserIdFromSomewhere>') }/>

或者您可以通过导出MY_ROUTE 的字符串而不是导出userLink 函数来进一步优化:

function userLink(userId) {
    return `/users/${userId}/`;
}

然后在任何你想使用Link 的地方使用它。

您可以在下面找到Link 组件上公开的受支持参数和API:

Router Link API

【讨论】:

  • 您可以尝试使用url-pattern 来构建您的网址:path={new UrlPattern(MY_ROUTE).stringify({ userId: 1})}。这不是一个完美的匹配,但对于简单的路线它可以工作
【解决方案2】:

我知道这是一个老问题,但是对于 React Router V4,您可以使用 path-to-regexp 包,React Router V4 也在使用它。

例子:

import {Link} from 'react-router-dom';
import {compile} from 'path-to-regexp';

const MY_ROUTE = '/users/:userId/';
const toPath = compile(MY_ROUTE);

// Now you can use toPath to generate Links dynamically
// The following will log '/users/42' to the console
console.log( toPath({ userId: 42 }) );

当然您也可以使用toPath 方法来创建正确的链接,例如:

<Link to={toPath({ userId: 42 })}>My Link</Link>

【讨论】:

  • 或者,更简单:&lt;Link to={`users/${user.id}`}&gt;My Link&lt;/Link&gt;
【解决方案3】:

你可以创建一个插入userId 参数的函数来创建路由,如下所示:

export const MY_ROUTE = (userId) => `/users/${userId}/`;

<Route path={MY_ROUTE(':userId')} />

所以在你的组件中

<Link to={MY_ROUTE(1)} params={{userId: 1}} />

在此处尝试此解决方案: https://jsbin.com/pexikoyiwa/edit?js,console

【讨论】:

  • 这应该是被接受的答案,它允许以最清晰的方式构建路由器所需的路径和重定向中的实际路径
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 2020-07-11
  • 2021-12-19
  • 2020-04-25
  • 2015-07-16
  • 2021-01-09
  • 2018-05-02
相关资源
最近更新 更多