React: validateDOMNesting: #text не может отображаться как дочерний элемент <tr>

Можете ли вы объяснить мне, почему реагировать на предупреждение 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>
    )
}
}

В конце моя таблица имеет следующую структуру

введите описание изображения здесь

Где проблема?

Ответ 1

Проблема заключается в пробелах в этой строке:

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

Это может показаться глупым, но вы на самом деле визуализируете ячейки и некоторые пробелы (т.е. текст). Он должен выглядеть следующим образом:

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

Ответ 2

Это также происходит при использовании логического И короткого замыкания && для отображения/скрытия условных строк:

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

изменить его на тройной a? b: c Форма a? b: c где c равно null, исправит это

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

Ответ 3

В моем случае, где был пустой '' вывод (без пробела внутри)

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

Нуль делает трюк:

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

Ответ 4

Принятый ответ не был коренной причиной в моем случае. Я получил такое же предупреждение, когда у меня был комментарий после <th>. Предупреждение исчезло, когда я удалил комментарий.

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

РЕДАКТИРОВАТЬ: удаление пробела между </th> и {/* также добьется цели.

Ответ 5

Предупреждение об уведомлении: validateDOMNesting(...): Whitespace text nodes cannot appear as a child of <tbody>. Убедитесь, что у вас нет лишних пробелов между тегами в каждой строке исходного кода. В моем случае переменная инициализации не должна быть 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;

Ответ 6

Если кто-то еще сталкивался с этой ошибкой или схожей ошибкой пробелов в пользовательском интерфейсе материалов в React, моим решением после нескольких часов взлома моего кода был простой комментарий javascript внутри моей таблицы.

 { /*  sortable here */ }

Я удалил это из моих элементов таблицы, и предупреждение исчезло.

Ответ 7

В дополнение к ответу @Jarno я также столкнулся с этой проблемой. Дважды проверьте, что у вас нет дополнительных } или { в конце кода javascript:

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

Ответ 8

Я получил это предупреждение, когда у меня была скобка вместо фигурной скобки

<table>
  <tbody>
    <tr>
      (showMsg && <td>Hi</td>} // leading '(' should be a '{'
    </td>
  </tbody>
</table>

Ответ 9

Я получил это предупреждение, когда помещал текст внутри элемента <tr> без элементов <td>. Я завернул свой текст элементами <td>, и предупреждение исчезло.

Когда я это делал, наличие пробела в тексте или использование {} не имело значения.