【问题标题】:React-router: Passing props to childrenReact-router:将道具传递给孩子
【发布时间】:2016-03-19 16:01:30
【问题描述】:

我正在尝试通过使用 react-router 构建一个非常基本的“投资组合”网站来学习 React。我的主要组件是:App、Work、Project 和 ProjectDetail。在“工作”页面上,您应该能够看到所有项目的缩略图和标题。单击特定项目应将您引导至该项目的详细信息页面,该页面将包括该项目的其余详细信息。如何将 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?

编辑:我应该补充一点,我想我在技术上并没有尝试将道具传递给孩子,因为一旦您被路由到 ProjectDetail,Project 就不再呈现。这样就不可能了吗?

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    您需要为您的路由使用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>
            )
        }
    }
    

    【讨论】:

    • 你能提供一个小例子来说明我将如何实现这个吗?关于这个处理程序的文档不多。
    • 添加了一个代码 sn-p 应该适用于您的情况。
    • 谢谢!因为我在 Work.js 文件中导入 PROJECTS,所以我必须在 ProjectDetail.js 中再次导入它们,对吗?是不是有点多余?有没有办法只导入一次?
    • 虽然这是一个与原始问题不同的主题,但我建议您开始阅读有关 Flux 的内容,因为它使 React 中的状态管理和传播更容易。我发现 Reflux 库最简单,但你应该寻找你最喜欢的。要回答您的确切问题,导入并不昂贵,因为“需要”会缓存它们。
    • 谢谢。我一直想调查那些。
    猜你喜欢
    • 2018-07-29
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2017-06-03
    相关资源
    最近更新 更多