-
Notifications
You must be signed in to change notification settings - Fork 32
[React] Hooks
Los hooks en React son una aproximación para reducir la complejidad que implica el crear componentes como clases.
Los dos hooks más útiles son State y Effect, los cuales los abordaremos en las siguientes secciones.
Para usar los hooks, los componentes los escribiremos no como clases sino como funciones.
Cree un nuevo proyecto, borre todo el contenido de la carpeta src y cree un archivo src/app.js con el siguiente contenido:
import React, { useState } from "react";
function App() {
let [author, setAuthor] = useState("John Doe");
let [content, setContent] = useState("React is a JS library for UI");
let [likes, setLikes] = useState(25);
return (
<div>
<h1>Post</h1>
<h2>Author: {author}</h2>
<h2>Content: {content}</h2>
<h2>Likes: {likes}</h2>
</div>
);
}
export default App;Cree un archivo src/index.js con el siguiente contenido:
import React from "react";
import ReactDOM from "react-dom";
import App from "./app";
ReactDOM.render(<App />, document.getElementById("root"));En el ejemplo, a diferencia de los componentes basados en clases, no tenemos un objeto state, sino que usamos dos variables que son las que devuelven el hoot useState. La primera variable representa aquella en la que almacenaremos el estado, y la segunda es una función que se invoca para modificar el valor de ese estado. setState recibe como parámetro el valor inicial del estado.
Como pueden observar en el ejemplo, ya no es necesario el uso de operador this.state para obtener el valor de un estado; simplemente con referenciar a la variable tenemos acceso al valor del estado.
import React, { useState } from "react";
function App() {
let [author, setAuthor] = useState("John Doe");
let [content, setContent] = useState("React is a JS library for UI");
let [likes, setLikes] = useState(25);
let renderLikes = () => (likes === 0 ? "Give us a like" : likes);
return (
<div>
<h1>Post</h1>
<h2>Author: {author}</h2>
<h2>Content: {content}</h2>
<h2>Likes: {renderLikes()}</h2>
</div>
);
}
export default App;import React, { useState } from "react";
function App() {
let [author, setAuthor] = useState("John Doe");
let [content, setContent] = useState("React is a JS library for UI");
let [likes, setLikes] = useState(0);
let [tags, setTags] = useState(["tag1", "tag2", "tag3"]);
let handleClick = () => {
setLikes((likes = likes + 1));
};
let renderLikes = () => (likes === 0 ? "Give us a like" : likes);
return (
<div>
<h1>Post</h1>
<h2>Author: {author}</h2>
<h2>Content: {content}</h2>
<h2>Likes: {renderLikes()}</h2>
<ul>
{tags.map((item) => (
<li>{item}</li>
))}
</ul>
<button onClick={handleClick}>Like</button>
</div>
);
}
export default App;Componente Tweets: src/tweets.js:
import React, { useState } from "react";
import { Button, Form } from "react-bootstrap";
import Tweet from "./tweet";
function Tweets() {
let [tweets, setTweets] = useState([
{
author: "John Doe",
content: "React is a JS library for UI",
likes: 0,
tags: ["tag1", "tag2", "tag3"],
id: 1,
},
{
author: "Annie Hall",
content: "React is a JS library for UI",
likes: 20,
tags: ["tag1", "tag2", "tag3"],
id: 2,
},
{
author: "Albert Roger",
content: "React is a JS library for UI",
likes: 25,
tags: ["tag1", "tag2", "tag3"],
id: 3,
},
]);
let renderTweets = () => {
return tweets.map((item, i) => (
<div>
<Tweet key={i + 1} data={item} />
</div>
));
};
return (
<div className="p-4">
{renderTweets()}
</div>
);
}
export default Tweets;Componente Tweet: src/tweet.js:
import React from "react";
import { Card } from "react-bootstrap";
function Tweet(props) {
return (
<Card style={{ width: "18rem" }}>
<Card.Body>
<Card.Title>{props.data.author}</Card.Title>
<Card.Text>{props.data.content}</Card.Text>
</Card.Body>
</Card>
);
}
export default Tweet;ISIS-3710 Programación con Tecnologías Web
Universidad de los Andes, Colombia