在将道具重新传递给儿童时(特别是在Route
内),我感到很困惑。例如:
class App extends Component {
constructor(props) {
this.sayHi = this.sayHi.bind(this);
}
sayHi() {
console.log('hi')
}
render() {
return (
<Router>
<Route path="/projects" component={(props, state, params) =>
<ProjectList
sayHi={this.sayHi}
{...props} />}
/>
</Router>
)
}
}
const ProjectList = (props) => {
return (
<Route path={`${props.match.url}/:id`} component={(props, state, params) =>
<ProjectDetail
sayHi={props.sayHi}
{...props} />}
/>
)
}
const ProjectDetail = (props) => {
console.log(props)
}
在ProjectList
组件中,访问sayHi
方法没有问题(我可以将其附加到此组件中的onClick
事件),但在ProjectDetail
中组件,我得到props.sayHi
的未定义。
我怎么错误地传递了这个道具?
答案 0 :(得分:4)
您只是同名参数的问题。在ProjectList
组件中:
<Route path={`${props.match.url}/:id`} component={(props, state, params) =>
<ProjectDetail
sayHi={props.sayHi}
{...props} />}
/>
当您创建ProjectDetail
元素并传递sayHi
道具时,您必须访问 ProjectList
的道具,而不是道具箭头函数(道具Route
passes)。参数是&#34;覆盖&#34;彼此因为它们名称相同,props
。所以,试试:
const ProjectList = (props) => {
return (
<Route path={`${props.match.url}/:id`} component={(routeProps, state, params) => // use name "routeProps" instead of "props"
<ProjectDetail
sayHi={props.sayHi}
{...props} />}
/>
)
}
我们将props
道具箭头功能中的component
重命名为routeProps
,这将消除名称冲突。这样,ProjectList
的道具就传递给ProjectDetail
,而不是Route
传递的道具。