Reagisci router con parametro percorso opzionale


306

Voglio dichiarare un percorso con un parametro di percorso opzionale, quindi quando lo aggiungo alla pagina per fare qualcosa in più (ad esempio riempire alcuni dati):

http: // localhost / app / path / to / page <= visualizza la pagina http: // localhost / app / path / to / page / pathParam <= visualizza la pagina con alcuni dati in base a pathParam

Nel mio router di reazione ho i seguenti percorsi, al fine di supportare le due opzioni (questo è un esempio semplificato):

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

La mia domanda è: possiamo dichiararla in un percorso? Se aggiungo solo la seconda riga, il percorso senza il parametro non viene trovato.

EDIT # 1:

La soluzione menzionata qui sulla seguente sintassi non ha funzionato per me, è corretta? Esiste nella documentazione?

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

La mia versione di reagente-router è: 1.0.3

Risposte:


650

La modifica che hai pubblicato era valida per una versione precedente di React-router (v0.13) e non funziona più.


React Router v1, v2 e v3

Dalla versione 1.0.0definisci i parametri opzionali con:

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

e per più parametri opzionali :

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

È possibile utilizzare la parentesi ( )per avvolgere le parti facoltative del percorso, inclusa la barra ( /). Consulta la pagina della guida di abbinamento del percorso della documentazione ufficiale.

Nota: Il :paramNameparametro corrisponde a un segmento di URL fino al prossimo /, ?o #. Per ulteriori informazioni su percorsi e parametri, leggi di più qui .


React Router v4 e versioni successive

React Router v4 è sostanzialmente diverso da v1-v3 e i parametri del percorso facoltativo non sono nemmeno esplicitamente definiti nella documentazione ufficiale .

Al contrario, viene richiesto di definire un pathparametro comprensibile per path-to-regexp . Ciò consente una flessibilità molto maggiore nella definizione dei percorsi, ad esempio motivi ripetuti, caratteri jolly, ecc. Quindi, per definire un parametro come facoltativo, aggiungere un punto interrogativo finale ( ?).

Pertanto, per definire un parametro facoltativo, devi:

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

e per più parametri opzionali :

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

Nota: React Router v4 non è compatibile con( leggi di più qui ). Utilizzare invece la versione v3 o precedente (v2 consigliata).


2
Questa è ancora una domanda su più parametri opzionali nell'URL, come/route(/:category/(:article)
Alex Shwarc,

1
@AlexShwarc, buon punto, grazie. Ho aggiunto il codice per dimostrare più parametri opzionali. Dare un'occhiata.
Chris,

1
@Chris Sono sicuro, non funziona in questo modo, l'hai verificato?
Alex Shwarc,

@Chris con la versione 3
Alex Shwarc

1
Posso creare parametri di percorso opzionali sulla rotta principale? Ad esempio, ho bisogno di aggiungere la lingua param al percorso e l'URL della mia homepage sarà "/" e "/ en" Ecco la demo
Kholiavko

76

Per tutti gli utenti di React Router v4 che arrivano qui dopo una ricerca, i parametri opzionali in a <Route>sono indicati con un ?suffisso.

Ecco la documentazione pertinente:

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

percorso: stringa

Qualsiasi percorso URL valido da percorso a regexp comprensibile .

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

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

Opzionale

I parametri possono essere suffissi con un punto interrogativo (?) Per rendere facoltativo il parametro. Questo renderà anche il prefisso opzionale.


Semplice esempio di una sezione impaginata di un sito a cui è possibile accedere con o senza un numero di pagina.

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

@ user2928231 Grazie, aggiornato con il loro nuovo URL dei documenti. Per quanto ne so <Match pattern />ora è di <Route path />nuovo, ma il suffisso del punto interrogativo rimane ora l'approccio per la gestione dei parametri opzionali.
Giovanni,

2
Ciao! Ho ancora un problema con parametro opzionale e non posso fare prossimi percorsi di lavoro: ho players, players/123, players/123/edit, players?unseen=true. Il parametro opzionale ?unseennon funziona per me. anche se ho provato tutte le correzioni da questa discussione. Potresti aiutare con la stringa del percorso corretta, che gestirà questo? Grazie in anticipo!
Khrystyna Skvarok,

Ciao @KhrystynaSkvarok, hai mai capito come far funzionare il tuo percorso con una stringa di query opzionale? Sto provando a fare lo stesso
sabliao il

2
@sabliao Hi! Non ho un esempio funzionante, ma per URL come example.com/search?query=testprovare a usare il modello successivo /:search(search).
Khrystyna Skvarok,

Come posso ottenere parametri dall'URL dopo il delimitatore?
PHP Ninja

15

Sintassi di lavoro per più parametri opzionali:

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

Ora, l'URL può essere:

  1. /sezione
  2. / Section / page / 1
  3. / Section / page / 1 / sort / asc

1

per reattivo-router V5 e versioni successive utilizzare la sintassi seguente per percorsi multipli

<Route
          exact
          path={[path1, path2]}
          component={component}
        />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.