Henar
Sonia
@HenarMendiola
@Yune__vk
Una biblioteca de JavaScript creada para facilitarnos la tarea de desarrollar interfaces de usuario.
🚀 Declarativo
📦 Basado en componentes
📱 Escríbelo una vez, ejecútalo donde sea
👶 Creado en 2013 por Facebook
⭐️ 142k stars en GitHub
🪐 Ecosistema completo: Redux, Gatsby, GraphQL, React Native, Next.Js, Enzyme (testing-AirBnB), Flow...
👩🏻💻 +1k contributors
const element = <h1>Hello, world!</h1>;
🤔 ¿String?
🤔 ¿HTML?
JSX
Es una extensión de la sintaxis de JavaScript que “produce elementos” de React.
Podemos usar comillas para especificar strings literales como atributos.
const element = <div tabIndex="0"></div>;
También podemos usar llaves para insertar una expresión JavaScript en un atributo.
const element = <img src={user.avatarUrl}></img>;
JSX es más cercano a JavaScript que a HTML, usamos la nomenclatura camelCase en vez de nombres de atributos HTML.
class 👉 className
tabindex 👉 tabIndex
Son entidades que nos permiten separar la interfaz en piezas independientes y reutilizables.
Conceptualmente son como las funciones. Aceptan atributos (llamadas “props”) y devuelven elementos de React.
const Welcome = props => {
return <h1>Hello, {props.name}</h1>;
}
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
Es la acción que realiza el navegador para convertir nuestro código en algo que podemos ver.
const element = (
<div>
<h1>Hello, world!</h1>
<h2>It is {new Date().toLocaleTimeString()}.</h2>
</div>
);
Podemos pasar atributos a otros componentes. Estos se reciben como un objeto que se suele llamar “props”.
const Welcome = props => {
return <h1>Hello, {props.name}</h1>;
}
const App = () => {
return (
<div>
<Welcome name="Irene" />
<Welcome name="Sandra" />
</div>
);
}
Todos los componentes de React deben actuar como funciones puras respecto a sus props, no tratan de cambiar lo que reciben.
Si queremos hacer nuestras interfaces dinámicas debemos usar estados.
const Welcome = props => {
return <h1>Hello, {props.name}</h1>;
}
const App = () => {
return (
<div>
<Welcome name="Irene" />
<Welcome name="Sandra" />
</div>
);
}
Podemos combinar componentes para crear nuevos componentes más complejos. ¡No tengas miedo de dividir en componentes más pequeños!
const App = () => {
return (
<Welcome name="Irene" />
<Welcome name="Sandra" />
);
}
Debes devolver siempre un único nodo. Si tenemos varios elementos, se deben englobar dentro de uno solo.
const App = () => {
return (
<div>
<Welcome name="Irene" />
<Welcome name="Sandra" />
</div>
);
}
🚫
✅
Si quieres agrupar elementos sin añadir nodos extra al DOM, puedes usar los fragmentos de React (<></> o <React.Fragment></React.Fragment>.
const App = () => {
return (
<>
<Welcome name="Irene" />
<Welcome name="Sandra" />
</>
);
}
Los componentes con estado almacenan datos locales al componente que pueden variar variar a lo largo del tiempo bajo diversas circunstancias, por ejemplo por la interacción del usuario con el componente.
Las props y el estado son objetos planos. Ambos contienen información, pero son diferentes:
👉 props se pasa al componente (como los parámetros de una función).
👉 El estado se gestiona dentro del componente (como las variables declaradas dentro de una función).
Componentes funcionales 👉 Hooks
Componentes de clase 👉 setState()
Cada vez que actualicemos el estado interno de nuestro componente, este se vuelve a renderizar para mostrar los cambios que se han producido.
Debemos tener esto muy en cuenta porque podemos tener problemas con loops infinitos, como veremos más adelante.
Funciones especiales que permiten “conectarte” a características de React.
Son una nueva incorporación que te permiten usar estado y otras características de React sin clases.
Con useState gestionamos el estado declarando "variables de estado"
import React, { useState } from 'react';
const Example = () => {
// Declaración de una variable de estado que llamaremos "count"
const [count, setCount] = useState(0);
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
import React, { useState } from 'react';
const Example = () => {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Has pulsado ${count} veces`
})
Con useEffect añadimos "efectos" que se ejecutan cada vez que nuestro componente se renderiza. Es útil para crear eventos y hacer consultas a APIs.
useEffect se ejecuta cada vez que se renderiza el componente.
Si definimos un efecto que actualiza el estado de nuestro componente cada vez que se ejecuta podemos crear un loop infinito.
import React, { useState, useEffect } from 'react';
import Profile from "./Profile"
function Home() {
const [user, setUser] = useState({});
useEffect(() => {
fetch(`https://myapi.com/api/user/${name}`)
.then(res => res.json())
.then(user => {
setUser(user)
})
})
return (
<Profile username={user.name} image={user.image} />
);
}
Para arreglar esto pasamos como segundo parámetro a useEffect una la lista de parámetros de los que depende el efecto.
Así conseguimos que cuando dichos parámetros no cambien no vuelva a ejecutar el efecto.
import React, { useState, useEffect } from 'react';
import Profile from "./Profile"
function Home() {
const [user, setUser] = useState({});
useEffect(() => {
fetch(`https://myapi.com/api/user/${name}`)
.then(res => res.json())
.then(user => {
setUser(user)
})
}, [user])
return (
<Profile username={user.name} image={user.image} />
);
}
useEffect(() => {
fetch(`https://myapi.com/api/user/${name}`)
.then(res => res.json())
.then(user => {
setUser(user)
})
}, [])
Si le pasamos un array vacío indicamos que no depende de ningún valor y que solo debe ejecutarse al montarse y desmontarse nuestro componente.
Decimos que un componente se ha montado cuando se añade al DOM por primera vez.
Por el contrario, cuando un componente se ha eliminado del DOM, decimos que se ha desmontado.
También llamados presentational o stateless. Se encargan solo de pintar elementos en base a las props recibidas.
const Profile = props => {
return (
<article>
<img src={props.image} />
<p>{props.username}!</p>
</article>
);
}
Establecen la lógica y el funcionamiento de nuestra aplicación a través de la gestión del estado.
const Home = props => {
const [user, setUser] = useState({
name: "NodeGirl",
image: "nodegirl.jpg"
});
return (
<Profile username={user.name} image={user.image} />
);
}
📚 Documentación
reactjs.org/docs/getting-started.html
🎣 Introducing Hooks
reactjs.org/docs/hooks-intro.html
⚛️ Awesome React
github.com/enaqx/awesome-react
⛩ React Patterns