如何访问“ this.props.match.params”以及其他道具?

时间:2019-01-09 16:25:23

标签: javascript reactjs react-router

我的父组件中包含以下代码:

<Route path='/champions/:id' render={(props) => <ChampionDetails {...props} match={this.handleMatch}/>}/>

其中match道具将是一个从子组件(ChampionDetails)检索数据的函数。我的ChampionDetails(子级)组件的片段:

    import React, { Component } from 'react';

    class ChampionDetails extends Component {
      state = {
        champId:this.props.match.params.id,
        champData:null,
        match:false
      }

      componentDidMount(){
        console.log('ChampionDet mounted')
        this.handleChampInfo();
        console.log(this.props.match)
      }

      componentDidUpdate(){
        console.log('ChampionDet updated')
      }


      handleChampInfo=()=>{
        let champData = [];
        let id = this.state.champId
        console.log(id)
        fetch('/api/getChampion?id='+id)
          .then(data=> { return data.json() })
          .then(json=> {
            console.log(json.data);
            champData.push(json.data);
            this.setState({
              champData:json.data,
              match:true
            })
            this.props.match(true)
            // this.props.history.push('/champions/'+id)
          })
          .catch(err=>{
            console.log(err)
          })
      }

      render(){
        return(
          <div>
            <p>{this.state.champId}</p>
            {this.state.champData===null ? null:<p>{this.state.champData.roles}</p>}
          </div>
        )
      }
    }

    export default ChampionDetails;

这里的问题是,如果我的父母的路线中有match = {},那么this.props.match.params.id将变得不确定。如果删除match = {},则可以检索this.props.match.params.id

我想知道是否有可能在仍然可以访问this.props.match.params.id的情况下通过其他道具。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

如果您使用的react-router版本> = 4,则应该能够通过withRouter HoC访问路由器内部任何组件的路由器参数。例如:

import { withRouter } from 'react-router-dom';
...
export withRouter(ChampionDetails);

答案 1 :(得分:0)

您可以将matchProps作为路由器的道具,this.props作为父级的任何道具,然后避免覆盖道具-您的match道具将覆盖路线中的道具:

<Route path='/champions/:id' render={(matchProps) =>
  <ChampionDetails
    {...matchProps}
    {...this.props}
    handleMatch={this.handleMatch}
  />
}/>

当您传播{...props}时,您的match道具会覆盖反应路由器的match

答案 2 :(得分:0)

match道具是react-reouter-dom的一部分,因此通过制作另一个称为match的道具,您将其覆盖。

最简单的方法是将match={this.handleMatch}/>}重命名为其他名称 matchHandler={this.handleMatch}/>}

如果必须使用名称match,请将其破坏为const {matchHandler : match} = this.props