React Router Pass Param an Component


74
const rootEl = document.getElementById('root');

ReactDOM.render(
    <BrowserRouter>
        <Switch>
            <Route exact path="/">
                <MasterPage />
            </Route>
            <Route exact path="/details/:id" >
                <DetailsPage />
            </Route>
        </Switch>
    </BrowserRouter>,
    rootEl
);

Ich versuche, auf die ID in der DetailsPage-Komponente zuzugreifen, aber es ist nicht zugänglich. Ich habe es versucht

<DetailsPage foo={this.props}/>

Parameter an die DetailsPage zu übergeben, aber vergebens.

export default class DetailsPage extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <div className="page">
            <Header />
            <div id="mainContentContainer" >

            </div>
            </div>
    );
    }
}

Haben Sie also eine Idee, wie Sie die ID an die Detailseite weitergeben können?

Antworten:


91

Wenn Sie Requisiten an eine Komponente innerhalb einer Route übergeben möchten, verwenden Sie am einfachsten Folgendes render:

<Route exact path="/details/:id" render={(props) => <DetailsPage globalStore={globalStore} {...props} /> } />

Sie können auf die Requisiten im folgenden zugreifen DetailPage:

this.props.match
this.props.globalStore

Das {...props}wird benötigt, um die Requisiten der Originalroute zu passieren, sonst gelangen Sie nur this.props.globalStorein die DetailPage.


1
Aber warum sollte es nicht so funktionieren, wie ich es in der Frage angegeben habe?
— Mudit Tuli

3
Erstens war Ihr Code falsch. Das Platzieren einer Komponente in einer Route wie <Route exact path="/details/:id" ><DetailsPage /></Route>war nicht dasselbe wie <Route exact path="/details/:id" component={DetailsPage} />. Ihr Code wurde DetailsPageauch dann gerendert , wenn Sie '/' besucht haben. Zweitens, als Sie geschrieben haben <DetailsPage foo={this.props}/>, thisverwiesen null. Deshalb hat es nicht funktioniert.
— Gewinnen Sie den

Dies gibt einen FehlerWarning: [react-router] You cannot change <Router routes>; it will be ignored
— Hareesh

Bitte öffnen Sie eine neue Frage und teilen Sie Ihren Code dort.
— Gewinnen Sie am

95

Ich habe dies verwendet, um auf die ID in meiner Komponente zuzugreifen:

<Route path="/details/:id" component={DetailsPage}/>

Und in der Detailkomponente:

export default class DetailsPage extends Component {
  render() {
    return(
      <div>
        <h2>{this.props.match.params.id}</h2>
      </div>
    )
  }
}

Dadurch wird jede ID in einem h2 gerendert, hoffentlich hilft das jemandem.


2
Fantastisch! Mir fehlte der Teil ".params"! Vielen Dank!
— Pedro Emilio Borrego Rached

9
Dies sollte die akzeptierte Antwort sein, es ist sauberer und einfacher.
— Shukri Adams

27

Verwenden Sie die Rendermethode:

<Route exact path="/details/:id" render={(props)=>{
    <DetailsPage id={props.match.params.id}/>
}} />

Und Sie sollten in der Lage sein, auf die ID zuzugreifen, indem Sie:

this.props.id

Innerhalb der DetailsPage-Komponente


3
Dies funktioniert übrigens auch mit der Komponentenmethode:<Route path="/..." component={props => <DetailsPage id={props.match.params.id}/>}/>
— Mirko Brandt


7

Zusätzlich zu Alexander Lunas Antwort ... Wenn Sie mehr als ein Argument hinzufügen möchten, verwenden Sie einfach:

<Route path="/details/:id/:title" component={DetailsPage}/>

export default class DetailsPage extends Component {
  render() {
    return(
      <div>
        <h2>{this.props.match.params.id}</h2>
        <h3>{this.props.match.params.title}</h3>
      </div>
    )
  }
}

7

Verwenden Sie die Komponente:

<Route exact path="/details/:id" component={DetailsPage} />

Und Sie sollten in der Lage sein, auf Folgendes zuzugreifen id:

this.props.match.params.id

Innerhalb der DetailsPageKomponente


Interessant funktioniert das. Warum war dies jedoch separat, weil ich eine Variable an die Komponente übergeben wollte. <Route exact path="/details/:id" > <DetailsPage globalStore={globalStore} /> </Route> Das Übergeben des globalStore funktioniert jetzt nicht mehr.
— Mudit Tuli

1
@Dekel Ich versuche genau das Gleiche zu tun, aber ich erhalte eine Fehlermeldung. Also habe ich eine neue Frage erstellt. link: stackoverflow.com/questions/52652521/… Ich versuche so einfach auf die ID in der Konsole zuzugreifen.
— Arnab

Anstelle von 'Komponente' auf 'Route' wird bei Verwendung von 'Rendern' eine gute Leistung
— erzielt

4

Eine andere Lösung besteht darin, einen Status- und Lebenszyklus-Hook in der gerouteten Komponente und eine Suchanweisung in der toEigenschaft der <Link />Komponente zu verwenden. Auf die Suchparameter kann später zugegriffen werden über new URLSearchParams();

<Link 
  key={id} 
  to={{
    pathname: this.props.match.url + '/' + foo,
    search: '?foo=' + foo
  }} />

<Route path="/details/:foo" component={DetailsPage}/>

export default class DetailsPage extends Component {

    state = {
        foo: ''
    }

    componentDidMount () {
        this.parseQueryParams();
    }

    componentDidUpdate() {
        this.parseQueryParams();
    }

    parseQueryParams () {
        const query = new URLSearchParams(this.props.location.search);
        for (let param of query.entries()) {
            if (this.state.foo!== param[1]) {
                this.setState({foo: param[1]});
            }
        }
    }

      render() {
        return(
          <div>
            <h2>{this.state.foo}</h2>
          </div>
        )
      }
    }

3

Hier ist eine Typoskript-Version. arbeitet weiter"react-router-dom": "^4.3.1"

export const AppRouter: React.StatelessComponent = () => {
    return (
        <BrowserRouter>
            <Switch>
                <Route exact path="/problem/:problemId" render={props => <ProblemPage {...props.match.params} />} />
                <Route path="/" exact component={App} />
            </Switch>
        </BrowserRouter>
    );
};

und Komponente

export class ProblemPage extends React.Component<ProblemRouteTokens> {

    public render(): JSX.Element {
        return <div>{this.props.problemId}</div>;
    }
}

wo ProblemRouteTokens

Exportschnittstelle ProblemRouteTokens {problemId: string; }}


Danke, das ist viel besser und einfacher funktioniert großartig
— Ridha Rezzag

1
Ich kann bestätigen, dass es auch in v5.1.2 für Klassenkomponenten funktioniert
— Matteus Barbosa

1

Wenn Sie eine Klassenkomponente verwenden, verwenden Sie höchstwahrscheinlich den GSerjo-Vorschlag. Übergeben Sie die Parameter über <Route>Requisiten an Ihre Zielkomponente:

exact path="/problem/:problemId" render={props => <ProblemPage {...props.match.params} />}

-1

Versuche dies.

<Route exact path="/details/:id" render={(props)=>{return(
    <DetailsPage id={props.match.params.id}/>)
}} />

Auf der Detailseite versuchen Sie dies ...

this.props.id
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.