Reactjs将动态组件添加到其他组件中

时间:2017-06-29 07:10:38

标签: javascript reactjs components render

我正在尝试使用reactjs开发一个webapp,我有一个问题。经过一天多的研究,我不明白该怎么做。

我想使用一个组件,它是我页面的主要布局,添加其他组件以显示在其中。

在组件Base2中,子道具包含另一个组件。

import React from 'react';
import PropTypes from 'prop-types';
import { Link, NavLink } from 'react-router-dom';

const Base2 = (child) => (

    <div>
        <div className="top-bar">
            <div className="top-bar-left">
                <NavLink to="/">React App</NavLink>
            </div>

            <div className="top-bar-right">
                <Link to="/login">Log in</Link>
            </div>

        </div>

        <child/> // HERE the dynamic component

    </div>
);

export default Base2;

调用它的函数是:

const TestBase = ({props}) => {
    return (<Base child={MyComponent}/>)
};

此外,MyComponent可以是一个类声明,遵循以下两种方法:

import React from 'react';
import LoginForm from '../components/LoginForm.jsx';

class MyComponent extends React.Component{
    constructor(props) {
        super(props);
    ...
    }
    render() {
        return (
            <LoginForm
                onSubmit={this.processForm}
                onChange={this.changeUser}
                errors={this.state.errors}
                user={this.state.user}
            />
        );
    }

}

export default LoginPage;

第二种方法:

import React from 'react';
import { Card, CardTitle } from 'material-ui/Card';

const MyComponent = {
    render()  {
        return (<Card className="container">
            <CardTitle title="React Application" subtitle="Home         page." />
        </Card>);
    }
};

export default MyComponent ;

在我的测试中,只有第二种方法有效。缺乏&#34;实例&#34; (从某种意义上说,我猜)从第二种方法可能是问题? 如何开发Base2组件以采用这两种类型的组件声明?

提前感谢您的帮助

3 个答案:

答案 0 :(得分:3)

首先传递这样的组件:

<Base child={<MyComponent/>}/>

然后render在Base2组件中props.child,你编写Base2组件的方式,child(只是参数名)的值props不是直接组件你正在传递props

像这样写:

const Base2 = (props) => ( 
    <div>
        <div className="top-bar">
            <div className="top-bar-left">
                <NavLink to="/">React App</NavLink>
            </div>

            <div className="top-bar-right">
                <Link to="/login">Log in</Link>
            </div>
        </div>

        {props.child}   //here

    </div>
);

答案 1 :(得分:0)

在第二种方法中似乎是一个包含render方法的简单json。要在第二个方法中创建组件,似乎是在es5中编写的,你必须使用react.createClass({render ...}) 在互联网上寻找你会发现很多es5例子

答案 2 :(得分:0)

在@Mayank Shukla的帮助下,我找到了最佳方法。

import React from 'react';
import PropTypes from 'prop-types';
import { Link, NavLink } from 'react-router-dom';

const Base2 = (props) => (

    <div>
        <div className="top-bar">
            <div className="top-bar-left">
                <NavLink to="/">React App</NavLink>
            </div>

            <div className="top-bar-right">
                <Link to="/login">Log in</Link>
            </div>

        </div>

        {props.child}

    </div>
);

export default Base2;

调用它的函数是:

const TestBase = (props) => {
    return (<Base2 child={<MyComponent/>}/>)
};

第一种方法:

import React from 'react';
import LoginForm from '../components/LoginForm.jsx';

class MyComponent extends React.Component{
    constructor(props) {
        super(props);
    ...
    }
    render() {
        return (
            <LoginForm
                onSubmit={this.processForm}
                onChange={this.changeUser}
                errors={this.state.errors}
                user={this.state.user}
            />
        );
    }

}

export default LoginPage;

第二种方法:

import React from 'react';
import { Card, CardTitle } from 'material-ui/Card';

const MyComponent = (props) =>{

        return (<Card className="container">
            <CardTitle title="React Application" subtitle="Home         page." />
        </Card>);

};

export default MyComponent ;