在React中动态添加子组件

时间:2016-04-15 15:48:06

标签: javascript reactjs babeljs

我的目标是在页面/父组件上动态添加组件。

我开始使用一些基本的示例模板:

main.js:

var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(<App/>, document.body);
ReactDOM.render(<SampleComponent name="SomeName"/>, document.getElementById('myId'));

App.js:

var App = React.createClass({
    render: function() {
        return (
            <div>
                <h1>App main component! </h1>
                <div id="myId">myId div</div>
            </div>

        );
    }

});

SampleComponent.js:

var SampleComponent = React.createClass({
    render: function() {
        return (
            <div>
                <h1>Sample Component! </h1>
            </div>
        );
    }
});

此处SampleComponent已安装到<div id="myId"></div>节点,该节点已在App.js模板中预先编写。但是如果我需要向App组件添加无限数量的组件呢?显然我不能拥有所有必需的div。

在阅读了一些教程之后,我仍然不了解如何创建组件并动态添加到父组件。这样做的方法是什么?

4 个答案:

答案 0 :(得分:48)

您需要将您的组件作为子项传递,如下所示:

var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(
    <App>
        <SampleComponent name="SomeName"/> 
    <App>, 
    document.body
);

然后将它们添加到组件的正文中:

var App = React.createClass({
    render: function() {
        return (
            <div>
                <h1>App main component! </h1>
                {
                    this.props.children
                }
            </div>
        );
    }
});

您不需要手动操作HTML代码,React会为您执行此操作。如果你想添加一些子组件,你只需要更改道具或根据它来说明。例如:

var App = React.createClass({

    getInitialState: function(){
        return [
            {id:1,name:"Some Name"}
        ]
    },

    addChild: function() {
        // State change will cause component re-render
        this.setState(this.state.concat([
            {id:2,name:"Another Name"}
        ]))
    }

    render: function() {
        return (
            <div>
                <h1>App main component! </h1>
                <button onClick={this.addChild}>Add component</button>
                {
                    this.state.map((item) => (
                        <SampleComponent key={item.id} name={item.name}/>
                    ))
                }
            </div>
        );
    }

});

答案 1 :(得分:5)

首先,I wouldn't use document.body。而是添加一个空容器:

index.html:

<html>
    <head></head>
    <body>
        <div id="app"></div>
    </body>
</html>

然后选择仅渲染您的<App />元素:

main.js:

var App = require('./App.js');
ReactDOM.render(<App />, document.getElementById('app'));

App.js内,您可以导入其他组件并完全忽略您的DOM呈现代码:

App.js:

var SampleComponent = require('./SampleComponent.js');

var App = React.createClass({
    render: function() {
        return (
            <div>
                <h1>App main component!</h1>
                <SampleComponent name="SomeName" />
            </div>
        );
    }
});

SampleComponent.js:

var SampleComponent = React.createClass({
    render: function() {
        return (
            <div>
                <h1>Sample Component!</h1>
            </div>
        );
    }
});

然后,您可以使用require将它们导入必要的组件文件,以编程方式与任意数量的组件进行交互。

答案 2 :(得分:3)

根据Chris的回答,在此处分享我的解决方案。希望它可以帮助别人。

我需要动态地将子元素附加到我的JSX中,但是比return语句中的条件检查更简单。我希望在子元素尚未准备好的情况下显示加载器。这是:

export class Settings extends React.PureComponent {
  render() {
    const loading = (<div>I'm Loading</div>);
    let content = [];
    let pushMessages = null;
    let emailMessages = null;

    if (this.props.pushPreferences) {
       pushMessages = (<div>Push Content Here</div>);
    }
    if (this.props.emailPreferences) {
      emailMessages = (<div>Email Content Here</div>);
    }

    // Push the components in the order I want
    if (emailMessages) content.push(emailMessages);
    if (pushMessages) content.push(pushMessages);

    return (
      <div>
        {content.length ? content : loading}
      </div>
    )
}

现在,我确实知道我也可以直接将{pushMessages}{emailMessages}放在我的return()下面,但假设我的条件内容更多,我的return()会只是看起来很杂乱。

答案 3 :(得分:2)

首先警告:你永远不应该修改由React管理的DOM,你通过调用<repositories> <repository> <id>sonatype</id> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> <snapshots /> </repository> </repositories>

来做

使用React,您应该直接在主App中使用SampleComponent。

ReactDOM.render(<SampleComponent ... />);

您的Component的内容无关紧要,但应该像这样使用:

var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(<App/>, document.body);

然后,您可以扩展您的应用组件以使用列表。

var App = React.createClass({
    render: function() {
        return (
            <div>
                <h1>App main component! </h1>
                <SampleComponent name="SomeName"/>
            </div>
        );
    }
});

我建议您查看React文档,然后按照“使用入门”说明进行操作。你花在这上面的时间会在以后得到回报。

https://facebook.github.io/react/index.html