如何避免在React中额外包装<div>?

Kir*_*kov 84 javascript reactjs

今天我开始学习ReactJS,一小时后面临问题..我想插入一个在页面上div内有两行的组件.这是我在下面做的简单例子.

我有一个HTML:

<html>
..
  <div id="component-placeholder"></div>
..
</html>
Run Code Online (Sandbox Code Playgroud)

渲染函数如下:

...
render: function() {

    return(
        <div className="DeadSimpleComponent">
            <div className="DeadSimpleComponent__time">10:23:12</div >
            <div className="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
        </div>
    )
}
....
Run Code Online (Sandbox Code Playgroud)

在下面我调用渲染:

ReactDOM.render(<DeadSimpleComponent/>, document.getElementById('component-placeholder'));
Run Code Online (Sandbox Code Playgroud)

生成的HTML如下所示:

<html>
..
  <div id="component-placeholder">
    <div class="DeadSimpleComponent">
            <div class="DeadSimpleComponent__time">10:23:12</div>
            <div class="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
    </div>
</div>
..
</html>
Run Code Online (Sandbox Code Playgroud)

我不是很高兴React强迫我将所有内容包装在div"DeadSimpleComponent"中的问题.没有明确的DOM操作,它的最佳和简单的解决方法是什么?

更新7/28/2017:React的维护者在React 16 Beta 1中添加了这种可能性

React 16.2开始,你可以这样做:

render() {
  return (
    <>
      <ChildA />
      <ChildB />
      <ChildC />
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

小智 111

在React版本(16.0)] [1]中删除了此要求,因此现在您可以避免该包装.

您可以使用React.Fragment呈现元素列表,而无需创建父节点,官方示例:

render() {
  return (
    <React.Fragment>
      <ChildA />
      <ChildB />
      <ChildC />
    </React.Fragment>
  );
}
Run Code Online (Sandbox Code Playgroud)

更多信息:https: //reactjs.org/docs/fragments.html

  • 您还可以使用简写: &lt;&gt; &lt;/&gt; 代替 &lt;React.Fragment&gt;&lt;/React.Fragment&gt; (2认同)

Tom*_*Tom 46

更新 2017-12-05 :React v16.2.0现在完全支持渲染片段,并且改进了对从组件渲染方法返回多个子节点的支持,而无需在子节点中指定键:

render() {
  return (
    <>
      <ChildA />
      <ChildB />
      <ChildC />
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

由于目前<React.Fragment>...</React.Fragment>所有工具都不完全支持语法,因此现在也可以使用<React.Fragment>...</React.Fragment>:

render() {
  return (
    <React.Fragment>
      <ChildA />
      <ChildB />
      <ChildC />
    </React.Fragment>
  );
}
Run Code Online (Sandbox Code Playgroud)

原版的:

React v16.0引入了在render方法中返回一个元素数组,而不将它包装在div中:https://reactjs.org/blog/2017/09/26/react-v16.0.html

render() {
  // No need to wrap list items in an extra element!
  return [
    // Don't forget the keys :)
    <li key="A">First item</li>,
    <li key="B">Second item</li>,
    <li key="C">Third item</li>,
  ];
}
Run Code Online (Sandbox Code Playgroud)

目前,每个元素都需要一个密钥以避免关键警告,但在将来的版本中可以更改:

将来,我们可能会向JSX添加一个不需要密钥的特殊片段语法.


Rol*_*ron 7

您可以使用:

render(){
    return (
        <React.Fragment>
           <div>Some data</div>
           <div>Som other data</div>
        </React.Fragment>
    )
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此文档.


小智 5

使用 [],而不是 () 来包装整个返回。

render: function() {
  return[
    <div className="DeadSimpleComponent__time">10:23:12</div >
    <div className="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
  ]
}
Run Code Online (Sandbox Code Playgroud)