¿Por qué necesito escribir HTML dentro del código React?

Lo que ve dentro de un componente Reaccionar ‘técnicamente’ no es HTML.

Tomarlo como HTML es el concepto erróneo más común sobre la biblioteca React.

Retrocedamos un paso. Primero debemos analizar cómo funcionan los barebones de React.

En React, NO escribimos ningún html directamente. Utilizamos nodos ‘Reaccionar DOM’ para especificar cómo debe estructurarse la página.

así que este ‘Hola Mundo’ en HTML simple:

¡Hola, mundo!

en ‘simple’ Reaccionar, sería:

var div = React.DOM.div
var h1 = React.DOM.h1

var HelloWorldComponent = (
div (nulo,
h1 (nulo, ‘¡Hola, mundo!’)
)
)

ReactDOM.render (HelloWorldComponent, document.getElementById (‘aplicación’))

Ver líneas 5 y 6. div y h1 son en realidad nodos React.

Para un nodo React, el primer argumento son las propiedades y el segundo argumento es su hijo .

así que para el nodo de reacción ‘div’ en la línea 5, las propiedades son nulas y el hijo es el nodo de reacción h1. El nodo de reacción h1 tendrá su propio conjunto de propiedades y su hijo.

Imagina un árbol de nodos si quieres.

Luego tomamos este árbol de nodos de reacción y se lo damos a ReactDom.render en la línea 10

ReactDOM sabe cómo convertir cada ‘Nodo de reacción’ a su etiqueta html correspondiente. Convierte cada nodo en el árbol en una etiqueta html y adjunta la estructura html resultante a la id ‘aplicación’ como se especifica en la línea 10.

Eso es.

Por lo tanto, cualquier html que deseamos escribir debe escribirse mediante programación en términos de nodos de reacción.

Veamos un HTML un poco más complejo

TODO

  • Uno
  • Dos
  • Tres

La estructura de Nodos de reacción correspondiente para el HTML anterior sería:

React.createElement (
‘div’,
nulo,
React.createElement (
‘h3’,
nulo,
‘QUE HACER’
),
React.createElement (
‘ul’,
nulo,
React.createElement (
‘li’,
nulo,
‘Uno’
),
React.createElement (
‘li’,
nulo,
‘Dos’
),
React.createElement (
‘li’,
nulo,
‘Tres’
)
)
);

El equipo de React decidió que es doloroso escribir React ‘simple’ (es decir, usar React Node’s directamente).

Así que decidieron, construyamos una forma intermedia de ‘código de búsqueda html’, que luego se puede convertir en Nodos de reacción.

Este ‘código de búsqueda HTML’ se llama JSX o JavaScript XML, algo que la mayoría de la gente confunde con HTML.

Entonces, la idea es que los programadores escriban su código en JSX y un transpilador (como babel) lo convierte en React Nodes, que a su vez se convierte en HTML por ReactDOM.

El ‘árbol de nodos’ del que hablamos anteriormente se llama un DOM virtual.

React crea un DOM virtual utilizando los datos que le das. Si los datos cambian, se crea un nuevo DOM virtual. React luego compara este nuevo DOM virtual con el anterior. En caso de cambios, sabe qué nodos exactos actualizar. Eso es lo que hace que React sea rápido .

¿Por qué necesito escribir HTML dentro del código React?

No lo haces, en absoluto. JSX (ese material de aspecto HTML en el código React) es en realidad solo una conveniente abstracción mental sobre el propio React.createElement React, que en sí mismo es una extensión poderosa y conveniente del document.createElement React.createElement . Está ahí porque a muchas personas les resulta más fácil entender los nodos DOM en términos de su relación con HTML que simplemente en JavaScript. Akmal Muqeeth hace un gran trabajo al expresar esto visualmente en su respuesta.

Aunque la mayoría de los desarrolladores de hecho usan JSX, hay algunos que están de acuerdo con su opinión de que es una práctica menos que óptima. Soy uno de ellos, principalmente porque al separarse de JSX también puede deshacerse de una gran cantidad de dependencias con las que otros se cargan para usar React “correctamente”.

[…] Quiero saber si es posible separar el HTML de js como lo haces en angularjs u otros marcos

Aunque el “HTML en JavaScript” de React puede parecer incorrecto, puede que se sorprenda al saber cuánto peor es “JavaScript en HTML” en otras bibliotecas / marcos como Angular.

Desde la perspectiva de un navegador compatible con los estándares, el análisis de HTML es parte de la representación del navegador de una página web que ocurre una vez y fuera de la búsqueda de recursos adicionales, el HTML no tiene más impacto que el que se lee directamente esa vez. Por otro lado, JavaScript se invoca una vez que se interpreta y puede continuar activándose a través de llamadas a funciones y devoluciones de llamadas de los oyentes de eventos que se agregan a su cola de eventos.

En “AngularJS u otros marcos”, el JavaScript que escribieron realmente espera hasta que esté listo y luego recorre su DOM en busca de áreas donde ha declarado ciertas anotaciones especiales en su HTML, buscando fijar JavaScript en ellos de la manera que mejor les parezca . Estos marcos no “separan HTML de JS”, ​​en realidad hacen exactamente lo contrario, fuerzan JS a su HTML. Y debido a que no saben dónde podría haber puesto estas anotaciones, tienen que rastrear todo su DOM para hacerlo, y rastrear cada nuevo nodo que genere.

Esto es en realidad un gran detrimento del rendimiento: la interacción con el DOM ya es un proceso relativamente costoso y la necesidad de recorrer cada nodo DOM y buscar un subconjunto de atributos antes de determinar qué JS conectar es básicamente un pecado de rendimiento. Notará que la mayoría de las bibliotecas / frameworks “modernos” de JavaScript utilizan nodos de construcción en JavaScript y comparan su estado actual con un DOM virtual (una representación virtual en JavaScript) para realizar el número mínimo de ajustes DOM reales.


Siéntase libre de no usar JSX con React. Lleva un momento acostumbrarse, pero una vez que lo hace, es bastante liberador comprender realmente lo que está sucediendo debajo del capó y por qué no puede hacer algunas cosas con JSX (aparte de simplemente “porque dijeron que no”). Dicho esto, no retrocedas para mezclar tu JS en tu HTML. Hay una razón por la cual todos los que no están casados ​​con esos marcos se están alejando de ellos.

Bueno, en realidad … “ellos” no escriben HTML dentro de React!

Ellos, es decir, usamos jsx que nos permite escribir javascript que se parece un poco al html con el que se compilará. Es legible y fácil de escribir, pero no es lo mismo que escribir html. Es posible no usar jsx con React, pero no sé cuál sería el beneficio o por qué alguien preferiría eso.

JSX no es html. Sin embargo, React se basa en el uso de javascript para generar html, y si no te gusta, React no es para ti.