Skip to content
This repository has been archived by the owner on Apr 4, 2023. It is now read-only.

Latest commit

 

History

History
171 lines (124 loc) · 4 KB

jsx.md

File metadata and controls

171 lines (124 loc) · 4 KB

JSX

JSX (JavaScript XML) es la sintaxis que se utiliza para construir el markup de los componentes de React. Veamos un ejemplo tomado del código que genera create-react-app:

<div className="App">
  <header className="App-header">
    <img src={logo} className="App-logo" alt="logo" />
    <h1 className="App-title">Welcome to React</h1>
  </header>
  <p className="App-intro">
    To get started, edit <code>src/App.js</code> and save to reload.
  </p>
</div>

JSX es similar a HTML pero con algunas diferencias importantes:

  1. Se utiliza className en vez de class para definir las clases de un elemento.

     // mal
     <div class="active"></div>
    
     // bien
     <div className="active"></div>
    
  2. Todas las etiquetas deben estar cerradas con /> o una etiqueta de cierre.

     // mal
     <img src="...">
     <input type="text">
    
     // bien
     <img src="..." />
     <input type="text"></input>
    

JSX se transforma en JavaScript

Por debajo JSX se transforma en código JavaScript. Por ejemplo, el siguiente código JSX

<div class="active">Hola Mundo</div>

se transforma en el siguiente código JavaScript:

React.createElement('div', { className: 'active'},  'Hola mundo');

Puedes utilizar el REPL de Babel para ver en qué se convierte el código JSX que escribes.

La ventaja de JSX es que, como es JavaScript, podemos:

  1. Ver algunos errores en tiempo de compilación.

  2. Asignar JSX a variables. Por ejemplo:

     const elem = <p>Hola</p>;
  3. Retornar JSX desde métodos. Por ejemplo:

     renderText() {
       if (someCondition) {
         return <p>Hola</p>;
       } else {
         return <p>Mundo</p>;
       }
     }

Una restricción de JSX es que siempre debes tener un elemento raíz:

// mal
const elem = <p>Hola</p><p>Mundo</p>;

// bien
const elem = <div>
    <p>Hola</p>
    <p>Mundo</p>
  </div>;

Para no perder la indentación en el último ejemplo podemos utilizar paréntesis para escribir el JSX en una nueva línea:

const elem = (
  <div>
    <p>Hola</p>
    <p>Mundo</p>
  </div>
);

Este es un patrón muy común en las aplicaciones de React.

Mezclando código JavaScript

Para mezclar código JavaScript en JSX utiliza corchetes ({}):

const style = "active";
const title = "Hola Mundo";

<div className={style}>{title}</div>;

Una restricción de JSX es que no puedes utilizar if, else, while o for.

Para agregar condicionales utiliza el operador ternario:

<div>
  {condition ? <h1></h1> : null}
</div>

Para mostrar elementos de un arreglo o un objeto utiliza map:

const names = ["Pedro", "Juan", "Germán"];

const jsx = (
  <ul>
    {names.map((name) =>
      <li>{name}</li>
    )}
  </ul>
);

Estilos inline

Es posible definir y utilizar estilos inline en JSX:

let styles = {
  borderColor: "#999"
};

const jsx = (
  <div style={styles}>
    Hola mundo
  </div>
);

Eventos del DOM

En JSX se utilizan los eventos estándar del DOM como onclick, onchange, onkeydown, etc. pero utilizando camelCase: onClick, onChange, onKeyDown, etc. Por ejemplo:

<button onClick={alert("Hola!")}></button>

Fíjate que utilizamos corchetes ({}) para escribir nuestro código JavaScript. También podríamos pasar una función que es invocada cuando se genere el evento:

const saluda = () => alert("Hola!");

<button onClick={saluda}></button>

Fíjate que no estamos invocando la función saluda, sólo la estamos pasando para que React la invoque cuando ocurra el evento.