React:validateDOMNesting:#text不能作为<tr>的子项出现

Biz*_*4ik 26 warnings reactjs

你能解释一下为什么反应显示警告Warning: validateDOMNesting(...): #text cannot appear as a child of <tr>. See Router > RouterContext > CarWashPage > AllCarWashTable > tr > #text.吗?我在标签内看不到任何文字tr

呈现表的代码

export default class AllCarWashTable extends React.Component{

constructor(props) {
    super(props);
    this.generateHeaders = this.generateHeaders.bind(this);
    this.generateRows = this.generateRows.bind(this);
};

static propTypes = {
    cols : React.PropTypes.array.isRequired,
    rows : React.PropTypes.array.isRequired
}

generateHeaders() {
    let cols = this.props.cols;  // [{key, label}]
    return cols.map(function(colData) {
        return <th key={colData.key}> {colData.label} </th>;
    });
}

generateRows() {
    let cols = this.props.cols,  // [{key, label}]
        data = this.props.rows;
    if (this.props.rows.length > 0) {
        return data.map(function(item) {
            var cells = cols.map(function(colData) {
                return <td key={colData.key}> {item[colData.key]} </td>;
            });
            return <tr key={item.id}> {cells} </tr>;
        });
    }
}

render(){
    let headers = this.generateHeaders();
    let rows = this.generateRows();

    return (
         <table className="table table-hove">
             <thead>
                <tr>
                    {headers}
                </tr>
             </thead>
             <tbody>
                    {rows}
             </tbody>

         </table>
    )
}
}
Run Code Online (Sandbox Code Playgroud)

最后,我的表格具有以下结构

在此输入图像描述

问题出在哪儿?

tob*_*sen 37

问题是这一行中的空格:

return <tr key={item.id}> {cells} </tr>;
Run Code Online (Sandbox Code Playgroud)

它可能看起来很愚蠢,但你实际上是渲染单元格和一些空格(即文本).它应该如下所示:

return <tr key={item.id}>{cells}</tr>;
Run Code Online (Sandbox Code Playgroud)


Kev*_*Law 21

使用逻辑AND短路&&显示/隐藏条件行时,也会发生这种情况:

{
  foo && (<tr><td>{foo}</td></tr>)
}
Run Code Online (Sandbox Code Playgroud)

将其更改为三元a ? b : c形式,其中c null将修复它

{
  foo ? (<tr><td>{foo}</td></tr>) : null
}
Run Code Online (Sandbox Code Playgroud)


Vic*_*tor 13

在我的情况下是一个空的''输出(里面没有空间)

<tbody>
  {this.props.orders.map(
    order =>this.props.selectedAgent === order.agent ? 
      <Row item={order} key={ order._id } /> : ''
    )
  }
</tbody>
Run Code Online (Sandbox Code Playgroud)

的伎俩:

<tbody>
  {this.props.orders.map(
    order =>this.props.selectedAgent === order.agent ? 
      <Row item={order} key={ order._id } /> : null
    )
  }
</tbody>
Run Code Online (Sandbox Code Playgroud)


Jar*_*der 6

可接受的答案并不是我的根本原因。<th>标记后有评论时,我也收到同样的警告。当我删除评论时,警告消失了。

const TableHeaders = (props) => (
  <tr>
    <th>ID</th> {/* TODO: I had a comment like this */}
  </tr>
)
Run Code Online (Sandbox Code Playgroud)

编辑:删除之间的空间,</th>{/*将达到目的。

  • 我没有给你-1,但接受的答案确实显示了错误发生的原因。这不是因为注释,而是因为结束“th”标记和注释的开始大括号之间的空格。删除它们之间的空间,问题就解决了。 (3认同)

Kee*_*i S 5

一个<tr>HTML标签指示表行。因此,要在表格行内显示的任何文本都必须放在<td>HTML 标记内。这将消除错误。

例子:

return (
    <tr>
        <td> {/* Using <td> inside <tr> */}
            Hello World!
        </td>
    </tr>
);
Run Code Online (Sandbox Code Playgroud)