我如何渲染兄弟元素而不将它们包装在父标签中?
在大多数情况下,有一个父标签不是一个问题。
React.createClass({ render: function() { return ( <tbody> <tr><td>Item 1</td></tr> <tr><td>Item 2</td></tr> </tbody> ); } });
但是在某些情况下,在一个没有父项的渲染函数中有兄弟元素是有意义的,特别是在一个表的情况下,你不想在一个div
包含一个表行。
React.createClass({ render: function() { return ( <tr><td>Item 1</td></tr> <tr><td>Item 2</td></tr> ); } });
第二个例子给出了以下错误: Adjacent XJS elements must be wrapped in an enclosing tag while parsing file
。
我怎样才能渲染两个兄弟元素没有包装在一个<div>
或类似的东西?
目前这是一个限制,但将来可能会被修正( 在github回购中存在一些未解决的问题 )。
现在,您可以使用返回数组的函数(这基本上是一个无状态的组件):
function things(arg, onWhatever){ return [ <tr><td>Item 1</td></tr>, <tr><td>Item 2</td></tr> ]; }
并在你的组件中使用。
return ( <table><tbody> {things(arg1, this.handleWhatever)} {things(arg2, this.handleWhatever)} </tbody></table> );
更新
在React 16中,你将能够从渲染返回一个数组。
呜呼! React团队最终解决了这个问题。 截至React v16.0,你可以这样做:
render() { // No need to wrap list items in an extra element! return [ // Don't forget the keys :) <tr key="a"><td>Item 1</td></tr>, <tr key="b"><td>Item 2</td></tr> ]; }
请参阅完整的博客文章,解释“新渲染返回types:片段和string” 。
你可以把它包装到括号中,如下所示:
React.createClass({ render: function() { return ( [ <tr><td>Item 1</td></tr> <tr><td>Item 2</td></tr> ] ); } });
这个例子对我来说很好:
let values = []; if (props.Values){ values = [ <tr key={1}> <td>props.Values[0].SomeValue</td> </tr> , <tr key={2}> <td>props.Values[1].SomeValue</td> </tr> ]; } return ( <table className="no-border-table table"> <tbody> <tr> <th>Some text</th> </tr> {values} </tbody> </table> )
像这样的语法为我工作
this.props.map((data,index)=>{return( [ <tr>....</tr>,<tr>....</tr>];)});