React Router将参数传递给组件


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

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

我正在尝试访问DetailsPage组件中的ID,但无法访问它。我试过了

<DetailsPage foo={this.props}/>

将参数传递给DetailsPage,但徒劳。

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

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

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

所以有什么想法如何将ID传递给DetailsPage吗?

Answers:


92

如果要将props传递到路线内的组件,最简单的方法是利用render,如下所示:

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

您可以使用以下内容访问道具DetailPage

this.props.match
this.props.globalStore

{...props}需要通过原路线的道具,否则你将只能得到this.props.globalStoreDetailPage


1
但是,为什么它不能按照我在Ask中指定的方式工作?
Mudit Tuli

3
首先,您的代码是错误的。将组件放置在Route之内与<Route exact path="/details/:id" ><DetailsPage /></Route>并不相同<Route exact path="/details/:id" component={DetailsPage} />DetailsPage即使您访问了“ /”,您的代码也会呈现。其次,当您写信时<DetailsPage foo={this.props}/>this指的是null。这就是为什么它不起作用。
赢得

这给出了一个错误Warning: [react-router] You cannot change <Router routes>; it will be ignored
Hareesh

请打开一个新问题并在那里分享您的代码。
赢得

96

我用它来访问组件中的ID:

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

并在详细信息组件中:

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

这将在h2中呈现任何ID,希望对您有所帮助。


2
太棒了!我缺少“ .params”部分!谢谢!
Pedro Emilio Borrego

9
这应该是公认的答案,它更干净,更简单。
Shukri Adams

27

使用渲染方法:

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

并且您应该能够使用以下命令访问ID:

this.props.id

在DetailsPage组件内部


3
该btw也可以使用组件方法:<Route path="/..." component={props => <DetailsPage id={props.match.params.id}/>}/>
Mirko Brandt


7

除了Alexander Lunas的答案以外,如果您想添加多个参数,请使用:

<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

使用组件:

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

并且您应该能够id使用:

this.props.match.params.id

内部DetailsPage组件


有趣的作品。但是,为什么要分开,因为我想将变量传递给组件。 <Route exact path="/details/:id" > <DetailsPage globalStore={globalStore} /> </Route> 现在,传递globalStore不起作用。
Mudit Tuli

1
@Dekel我正在尝试做完全相同的事情,但出现错误。因此,我提出了一个新问题。链接:stackoverflow.com/questions/52652521/… 我正试图那样简单地访问控制台中的ID。
Arnab

如果您使用“渲染”,则可以使用“渲染”代替“路线”上的“组件”,这将带来良好的性能

4

另一种解决方案是在路由的组件中使用状态和生命周期挂钩,并在组件的to属性中使用搜索语句<Link />。搜索参数可以稍后通过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

这是打字稿版本。工作于"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>
    );
};

和组件

export class ProblemPage extends React.Component<ProblemRouteTokens> {

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

哪里 ProblemRouteTokens

导出接口ProblemRouteTokens {issueId:string; }


谢谢,那就更好了,更简单了,效果很好
Ridha Rezzag,

1
我可以确认它也适用于v5.1.2中的类组件
Matteus Barbosa,

1

如果您使用的是类组件,则最有可能使用GSerjo建议。通过<Route>道具将参数传递给目标组件:

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

-1

尝试这个。

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

在详细信息页面中尝试此...

this.props.id
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.