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

Posted

技术标签:

【中文标题】Reactjs 将动态组件添加到其他组件中【英文标题】:Reactjs Add dynamic component into other component 【发布时间】:2017-12-02 18:22:47 【问题描述】:

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

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

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

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 ;

在我的测试中,只有第二种方法有效。第二种方法缺少“实例”(我猜是这样的)可能是问题所在? 如何开发 Base2 组件来接受这两种组件声明?

提前感谢您的帮助

【问题讨论】:

【参考方案1】:

首先像这样传递组件:

<Base child=<MyComponent/>/>

然后render props.child 在 Base2 组件中@,您编写 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>
);

【讨论】:

感谢您的快速回复。通过这些修改,只有第二种方法有效。我真的很想知道为什么它在一种情况下有效,而不是在第二种情况下有效。你对这两种方法都有什么策略吗?两种方法是否返回相同的输出?我不这么认为,因为只有一种方法是正确的。所以我一个人看不懂。 实际上,您向我展示了正确的方法,因为多亏了您的回复,我两种方法都成功了。我用解决方案回答我的问题。【参考方案2】:

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

【讨论】:

【参考方案3】:

在@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 ;

【讨论】:

以上是关于Reactjs 将动态组件添加到其他组件中的主要内容,如果未能解决你的问题,请参考以下文章

React JS - 用动态子组件组成通用表单

组件之外的 ReactJS 函数

如何将服务器端渲染中的数据从节点传递给reactjs组件

带键的 ReactJS 动态子项

如何动态地将组件作为子组件添加到指令中?

如何将组件动态添加到服务中的另一个组件