Неисправность Ошибка: Инвариантное Нарушение: findComponentRoot (...,... $110): Не удается найти элемент. Вероятно, это означает, что DOM был неожиданно мутирован

Что я делаю неправильно с вложенными циклами в React? Я искал информацию в Google, и я не нашел ничего подходящего. Можете ли вы помочь мне найти, что я понимаю неправильно?

Как видно из рисунка, у меня есть данные в переменной. И он отлично работает. Но когда я добавляю значение не из этого <tr>, появляется ошибка!

    var TableBalls80 = React.createClass({
        render:function(){
            var rows = this.props.rows;
            var columnId = 0, trKey = 0, divKey = 0, td1stKey = 0;
            var td2ndKey = 100;
            return(
                    <table className='table table-bordered bg-success'>
                                <thead>
                                <tr className='danger'>
                                    {rows[0].row.map(function (element){
                                        columnId++;
                                        return (
                                        <th colSpan="2" key={columnId}>{columnId}</th>);
                                    })}
                                </tr>
                                </thead>
                                <tbody>
                                    {rows.map(function (rowElement){
                                        return (<tr key={trKey++}>
                                        {rowElement.row.map(function(ball){
                                            console.log('trKey:'+trKey+' td1stKey'+td1stKey+' ball.value:'+ball.value+' td2ndKey:'+td2ndKey+' ball.count:'+ball.count);
                                            return(<div key={divKey++}>
                                                <td className='info' key={td1stKey++}>{ball.value}</td><td key={td2ndKey++}>{ball.count}</td>
                                            </div>);
                                        })}
                                        </tr>);
                                    })}
                                </tbody>
                            </table>);
        }
    });

Ошибка (зависит от того, какой элемент добавлен из другого <tr>):

Неисправленная ошибка: инвариантное нарушение: findComponentRoot (...,.0.1.1.0.2.0.0.1. $0. $9. $109): > Невозможно найти элемент. Вероятно, это означает, что DOM неожиданно мутировался (например, браузером > ), обычно из-за забывания при использовании таблиц, n...... `.

Ответ 1

Итак, проблема в том, что вы создаете виртуальную структуру DOM следующим образом:

<tbody>
   <tr>
      <div>
         <td>...</td>
         <td>...</td>
      </div>
   </tr>
</tbody>

Поскольку <div/> не является допустимым дочерним элементом <tr>, браузер фактически создает DOM, представляющий это:

<div> </div>
<table>
<tbody>
   <tr>
      <td>...</td>
      <td>...</td>
   </tr>
</tbody>
</table>

fiddle

Когда реакция идет на обновление, она смотрит на <tr> и задается вопросом, куда пошел <div>. Вместо этого он находит <td>, поэтому он выдает ошибку.

Ответ 2

Я получил вышеупомянутую ошибку, пытающуюся сделать это для теста:

component = React.addons.TestUtils.renderIntoDocument(<MyTableRow />)
React.findDOMNode(component)

Мое исправление заключалось в том, чтобы обернуть его перед рендерингом:

component = React.addons.TestUtils.renderIntoDocument(<table><MyTableRow /></table>)
table = React.findDOMNode(component)
row = jQuery(table).find("tr")[0]

Ответ 3

он может иногда возникать, когда React загружается из двух разных мест (например, из require и в HTML)

Ответ 4

Пожалуйста, также просмотрите эту проблему в ответ https://github.com/facebook/react/issues/3811, это говорит о том, что это текущее ограничение, что вы не можете вернуть более одного компонент из метода рендеринга React. ", поэтому вы также должны проверить рендер, если его возвращающие несколько элементов

Ответ 5

У меня была схожая проблема, и причина заключалась в том, что я использовал тег <form> внутри компонента React.js, и я отобразил его на позицию страницы, у которой уже был открытый <form>. Формы не могут быть вложенными. Таким образом, вы можете получить эту ошибку, даже если HTML внутри компонента кажется действительным.

Ответ 6

Эта ошибка объясняется тем, что где-то есть разметка HTML, которая недопустима.

В моем случае я неуклюже имел React, создавая тег формы внутри тега кнопки и никогда не реализовывался до тех пор, пока эта ошибка не появлялась. Проверьте свою разметку на наличие ошибок вложенности.

Ответ 7

У меня была эта же проблема, и она оказалась двумя элементами в DOM с одинаковым идентификатором (непреднамеренно).

Ответ 8

В моем случае проблема была связана с типом кнопки. ReactDOM теряется, если вы используете type="button" в <button>.

Я удалил type="button" и добавил event.preventDefault() в мой обработчик onClick, и это сработало для меня.