React-router:将道具传递给 children
React-router: Passing props to children
我正在尝试通过使用 react-router 构建一个非常基础的 "portfolio" 站点来学习 React。我的主要组件是:App、Work、Project 和 ProjectDetail。在 'Work' 页面上,您应该能够看到所有项目缩略图和标题。单击特定项目应将您转到该项目的详细信息页面,其中将包括该项目的其余详细信息。如何将 Project 的 props 传递给 ProjectDetail?
我的文件:
main.js
/*
Routes
*/
var routes = (
<Router history={createHistory()}>
<Route path="/" component={App}>
<IndexRoute component={Work} />
<Route path="work" component={Work} />
<Route path="work/:id" component={ProjectDetail} />
<Route path="about" component={About} />
</Route>
</Router>
);
ReactDOM.render(routes, document.getElementById('main'));
-
App.js
/*
App
*/
class App extends React.Component {
render() {
return (
<div>
<h1>App</h1>
<ul>
<li><Link to="/">Home</Link></li>
<li><Link to="/work">Work</Link></li>
<li><Link to="/about">About</Link></li>
</ul>
{this.props.children}
<footer>footer</footer>
</div>
)
}
}
export default App;
-
Work.js
class Work extends React.Component {
render() {
return (
<div>
<p>Work</p>
<ul>
{/* Need to loop of all projects */}
{PROJECTS.map(project => (
<li key={project.id}>
<Project project={project} />
</li>
))}
</ul>
</div>
)
}
}
export default Work;
-
Project.js
class Project extends React.Component {
render() {
var project = this.props.project;
var linkTo = "/work/" + project.id;
return (
<Link to={linkTo}>
{project.title}
<span> </span>
{project.type}
</Link>
)
}
}
export default Project;
-
ProjectDetail.js
class ProjectDetail extends React.Component {
render() {
return (
<div>
{/* THIS IS WHAT INFORMATION I NEED */}
{this.props.project.title}
{this.props.project.description}
{this.props.project.type}
{this.props.project.technologies}
</div>
)
}
}
export default ProjectDetail;
我可以访问我的 Project 组件中的数据,但是我如何将其传递给 ProjectDetail,因为我从未明确使用 ProjectDetail 组件(仅在我的路由中使用)?
编辑:我应该补充一点,我想我在技术上并没有尝试将道具传递给 child,因为一旦您被路由到 ProjectDetail,Project 就不再呈现。这会使这成为不可能吗?
您需要为您的路由使用 createElement 处理程序来控制路由处理程序的实例化。在那里你可以将道具传递给组件。 React-Router解耦了母子组件,任何状态传播都需要在路由中完成。
更新
根据您的编辑,在您的情况下,ProjectDetail 必须使用 this.props.params.id 重新查询适用的项目,例如...
ProjectDetail.js
class ProjectDetail extends React.Component {
render() {
let project = PROJECTS.find((item)=>item.id == this.props.params.id);
return (
<div>
{project.title}
{project.description}
{project.type}
{project.technologies}
</div>
)
}
}
我正在尝试通过使用 react-router 构建一个非常基础的 "portfolio" 站点来学习 React。我的主要组件是:App、Work、Project 和 ProjectDetail。在 'Work' 页面上,您应该能够看到所有项目缩略图和标题。单击特定项目应将您转到该项目的详细信息页面,其中将包括该项目的其余详细信息。如何将 Project 的 props 传递给 ProjectDetail?
我的文件:
main.js
/*
Routes
*/
var routes = (
<Router history={createHistory()}>
<Route path="/" component={App}>
<IndexRoute component={Work} />
<Route path="work" component={Work} />
<Route path="work/:id" component={ProjectDetail} />
<Route path="about" component={About} />
</Route>
</Router>
);
ReactDOM.render(routes, document.getElementById('main'));
-
App.js
/*
App
*/
class App extends React.Component {
render() {
return (
<div>
<h1>App</h1>
<ul>
<li><Link to="/">Home</Link></li>
<li><Link to="/work">Work</Link></li>
<li><Link to="/about">About</Link></li>
</ul>
{this.props.children}
<footer>footer</footer>
</div>
)
}
}
export default App;
-
Work.js
class Work extends React.Component {
render() {
return (
<div>
<p>Work</p>
<ul>
{/* Need to loop of all projects */}
{PROJECTS.map(project => (
<li key={project.id}>
<Project project={project} />
</li>
))}
</ul>
</div>
)
}
}
export default Work;
-
Project.js
class Project extends React.Component {
render() {
var project = this.props.project;
var linkTo = "/work/" + project.id;
return (
<Link to={linkTo}>
{project.title}
<span> </span>
{project.type}
</Link>
)
}
}
export default Project;
-
ProjectDetail.js
class ProjectDetail extends React.Component {
render() {
return (
<div>
{/* THIS IS WHAT INFORMATION I NEED */}
{this.props.project.title}
{this.props.project.description}
{this.props.project.type}
{this.props.project.technologies}
</div>
)
}
}
export default ProjectDetail;
我可以访问我的 Project 组件中的数据,但是我如何将其传递给 ProjectDetail,因为我从未明确使用 ProjectDetail 组件(仅在我的路由中使用)?
编辑:我应该补充一点,我想我在技术上并没有尝试将道具传递给 child,因为一旦您被路由到 ProjectDetail,Project 就不再呈现。这会使这成为不可能吗?
您需要为您的路由使用 createElement 处理程序来控制路由处理程序的实例化。在那里你可以将道具传递给组件。 React-Router解耦了母子组件,任何状态传播都需要在路由中完成。
更新 根据您的编辑,在您的情况下,ProjectDetail 必须使用 this.props.params.id 重新查询适用的项目,例如...
ProjectDetail.js
class ProjectDetail extends React.Component {
render() {
let project = PROJECTS.find((item)=>item.id == this.props.params.id);
return (
<div>
{project.title}
{project.description}
{project.type}
{project.technologies}
</div>
)
}
}