React Router passe Param au Component

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

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

je suis en train de l'accès à l' id dans la composante DetailsPage mais elle n'est pas accessible. J'ai essayé

<DetailsPage foo={this.props}/>

pour passer les paramètres à la page des détails, mais en vain.

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

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

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

alors une idée de comment passer L'ID sur la page des détails ?

16
demandé sur Mudit Tuli 2017-08-26 22:07:51

7 réponses

Si vous souhaitez passer des accessoires à un composant à l'intérieur d'un itinéraire, le plus simple est d'utiliser le render, comme ceci:

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

vous pouvez accéder aux accessoires à l'intérieur du DetailPage utilisation:

this.props.match
this.props.globalStore

{...props} est nécessaire pour passer l'origine de l'Itinéraire accessoires, sinon vous n'obtiendrez this.props.globalStore à l'intérieur du DetailPage.

25
répondu Win 2017-08-27 03:18:09

j'ai utilisé ceci pour accéder à L'ID dans mon component:

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

et dans la composante de détail:

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

cela rendra n'importe quel ID à l'intérieur d'un h2, espoir qui aide quelqu'un.

14
répondu Alexander Luna 2018-02-01 21:40:19

Utiliser la méthode de rendu:

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

Et vous devriez être en mesure d'accéder à l'id à l'aide de:

this.props.id

à l'Intérieur de la DetailsPage composant

9
répondu Steven Daniel Anderson 2017-08-27 03:12:19

Utiliser le composant:

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

Et vous devriez être en mesure d'accéder à l' id utilisation:

this.props.params.id

à l'intérieur du DetailsPage composant

2
répondu Dekel 2017-08-26 19:18:41

une autre solution consiste à utiliser un état et des crochets de cycle de vie dans le composant routé et une instruction de recherche dans le to propriété du <Link /> composant. Les paramètres de recherche peuvent ensuite être accessible via 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>
        )
      }
    }
1
répondu Manuel 2018-08-10 19:08:06

en plus de la réponse D'Alexander Lunas ... Si vous souhaitez ajouter plus d'un argument suffit d'utiliser:

<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>
    )
  }
}
0
répondu Manuel 2018-08-10 17:20:16

Voici la version dactylographiée. fonctionne sur "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>
    );
};

et composant

export class ProblemPage extends React.Component<ProblemRouteTokens> {

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

ProblemRouteTokens

export interface ProblemRouteTokens { problemId: string;}

0
répondu GSerjo 2018-09-12 14:26:27