Estoy viendo esto. No es un misterio de qué se queja:
Warning: validateDOMnesting(...): <div> cannot appear as a descendant of <p>. See ... SomeComponent > p > ... > SomeOtherComponent > ReactTooltip > div.
Soy el autor de SomeComponent
y SomeOtherComponent
. Pero este último está usando una dependencia externa ( ReactTooltip
desde react-tooltip
). Probablemente no sea esencial que se trate de una dependencia externa, pero me permite probar aquí el argumento de que es "algún código que está fuera de mi control".
¿Qué tan preocupado debería estar por esta advertencia, dado que el componente anidado está funcionando bien (aparentemente)? ¿Y cómo haría para cambiar esto de todos modos (siempre que no quiera volver a implementar una dependencia externa)? ¿Existe tal vez un diseño mejor que todavía no conozco?
En aras de la integridad, aquí está la implementación de SomeOtherComponent
. Simplemente se muestra this.props.value
, y cuando se desplaza: una información sobre herramientas que dice "Un mensaje de información sobre herramientas":
class SomeOtherComponent extends React.Component {
constructor(props) {
super(props)
}
render() {
const {value, ...rest} = this.props;
return <span className="some-other-component">
<a href="#" data-tip="Some tooltip message" {...rest}>{value}</a>
<ReactTooltip />
</span>
}
}
Gracias.
Respuestas:
Si este error ocurre mientras se usa Material UI
<Typography>
https://material-ui.com/api/typography/ , entonces puede cambiar fácilmente<p>
a a<span>
cambiando el valor delcomponent
atributo del<Typography>
elemento:Según los documentos de tipografía:
Por lo tanto, la tipografía está eligiendo
<p>
como un valor predeterminado sensato, que puede cambiar. Puede venir con efectos secundarios ... funcionó para mí.fuente
<Typography component={'div'}>
y ahora funciona sin advertencias. ¡Muchas gracias por ponerme en el camino correcto!Según el mensaje de advertencia, el componente ReactTooltip genera un HTML que podría verse así:
Según este documento , una
<p></p>
etiqueta solo puede contener elementos en línea. Eso significa que poner una<div></div>
etiqueta dentro debería ser incorrecto, ya que ladiv
etiqueta es un elemento de bloque. El anidamiento incorrecto puede causar fallas como la representación de etiquetas adicionales , lo que puede afectar su javascript y css.Si desea deshacerse de esta advertencia, es posible que desee personalizar el componente ReactTooltip o esperar a que el creador corrija esta advertencia.
fuente
div
debería ser refactorizado, en la posibilidad de ser utilizado en ap
? ¿Parece ir en contra de lo populares quediv
han sido los s para envolver cosas arbitrariamente?div
por aspan
para evitar este tipo de advertencia pero sin afectar nada en la lógica del código.Si está buscando dónde está sucediendo esto, en la consola puede usar:
document.querySelectorAll(" p * div ")
fuente
Su componente puede estar renderizado dentro de otro componente (como a
<Typography> ... </Typography>
). Por lo tanto, cargará su componente dentro de una<p> .. </p>
que no está permitida.Solución: elimine
<Typography>...</Typography>
porque esto solo se usa para texto sin formato dentro de uno<p>...</p>
o cualquier otro elemento de texto, como encabezados.fuente
<Typography component={'div'}>
y ahora funciona sin advertencias. ¡Muchas gracias por ponerme en el camino correcto!Recibí esta advertencia al usar componentes Material UI , luego
component="div"
probé como prop en el siguiente código y todo se volvió correcto:En realidad, esta advertencia ocurre porque en la interfaz de usuario de Material la etiqueta HTML predeterminada del
Grid
componente es ladiv
etiqueta y laTypography
etiqueta HTML predeterminada es lap
etiqueta. Así que ahora ocurre la advertencia,fuente
Tuve un problema similar y envolví el componente en "div" en lugar de "p" y el error desapareció.
fuente
Esta es una limitación de los navegadores. Debes usar div o article o algo así en el método de renderizado de la aplicación porque de esa manera puedes poner lo que quieras dentro. Las etiquetas de párrafo están limitadas a contener solo un conjunto limitado de etiquetas (en su mayoría etiquetas para dar formato al texto. No puede tener un div dentro de un párrafo
no es HTML válido. Según las reglas de omisión de etiquetas enumeradas en la especificación, la
<p>
etiqueta se cierra automáticamente por la<div>
etiqueta, lo que deja la</p>
etiqueta sin una coincidencia<p>
. El navegador tiene derecho a intentar corregirlo agregando una<p>
etiqueta abierta después de<div>
:No puede poner un
<div>
dentro de un<p>
y obtener resultados consistentes de varios navegadores. Proporcione a los navegadores HTML válido y se comportarán mejor.Se puede poner
<div>
dentro de una<div>
, así que si vas a cambiar de<p>
con<div class="p">
y estilo de manera apropiada, se puede obtener lo que desea.fuente
Si está utilizando
ReactTooltip
, para hacer desaparecer la advertencia, ahora puede agregar unwrapper
accesorio con un valor despan
, como este:Dado que
span
es un elemento en línea, ya no debería quejarse.fuente
Obtuve esto al usar un componente personalizado dentro de una
<Card.Text>
sección de un<Card>
componente en React. Ninguno de mis componentes estaba en etiquetas pfuente
La advertencia aparece solo porque el código de demostración tiene:
Cambiarlo así se encarga de ello:
fuente