Estoy tratando de configurar mi React.js
aplicación para que solo se muestre si una variable que configuré es true
.
La forma en que está configurada mi función de renderización es la siguiente:
render: function() {
var text = this.state.submitted ? 'Thank you! Expect a follow up at '+email+' soon!' : 'Enter your email to request early access:';
var style = this.state.submitted ? {"backgroundColor": "rgba(26, 188, 156, 0.4)"} : {};
return (
<div>
if(this.state.submitted==false)
{
<input type="email" className="input_field" onChange={this._updateInputValue} ref="email" value={this.state.email} />
<ReactCSSTransitionGroup transitionName="example" transitionAppear={true}>
<div className="button-row">
<a href="#" className="button" onClick={this.saveAndContinue}>Request Invite</a>
</div>
</ReactCSSTransitionGroup>
}
</div>
)
},
Básicamente, la parte importante aquí es la if(this.state.submitted==false)
parte (quiero que estos div
elementos se muestren cuando la variable presentada esté configurada en false
).
Pero cuando ejecuto esto, aparece el error en la pregunta:
Error no detectado: Error de análisis: Línea 38: Los elementos JSX adyacentes deben estar envueltos en una etiqueta adjunta
Cuál es el problema aquí? ¿Y qué puedo usar para que esto funcione?
javascript
reactjs
render
usuario1072337
fuente
fuente
Respuestas:
Debe colocar su componente entre una etiqueta adjunta, lo que significa:
En lugar:
Editar: según el comentario de Joe Clay sobre la API Fragments
fuente
Es tarde para responder esta pregunta, pero pensé que se agregaría a la explicación.
Está sucediendo porque en cualquier parte de su código está devolviendo dos elementos simultáneamente.
p.ej
Debe estar envuelto en un elemento padre . p.ej
Explicación más detallada
Su
jsx
código a continuación se transformadentro de esto
Pero si haces esto
esto se convierte en esto (solo con fines ilustrativos, en realidad lo obtendrás
error : Adjacent JSX elements must be wrapped in an enclosing tag
)En el código anterior, puede ver que está intentando regresar dos veces desde una llamada de método, lo que obviamente es incorrecto.
Editar: últimos cambios en React 16 y en los propios barrios:
Si no desea agregar div extra para envolver y desea devolver más de un componente secundario, puede utilizarlo
React.Fragments
.React.Fragments
son un poco más rápidos y tienen menos uso de memoria (no es necesario crear un nodo DOM adicional, menos árbol DOM desordenado).por ejemplo (en React 16.2.0)
o
o
fuente
Reaccionar elemento tiene que devolver solo un elemento. Tendrás que envolver ambas etiquetas con otra etiqueta de elemento.
También puedo ver que su función de renderizado no devuelve nada. Así es como debería verse su componente:
También tenga en cuenta que no puede usar
if
declaraciones dentro de un elemento devuelto:fuente
Si no desea envolverlo en otro div como han sugerido otras respuestas, también puede envolverlo en una matriz y funcionará.
Se puede escribir como:
Tenga en cuenta que lo anterior generará una advertencia:
Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of 'YourComponent'.
Esto se puede solucionar agregando un
key
atributo a los componentes, si agrega estos manualmente, agréguelo como:Aquí hay más información sobre las claves: Composición vs Herencia
fuente
El problema
Esto significa que está intentando devolver varios elementos JSX hermanos de manera incorrecta. ¡Recuerde que no está escribiendo HTML, sino JSX! Su código se transpila de JSX a JavaScript. Por ejemplo:
será trasladado a:
A menos que sea nuevo en la programación en general, ya sabe que las funciones / métodos (de cualquier lenguaje) toman cualquier número de parámetros pero siempre solo devuelven un valor. Dado eso, probablemente pueda ver que surge un problema al intentar devolver múltiples componentes hermanos en función de cómo
createElement()
funciona; solo toma parámetros para un elemento y lo devuelve. Por lo tanto, no podemos devolver múltiples elementos de una llamada de función.Entonces, si alguna vez te has preguntado por qué esto funciona ...
pero no esto ...
es porque en el primer fragmento, ambos
<p>
-elementos son parte dechildren
la<div>
-elemento. Cuando son parte dechildren
entonces, podemos expresar un número ilimitado de elementos hermanos. Eche un vistazo a cómo se transpilaría esto:Soluciones
Dependiendo de la versión de React que esté ejecutando, tiene algunas opciones para abordar esto:
Usar fragmentos (¡React v16.2 + solo!)
A partir de React v16.2, React tiene soporte para Fragments, que es un componente sin nodo que devuelve sus hijos directamente.
Devolver a los hijos en una matriz (ver más abajo) tiene algunos inconvenientes:
Estos se eliminan del uso de fragmentos. Aquí hay un ejemplo de niños envueltos en un fragmento:
que quita el azúcar en:
Tenga en cuenta que el primer fragmento requiere Babel v7.0 o superior.
Devuelve una matriz (¡solo React v16.0 +!)
A partir de React v16, React Components puede devolver matrices. Esto es diferente a las versiones anteriores de React donde se vio obligado a envolver todos los componentes hermanos en un componente principal.
En otras palabras, ahora puedes hacer:
esto se traduce en:
Tenga en cuenta que lo anterior devuelve una matriz. Las matrices son elementos de reacción válidos desde React versión 16 y posteriores. ¡Para versiones anteriores de React, las matrices no son objetos de retorno válidos!
También tenga en cuenta que lo siguiente no es válido (debe devolver una matriz):
Envuelva los elementos en un elemento padre
La otra solución implica crear un componente padre que envuelva los componentes hermanos en su
children
. Esta es, con mucho, la forma más común de abordar este problema, y funciona en todas las versiones de React.Nota: Eche un vistazo nuevamente a la parte superior de esta respuesta para obtener más detalles y cómo se transmite .
fuente
v16.4
el primer ejemplo no funciona usando:,<>
solo<React.Fragment>
:(React 16.0.0 podemos devolver múltiples componentes de render como una matriz.
React 16.4.0 podemos devolver múltiples componentes desde render en una etiqueta Fragment. Fragmento
Future React podrá utilizar esta sintaxis abreviada. (muchas herramientas aún no lo admiten, por lo que es posible que desee escribir explícitamente
<Fragment>
hasta que las herramientas se pongan al día).fuente
,
entre los componentes. Es una matriz, por lo que debe separar cada elemento dentro de ella.<Fragment>
, es<React.Fragment>
. lo dice en su propio enlaceimport React { Fragment } from 'react';
entonces utilizar de esta manera<Fragment >
Si no ajusta su componente, puede escribirlo como se menciona a continuación.
En vez de:
puedes escribir esto:
fuente
es muy simple, podemos usar un elemento padre div para envolver todo el elemento o podemos usar el concepto de Componente de orden superior (HOC), es decir, muy útil para aplicaciones de reacción js
u otra mejor manera es HOC, es muy simple, no muy complicado, solo agregue un archivo hoc.js en su proyecto y simplemente agregue estos códigos
ahora importa el archivo hoc.js donde quieras usar, ahora en lugar de envolver con el elemento div podemos envolver con hoc.
fuente
Hay una regla en reaccionar que una expresión JSX debe tener exactamente un elemento más externo.
incorrecto
correcto
fuente
React 16 obtiene su retorno como una matriz, por lo que debe estar envuelto por un elemento como div.
Enfoque equivocado
Enfoque correcto (Todos los elementos en un div u otro elemento que está utilizando)
fuente
Los componentes de reacción deben envolverse en un solo contenedor, que puede ser cualquier etiqueta, por ejemplo, "<div> .. </ div>"
Puede consultar el método de representación de ReactCSSTransitionGroup
fuente
Importar vista y envolver
View
. Envolver en undiv
no funcionó para mí.fuente
View
no es realmente la mejor solución.Inválido: no solo elementos secundarios
Válido: elemento raíz debajo de elementos secundarios
fuente
Para desarrolladores Rect-Native. Me encuentro con este error al renderizar el elemento en FlatList. Tenía dos componentes de texto. Los estaba usando como a continuación
Pero después de poner estos componentes Tow View View internos, funcionó para mí.
Es posible que esté utilizando otros componentes, pero ponerlos en Vista puede funcionar para usted.
fuente
View
no es realmente la mejor solución.Creo que la complicación también puede ocurrir al intentar anidar múltiples Divs dentro de la declaración de devolución. Es posible que desee hacer esto para asegurarse de que sus componentes se procesen como elementos de bloque.
Aquí hay un ejemplo de cómo representar correctamente un par de componentes, utilizando múltiples divs.
fuente
Tuve un problema que generó este error que no era del todo obvio.
Y aquí estaba la solución ...
Imagínate. Información compartida aquí en caso de que otros golpeen este obstáculo Aparentemente, no puede tener un nombre de clase de elemento igual al nombre de la función primaria React.
fuente