React-router Link, перейдите в params

Если у вас есть маршрут, например:

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

И затем вы экспортируете этот маршрут, и поэтому его можно использовать в вашем приложении, например:

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

<Route path={MY_ROUTE} />

Как вы устанавливаете параметр в ссылке динамически? то есть я хотел бы сделать это:

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

но параметры полностью игнорируются... и запрос просто делает запрос (? userId =) не параметром... любые идеи?

Ответ 1

Взято из Официальные документы React Router:

В руководстве по обновлению от 1.x до 2.x:

<Link to>, onEnter и isActive используют дескрипторы местоположения

<Link to> теперь может использовать дескриптор местоположения в дополнение к строкам. Реквизиты запроса и состояния устарели.

//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 для маршрута.

Ниже вы можете найти поддерживаемые параметры и API, выставленные на компоненте Link:

API-интерфейс маршрутизатора

Ответ 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>

Ответ 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