Ссылка не может отображаться как потомок ссылки
Приложение React.js выдает предупреждение
Warning: validateDOMNesting(...): <a> cannot appear as a descendant of <a>.
See Element > a > ... > a.
Что это значит? Как вы можете предотвратить это? Являются ли вложенные ссылки незаконными в HTML, HTML5 или React.js?
4 ответа
Это означает:
<a href="1">
<a href="2"></a>
</a>
Неверный HTML. Браузеры распознают это и превращают в:
<a href="1"></a>
<a href="2"></a>
React предупреждает вас об этом, потому что исправление браузера сделает реальный DOM отличным от виртуального DOM, что приведет к странным ошибкам при переходе React на обновление.
Прислушайтесь к предупреждению Реакта и не вкладывайте <a>
теги.
Я также получал это предупреждение для своего Navigaion, я использовал response-bootstrap для рендеринга React Router Link в NavItem.
Предупреждение: validateDOMNesting
<a>
не может быть потомком<a>
, в (создан Link)
Исправлено: добавление атрибута componentClass для отображения NavItem как <span>
тег вместо <a>
тег (Вы можете использовать любое другое имя тега здесь)
Мой код был
<Nav pullRight>
<NavItem>
<Link to="/responses">Responses</Link>
</NavItem>
</nav>
После исправления
<Nav pullRight>
<NavItem componentClass='span'>
<Link to="/responses">Responses</Link>
</NavItem>
</nav>
Это также портит стиль, чтобы исправить это добавить следующий CSS
.navbar-nav span[role=button] {
padding: 15px;
display: inline-block;
line-height: 20px;
}
Вы можете использовать функцию вместо тега "a":
import React from 'react';
import PropTypes from 'prop-types';
import {Link, withRouter} from 'react-router';
class SomeClass extends React.Component {
constructor(props,context) {
super(props,context);
this.redirect = this.redirect.bind(this);
}
redirect(target){
this.context.router.push("/path");
}
render() {
return (
<div>
<p onClick={this.redirect}>Link</p>
</div>
);
}
}
SomeClass.contextTypes ={
router: PropTypes.object
};
export default SomeClass;
Будьте осторожны, чтобы использовать контекст. Я использую контекст только для маршрутизации.
class SomeClass extends React.Component {
constructor(props,context) {
super(props,context);
this.redirect = this.redirect.bind(this);
}
Что это значит?
Это означает, что:
<a href="http://example.com">
<span>
<a href="http://example.net">
...
</a>
</span>
</a>
а также
<a href="http://example.com">
<a href="http://example.net">
...
</a>
</a>
и подобные конструкции не допускаются. Они все равно не имеют смысла.
Как вы можете предотвратить это?
Это не то, что происходит, когда кто-то не пишет код, который пытается это сделать.
Вам нужно найти этот код и изменить его.
Являются ли вложенные ссылки незаконными в HTML, HTML5 или React.js?
Они запрещены во всех версиях HTML. Первый DTD для HTML был опубликован как часть HTML 2. В нем говорится:
<!ELEMENT A - - %A.content -(A)>
Последняя часть описывает, какой контент разрешен внутри элемента. -(A)
часть этого означает "За исключением элементов".
HTML 5 - это всего лишь обновление 2014 года для HTML. HTML 5.1 вышел в прошлом году. HTML 5.2 находится в стадии разработки.
React.js - это библиотека JavaScript, которая генерирует HTML DOM. Результаты по-прежнему (вроде) HTML.
Реагировать роутер NavLink это <a>
теги под капотом, поэтому, когда вы конвертируете навигационную панель в реагирующий маршрутизатор, это часто случается, забывая удалять теги из ваших ссылок. это причина для вложенных ссылок.
как исправить: просто удалите <a>
отметить в <NavLink>
, тебе это не нужно, <NavLink>
сделай это для тебя.