React:validateDOMNesting:#text不能显示为

时间:2016-10-07 09:56:10

标签: reactjs warnings

你能解释一下为什么反应显示警告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>
    )
}
}

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

enter image description here

问题出在哪里?

16 个答案:

答案 0 :(得分:27)

问题是这一行中的空格:

return <tr key={item.id}> {cells} </tr>;

看起来很愚蠢,但你实际上是在渲染单元格和一些空格(即文字)。它应该是这样的:

return <tr key={item.id}>{cells}</tr>;

答案 1 :(得分:8)

在我的情况下,空的''输出(内部空间)

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

null 可以解决问题:

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

答案 2 :(得分:6)

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

{
  foo && (<tr><td>{foo}</td></tr>)
}

将其更改为三元a ? b : c形式,其中c为null即可解决

{
  foo ? (<tr><td>{foo}</td></tr>) : null
}

答案 3 :(得分:4)

接受的答案不是我案件的根本原因。当我在const TableHeaders = (props) => ( <tr> <th>ID</th> {/* TODO: I had a comment like this */} </tr> ) 标记后发表评论时,我收到了同样的警告。当我删除评论时,警告就消失了。

</th>

编辑:删除{/*和{{1}}之间的空格也可以解决问题。

答案 4 :(得分:4)

<tr> HTML标记表示表格行。因此,要在表格行中显示的任何文本都必须置于<td> HTML标记内。这样可以消除错误。

示例:

return (
    <tr>
        <td> {/* Using <td> inside <tr> */}
            Hello World!
        </td>
    </tr>
);

答案 5 :(得分:2)

删除评论对我也有帮助 enter image description here

答案 6 :(得分:1)

通知警告:validateDOMNesting(...): Whitespace text nodes cannot appear as a child of <tbody>。确保源代码的每一行上的标签之间没有任何额外的空白区域。 在我的例子中,initialize变量不应该是null

 let elementCart = ''; {/* in the here,warning will append  */}
    if(productsCart.length > 0){
        elementCart = productsCart.map((item, index) => {
            return <CartItem item={item} key={index} index={index} />
        });
    }

    return(
        <tbody id="my-cart-body">
            {elementCart}
        </tbody>
    )

解决方案:let elementCart = null;

答案 7 :(得分:1)

在我的情况下,使用null而不是“”初始化变量可以正常工作

答案 8 :(得分:1)

确保对let变量赋值,否则初始化一个新的空数组。

{headers ? headers : []}

or

{rows || []}

对我来说,它就像一种魅力...

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

    return (
         <table className="table table-hove">
             <thead>
                <tr>
                    {headers ? headers : []}
                </tr>
             </thead>
             <tbody>
                    {rows || []}
             </tbody>

         </table>
    )
}

|| null也可以解决。 重要的是该值不是''

答案 9 :(得分:0)

除了@Jarno的回答,我也遇到了这个问题。仔细检查您的JavaScript代码末尾是否还有其他}{

{this.props.headers.map(header => <th key={header}>{header}</th>)}}
                                                                  ↑

答案 10 :(得分:0)

当我有一个括号而不是一个大括号

时,我收到了这个警告
<table>
  <tbody>
    <tr>
      (showMsg && <td>Hi</td>} // leading '(' should be a '{'
    </td>
  </tbody>
</table>

答案 11 :(得分:0)

如果其他人在React中的Material UI中遇到此错误或类似的空格错误,则在破坏代码数小时后,我的解决方案是在表中添加一个简单的javascript注释。

 { /*  sortable here */ }

我从表格元素之间删除了该内容,警告消失了。

答案 12 :(得分:0)

将文本放在<tr>元素中而没有<td>元素时,收到此警告。我用<td>元素包裹了文字,警告消失了。

当我这样做时,在文本中使用空格或使用{}都没有关系。

答案 13 :(得分:0)

在我的情况下,我确实<tr>中有一个<tr>(打算使用<td>):)

答案 14 :(得分:0)

很容易找到。只需打开您的检查并寻找标签。它应该出现在标记的开头或结尾,并带有引号的字符串如下:

Inspect element  on google chrome

答案 15 :(得分:0)

Kevin Law(来自其他评论)说,您可以这样做:

{
  foo ? (<tr><td>{foo}</td></tr>) : null
}

但是您也可以像这样修复它:

{
  Boolean(foo) && <tr><td>{foo}</td></tr>
}