Маршрутизатор реагування з додатковим параметром шляху


306

Я хочу оголосити шлях із необов'язковим параметром шляху, отже, коли я додаю його на сторінку, щоб зробити щось додаткове (наприклад, заповнити деякі дані):

http: // localhost / app / path / to / page <= візуалізація сторінки http: // localhost / app / path / to / page / pathParam <= візуалізація сторінки з деякими даними відповідно до pathParam

У моєму маршрутизаторі реакцій у мене є такі шляхи, щоб підтримувати два варіанти (це спрощений приклад):

<Router history={history}>    
   <Route path="/path" component={IndexPage}>
      <Route path="to/page" component={MyPage}/>
      <Route path="to/page/:pathParam" component={MyPage}/>
   </Route>    
</Router>

Моє запитання: чи можемо ми оголосити це одним маршрутом? Якщо я додаю лише другий рядок, то маршрут без параметра не знайдений.

РЕДАКТИКА №1:

Згадане тут рішення про наступний синтаксис не спрацювало для мене, чи це правильне? Чи існує вона в документації?

<Route path="/product/:productName/?:urlID?" handler={SomeHandler} />

Моя версія реактор-маршрутизатора: 1.0.3

Відповіді:


650

Опублікована вами редакція була дійсною для старішої версії React-маршрутизатора (v0.13) і більше не працює.


Реагувати маршрутизатор v1, v2 та v3

Оскільки у версії 1.0.0ви визначаєте необов'язкові параметри за допомогою:

<Route path="to/page(/:pathParam)" component={MyPage} />

і для кількох необов'язкових параметрів:

<Route path="to/page(/:pathParam1)(/:pathParam2)" component={MyPage} />

Ви використовуєте дужки, ( )щоб обернути необов'язкові частини маршруту, включаючи провідну косу рису ( /). Перегляньте сторінку Посібника з узгодження маршруту в офіційній документації.

Примітка: параметр відповідає сегменту URL до наступного , або . Більше про шляхи та парами, зокрема, читайте тут .:paramName/?#


Реагуйте маршрутизатором v4 і вище

Реактивний маршрутизатор v4 принципово відрізняється, ніж v1-v3, і необов'язкові параметри шляху також чітко не визначені в офіційній документації .

Натомість вам доручено визначити pathпараметр, який розуміє шлях до regexp . Це дозволяє набагато більшу гнучкість у визначенні ваших шляхів, таких як повторення шаблонів, макіяжів тощо. Отже, щоб визначити параметр як необов'язковий, ви додаєте трейлінг-знак питання ( ?).

Таким чином, щоб визначити необов'язковий параметр, ви зробите:

<Route path="/to/page/:pathParam?" component={MyPage} />

і для кількох необов'язкових параметрів:

<Route path="/to/page/:pathParam1?/:pathParam2?" component={MyPage} />

Примітка: React Router v4 несумісний з( детальніше читайте тут ). Використовуйте натомість версію v3 або новішу (рекомендується v2).


2
Це все ще питання про декілька необов’язкових парам в URL, як-от/route(/:category/(:article)
Алекс Шварц,

1
@AlexShwarc, хороший момент, дякую. Я додав код, щоб продемонструвати кілька необов'язкових параметрів. Подивитися.
Кріс

1
@Chris Я впевнений, це не працює таким чином, ви це перевірили?
Алекс Шварц

@Chris з 3 версією
Alex Shwarc

1
Чи можу я створити необов'язковий параметр шляху до основного маршруту? Наприклад, мені потрібно додати параметр мови до шляху, і моєю URL-адресою домашньої сторінки будуть "/" та "/ en" Ось демонстрація
Холявко

76

Для будь-яких користувачів React Router v4, які приїжджають сюди після пошуку, необов’язкові параметри в a <Route>позначаються ?суфіксом.

Ось відповідна документація:

https://reacttraining.com/react-router/web/api/Route/path-string

шлях: рядок

Будь-який дійсний шлях URL-адреси, який розуміє шлях до повторного виразу .

<Route path="/users/:id" component={User}/>

https://www.npmjs.com/package/path-to-regexp#optional

За бажанням

Параметри можна суфіксувати знаком питання (?), Щоб зробити параметр необов’язковим. Це також зробить префікс необов’язковим.


Простий приклад хворобливого розділу сайту, до якого можна отримати доступ із номером сторінки або без неї.

<Route path="/section/:page?" component={Section} />

@ user2928231 Спасибі, оновлені новими URL-адресами документів. Наскільки я можу сказати, <Match pattern />це <Route path />знову, але суфікс питання питання залишається підходом зараз для обробки необов'язкових парам.
Джон

2
Привіт! Я до сих пір є проблеми з додатковим параметром і не можу зробити наступні маршрути роботи: Я players, players/123, players/123/edit, players?unseen=true. Необов’язковий параметр ?unseenдля мене не працює. хоча я спробував усі виправлення з цієї дискусії. Чи можете ви допомогти з відповідним рядком шляху, який вирішить це? Спасибі заздалегідь!
Христина Скварок

Привіт @KhrystynaSkvarok, ти коли-небудь замислювався, як змусити працювати ваш шлях без додаткової рядки запиту? Я намагаюся зробити те саме
sabliao

2
@sabliao Привіт! У мене немає робочого прикладу, але для такої URL-адреси, як example.com/search?query=testспробувати використовувати наступний зразок /:search(search).
Христина Скварок

Як я можу отримати параметри з URL-адреси після роздільника?
PHP Ninja

15

Робочий синтаксис для декількох необов’язкових парам:

<Route path="/section/(page)?/:page?/(sort)?/:sort?" component={Section} />

Тепер URL може бути:

  1. / розділ
  2. / розділ / сторінка / 1
  3. / розділ / сторінка / 1 / сортування / ух

1

для реактора-маршрутизатора V5 і вище використовувати нижче синтаксису для кількох шляхів

<Route
          exact
          path={[path1, path2]}
          component={component}
        />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.