2017-04-13 39 views
7

Używam wersji React Router next i wygląda na to, że zrzucają parametry. Oczekuję, że poniższe przekierowanie zachowa wartość channelId, ale trasa to zamiast tego używa literalnego ciągu ":channelId".Router odpowiedzi Przekierowanie spada param

<Switch> 
    <Route exact path="/" component={Landing} /> 
    <Route path="/channels/:channelId/modes/:modeId" component={Window} /> 
    <Redirect 
    from="/channels/:channelId" 
    to="/channels/:channelId/modes/window" /> 
</Switch> 

To wygląda jak resolved issue, ale to nie działa. Czy jest coś jeszcze, co muszę przekazać na trasie to?

+0

Znalazłeś rozwiązanie, Matt? –

+0

@SebastianRoth Niestety nigdy tego nie zrobiłem. Robię teraz różne rzeczy, używając przekierowania w samym komponencie. Byłoby jednak świetnie, gdyby udało się to zweryfikować, ponieważ powinno działać tak, jak jest to reklamowane w wątku powiązanym powyżej. –

+1

FWIW, Zadałem to pytanie w kanale Discord z reagującym routerem. Skończyło się na zrobieniu czegoś podobnego, z trasą, która ma metodę renderowania, która zwraca Przekierowanie z wartościami wyciągniętymi z rekwizytów. –

Odpowiedz

4

nie znalazłem taką logikę w React Router 4 źródeł, więc pisać własne obejście: przykład

import pathToRegexp from 'path-to-regexp'; 
import { Route, Switch, Redirect } from 'react-router-dom'; 

const RedirectWithParams = ({ exact, from, push, to }) => { 
    const pathTo = pathToRegexp.compile(to); 
    return (
    <Route exact={exact} path={from} component={({ match: { params } }) => (
     <Redirect to={pathTo(params)} push={push} /> 
    )} /> 
    ); 
}; 

Zastosowanie:

<Switch> 
    <RedirectWithParams 
     exact from={'/resuorce/:id/section'} 
     to={'/otherResuorce/:id/section'} 
    /> 
</Switch> 
+0

Wygląda prawie tak samo jak twój kod: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/modules/recordation.js – coblr

+0

wielkie dzięki, właśnie to szukałem – Anil

2

Oto co używam, podobna do drugiej odpowiedzi ale bez zależnością:

<Route 
    exact 
    path="/:id" 
    render={props => (
    <Redirect to={`foo/${props.match.params.id}/bar`} />; 
)} 
/> 
0

można to zrobić:

<Switch> 
    <Route exact path="/" component={Landing} /> 
    <Route path="/channels/:channelId/modes/:modeId" component={Window} /> 
    <Route 
    exact 
    path="/channels/:channelId" 
    render={({ match }) => (
     <Redirect to={`/channels/${match.params.channelId}/modes/window`} /> 
    )} 
    /> 
</Switch> 
0

zrobiłem to i to działało:

<switch> 
 
    <Route path={`/anypath/:id`} component={Anycomponent} /> 
 
    <Route 
 
     exact 
 
     path="/requestedpath/:id" 
 
     render={({ match }) => { 
 
     if (!Auth.loggedIn()) { 
 
      return <Redirect to={`/signin`} />; 
 
     } else { 
 
      return <Redirect to={`/anypath/${match.params.id}`} />; 
 
     } 
 
     }} 
 
    /> 
 
</switch>