如何在没有JSX的情况下渲染多个孩子

时间:2014-12-04 09:07:36

标签: javascript reactjs

如何在不使用JSX的情况下编写此内容?

 var CommentBox = React.createClass({
  render: function() {
    return (
      <div className="commentBox">
        <h1>Comments</h1>
        <CommentList />
        <CommentForm />
      </div>
    );
  }
});

这来自react.js教程:http://facebook.github.io/react/docs/tutorial.html

我知道我可以做到以下几点:

return (
   React.createElement('div', { className: "commentBox" },
        React.createElement('h1', {}, "Comments")
)

但这只会增加一个元素。如何在彼此旁边添加更多内容。

5 个答案:

答案 0 :(得分:14)

您可以使用在线Babel REPLhttps://babeljs.io/repl/)作为将小块JSX转换为等效JavaScript的快捷方式。

var CommentBox = React.createClass({displayName: 'CommentBox',
  render: function() {
    return (
      React.createElement("div", {className: "commentBox"}, 
        React.createElement("h1", null, "Comments"), 
        React.createElement(CommentList, null), 
        React.createElement(CommentForm, null)
      )
    );
  }
});

它还可以方便地检查它支持的ES6变换器的转换器输出。

答案 1 :(得分:5)

insin的答案是直接翻译,但您可能更喜欢使用工厂。

var div = React.createFactory('div'), h1 = React.createFactory('h1');

var CommentBox = React.createClass({displayName: 'CommentBox',
  render: function() {
    return (
      div({className: "commentBox"}, 
        h1(null, "Comments"), 
        React.createElement(CommentList, null), 
        React.createElement(CommentForm, null)
      )
    );
  }
});

createFactory基本上部分应用了createElement。所以以下是等价的:

React.createElement(c, props, child1, child2);
React.createFactory(c)(props, child1, child2);

如果你只是使用es6但不喜欢JSX,那么你可以通过解构赋值来减少它的冗长。有关使用6to5而不是jsx的交互式示例,请参阅此jsbin

var [div, h1, commentForm, commentList] = [
    'div', 'h1', CommentForm, CommentList
].map(React.createFactory);

答案 2 :(得分:2)

如果您有可变数量的孩子,那么您可以使用: 使用带有一系列参数的apply函数。

React.createElement.apply(this, ['tbody', {your setting}].concat(this.renderLineList()))

其中renderLineList是例如:

renderLineList: function() {
        var data=this.props.data;
        var lineList=[];
        data.map(function(line) {
            lineList.push(React.createElement('tr', {your setting}));
        });
        return lineList;
    }

答案 3 :(得分:1)

您只需将它们作为子项一个接一个地添加到您的父组件

return React.createElement("div", null, 
      React.createElement(CommentList, null), 
      React.createElement(CommentForm, null)
    );

答案 4 :(得分:0)

我遇到了这个问题,花了一些时间才能逐步解决解释器的源代码:

var arrayOfData = [];
var buildArray = (function () {
    var id;
    var name;
    return{
        buildProc(index, oneName){

                id =  index;
                name =  oneName;
                arrayOfData[index] = (React.createElement('Option', {id},name));
        }
    }
})();
// then 
this.state.items = result;
var response = parseJson.parseStart(this.state.items);
var serverDims = response.split(":");
for (var i = 1; i < serverDims.length; i++) {
    buildArray.buildProc(i, serverDims[i] )
}

// then
 render(){
    const data = this.props.arrayOfData;

    return (
        React.createElement("select", {},
               data
        )
    // {data} Failed with "object not a valid React child,  data with no curly's worked

    )          
}