我的父组件中包含以下代码:
<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的情况下通过其他道具。
任何帮助将不胜感激!
答案 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