artem_phantom
@artem_phantom
Front-end developer

Как исправить ошибку Uncaught Invariant Violation: findComponentRoot(...?

Был создан компонент InitializePhoneNumbersPanel:
class InitializePhoneNumbersPanel extends Component {
	constructor(props) {
		super(props);
		this.onSubmit = this.onSubmit.bind(this);
	}

	onSubmit(phoneNumbers) {
		const { dispatch, operatorId } = this.props;

		dispatch(updateOperatorData(operatorId, phoneNumbers, {include: 'phone_numbers'}));
	}

	render() {
		const {
			handleSubmit,
			submitting,
			fields: { phone_numbers }
			} = this.props;

		console.log('\n... Render ...');
		console.log('phone_numbers <<<<< ', phone_numbers);

		if (_.isEmpty(phone_numbers)) {
			return (
				<div className={"fade in"}>
					Hello
				</div>
			)
		}

		return (
			<form onSubmit={handleSubmit(this.onSubmit)}>
				<div className="row">
					<div className="col-md-12">
						<ul className="list-unstyled m-b-0 clearfix">
							{phone_numbers && phone_numbers.map((phone, index) =>
								<PhoneNumbersPanelItem key={index} phone={phone} phone_numbers={phone_numbers}
													   index={index}/>
							)}
						</ul>

					</div>
				</div>
				<div className="row">
					<div className="col-md-12">
						<button type="button" className="btn btn-sm btn-success" onClick={event => {
								event.preventDefault();
								phone_numbers.addField();
							}}><i className="fa fa-plus"></i>
						</button>
					</div>
				</div>
				<hr/>
				<div className="row">
					<div className="col-md-12">
						<button type="submit" disabled={ submitting } className="btn btn-sm btn-success pull-right">
							Save
						</button>
					</div>
				</div>
			</form>
		)
	}
}


Затем этот компонент обвернут в Redux-form:
InitializePhoneNumbersPanel = reduxForm({
	form: 'phone-numbers-panel',
	fields
})(InitializePhoneNumbersPanel);


Затем все это обвернуто connect методом для того чтобы данные из Store были доступны в Redux-form как fields:
function select(state) {
	return {
		initialValues: {
			phone_numbers: _.map(state.operators.items[state.operators.selectedOperator] && state.operators.items[state.operators.selectedOperator].phone_numbers, phoneId => {
				return state.phoneNumbers.items[phoneId];
			})
		},
		operatorId: state.operators.selectedOperator
	};
}

InitializePhoneNumbersPanel = connect(select)(InitializePhoneNumbersPanel);


Ошибка вот в чем....

Код что выше описан, работает нормально, однако в PhoneNumbersPanelItem компоненте повторяются номера телефонов, которые берутся из phone_numbers переменной.

При первой загрузке страницы с оператором (номера телефонов, которого показываются с помощью PhoneNumbersPanelItem) никаких ошибок не возникает, однако если выбрать другого оператора, то Route изменится, а значит меняется и параметр в store - operatorId а значит меняется объект operators и соответственно номера оператора тоже другие... конечные измененные данные приходят в компонент вот тут:

function select(state) {
	return {
		initialValues: {
			phone_numbers: _.map(state.operators.items[state.operators.selectedOperator] && state.operators.items[state.operators.selectedOperator].phone_numbers, phoneId => {
				return state.phoneNumbers.items[phoneId];
			})
		},
		operatorId: state.operators.selectedOperator
	};
}Operator
	};
}

InitializePhoneNumbersPanel = connect(select)(InitializePhoneNumbersPanel);


Так вот, если количество номеров у выбранного оператора меньше чем у предыдущего оператора, то происходит ошибка:

Uncaught Invariant Violation: findComponentRoot(..., .0.0.0.1.2.0.0.2.1.0.1.1.0.0.0.$1.0.0.0.0.1.1.0): Unable to find element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a <tbody> when using tables, nesting tags like <form>, <p>, or <a>, or using non-SVG elements in an <svg> parent. Try inspecting the child nodes of the element with React ID ``.


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

Не смотря на эту ошибку, все работает правильно, видимо при ещё одном рендеринге, React понимает что состояние обновилось и перерисовывает виртуальный DOM.

Если у всех операторов, одинаковое количество телефонов, то ошибки не возникает ВООБЩЕ...

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

Буду очень признателен если кто нибудь поможет мне решить данную проблему.
  • Вопрос задан
  • 339 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы