Hasta ahora, hemos discutido cómo construir páginas web simples utilizando HTML y CSS, y cómo utilizar Git y GitHub para realizar un seguimiento de los cambios en nuestro código y colaborar con otros. También nos familiarizamos con el lenguaje de programación Python, comenzamos a utilizar Django para crear aplicaciones web y aprendimos a utilizar los modelos de Django para almacenar información en nuestros sitios. Luego, introdujimos JavaScript y aprendimos cómo utilizarlo para hacer que las páginas web sean más interactivas.
Hoy, discutiremos paradigmas comunes en el diseño de interfaces de usuario, utilizando JavaScript y CSS para hacer que nuestros sitios sean aún más amigables para el usuario.
Una interfaz de usuario es la forma en que los visitantes interactúan con una página web. Nuestro objetivo como desarrolladores web es hacer que estas interacciones sean lo más agradables posible para el usuario, y hay muchos métodos que podemos usar para lograrlo.
Anteriormente, si queríamos un sitio web con múltiples páginas, lo lograríamos utilizando diferentes rutas en nuestra aplicación Django. Ahora, tenemos la capacidad de cargar solo una página y luego utilizar JavaScript para manipular el DOM. Una gran ventaja de hacer esto es que solo necesitamos modificar la parte de la página que realmente está cambiando. Por ejemplo, si tenemos una barra de navegación que no cambia según la página actual, no querríamos tener que volver a renderizar esa barra de navegación cada vez que cambiamos a una nueva parte de la página.
Veamos un ejemplo de cómo podríamos simular el cambio de página en JavaScript:
html
1<!DOCTYPEhtml>
2<htmllang="en">
3<head>
4<title>Página Simple</title>
5<style>
6div{
7display: none;
8}
9</style>
10<scriptsrc="singlepage.js"></script>
11</head>
12<body>
13<buttondata-page="page1">Page 1</button>
14<buttondata-page="page2">Page 2</button>
15<buttondata-page="page3">Page 3</button>
16<divid="page1">
17<h1>Esta es la página 1</h1>
18</div>
19<divid="page2">
20<h1>Esta es la página 2</h1>
21</div>
22<divid="page3">
23<h1>Esta es la página 3</h1>
24</div>
25</body>
26</html>
Observa en el HTML anterior que tenemos tres botones y tres divisionesdivs. En este momento, las divisiones contienen solo un poco de texto e imágenes, pero podríamos imaginar que cada div contiene el contenido de una página en nuestro sitio. Ahora, agregaremos algo de JavaScript que nos permita utilizar los botones para cambiar entre páginas.
15// Cuando se hace clic en un botón, cambia a esa página
16 button.onclick=function(){
17showPage(this.dataset.page);
18}
19})
20});
En muchos casos, sería ineficiente cargar todo el contenido de cada página cuando visitamos un sitio por primera vez, por lo que necesitaremos utilizar un servidor para acceder a nuevos datos. Por ejemplo, al visitar un sitio de noticias, llevaría demasiado tiempo cargar todas las noticias disponibles cuando se visita la página por primera vez. Podemos evitar este problema utilizando una estrategia similar a la que utilizamos al cargar tasas de cambio de divisas en curso de javascript anterior. En esta ocasión, echaremos un vistazo a cómo utilizar Django para enviar y recibir información desde nuestra aplicación de una sola página. Para mostrar cómo funciona esto, echemos un vistazo a una aplicación Django simple. Tiene dos patrones de URL enurls.py:
Y dos rutas correspondientes en views.py. Observa que la ruta "section" toma un entero y luego devuelve una cadena de texto basada en ese entero como una respuesta HTTP.
python
1from django.http import Http404, HttpResponse
2from django.shortcuts import render
3
4# Crea tus vistas aquí.
5defindex(request):
6return render(request,"singlepage/index.html")
7
8# El texto en realidad es más largo, pero tiene
9# que ser corto aquí para ahorrar espacio
10texts =["Text 1","Text 2","Text 3"]
11
12defsection(request, num):
13if1<= num <=3:
14return HttpResponse(texts[num -1])
15else:
16raise Http404("No such section")
Ahora, dentro de nuestro archivo index.html, aprovecharemos AJAX, que aprendimos en el curso anterior deDjango, para realizar una solicitud al servidor y obtener el texto de una sección específica para mostrarlo en la pantalla:
Ahora, hemos creado un sitio donde podemos cargar nuevos datos desde un servidor sin recargar toda nuestra página HTML. Sin embargo, una desventaja de nuestro sitio es que la URL es menos informativa. Te darás cuenta en el video anterior que la URL sigue siendo la misma incluso cuando cambiamos de sección a sección. Podemos resolver este problema utilizando laAPI de Historial de JavaScript. Esta API nos permite agregar información a nuestro historial de navegación y actualizar manualmente la URL. Veamos cómo podemos usar esta API. Imagina que tenemos un proyecto Django idéntico al anterior, pero esta vez queremos modificar nuestro script para emplear la API de historial:
javascript
1// cuando hacemos click en el botón atrás, muestra la sección previa
En la funciónshowSectionanterior, utilizamos la funciónhistory.pushState. Esta función agrega un nuevo elemento a nuestro historial de navegación basado en tres argumentos:
Cualquier dato asociado con el estado.
Un parámetro de título ignorado por la mayoría de los navegadores web.
Lo que debería mostrarse en la URL.
El otro cambio que realizamos en el JavaScript anterior es establecer el parámetro onpopstate, que especifica qué deberíamos hacer cuando el usuario hace clic en la flecha hacia atrás. En este caso, queremos mostrar la sección anterior cuando se presiona el botón de retroceso. Ahora, el sitio parece un poco más amigable para el usuario:
Para actualizar y acceder al historial del navegador, utilizamos un objeto JavaScript importante conocido como window. Hay algunas otras propiedades de window que podemos utilizar para mejorar la apariencia de nuestros sitios:
window.innerWidth: Ancho de la ventana en píxeles.
window.innerHeight: Altura de la ventana en píxeles.
Mientras que window representa lo que actualmente es visible para el usuario, document se refiere a toda la página web, que a menudo es mucho más grande que la ventana, obligando al usuario a desplazarse hacia arriba y hacia abajo para ver el contenido de la página. Para trabajar con el desplazamiento, tenemos acceso a otras variables:
window.scrollY: Cuántos píxeles hemos desplazado desde la parte superior de la página.
document.body.offsetHeight: La altura en píxeles de todo el documento.
Podemos utilizar estas medidas para determinar si el usuario ha llegado al final de una página mediante la comparaciónwindow.scrollY + window.innerHeight >=document.body.offsetHeight. La siguiente página, por ejemplo, cambiará el color de fondo a verde cuando lleguemos al final de la página:
javascript
1<!DOCTYPE html>
2<html lang="en">
3<head>
4<title>Scroll</title>
5<script>
6// Evento escuchador para el deslizamiento (scrolling)
Cambiar el color de fondo al final de la página probablemente no sea muy útil, pero puede que queramos detectar que hemos llegado al final de la página si queremos implementar un desplazamiento infinito. Por ejemplo, si estás en un sitio de redes sociales, no querrás cargar todas las publicaciones de una vez; podrías querer cargar las primeras diez y, luego, cuando el usuario llegue al final, cargar las siguientes diez. Echemos un vistazo a una aplicación de Django que podría hacer esto. Esta aplicación tiene dos rutas enurls.py.
python
1urlpatterns =[
2 path("", views.index, name="index"),
3 path("posts", views.posts, name="posts")
4]
Y dos vistas correspondientes aviews.py:
python
1import time
2
3from django.http import JsonResponse
4from django.shortcuts import render
5
6# Crea tus vistas aquí.
7defindex(request):
8return render(request,"posts/index.html")
9
10defposts(request):
11
12# Obtiene un punto de incio y un punto final
13 start =int(request.GET.get("start")or0)
14 end =int(request.GET.get("end")or(start +9))
15
16# Generar una lista de posts
17 data =[]
18for i inrange(start, end +1):
19 data.append(f"Post #{i}")
20
21# Se retrasa artificialmente el tiempo de respuesta del post
22 time.sleep(1)
23
24# Devuelve una lista de posts
25return JsonResponse({
26"posts": data
27})
Ten en cuenta que la vista depublicacionesrequiere dos argumentos: un punto deinicioy un puntofinal. En esta vista, hemos creado nuestra propia API, que podemos probar visitando la URLlocalhost:8000/posts?start=10&end=15, la cual devuelve el siguiente JSON:
json
1{
2"posts":[
3"Post #10",
4"Post #11",
5"Post #12",
6"Post #13",
7"Post #14",
8"Post #15"
9]
10}
Ahora, en la plantillaindex.htmlque carga el sitio, comenzamos con solo undivvacío en el cuerpo y algún estilo. Observa que cargamos nuestros archivos estáticos al principio y luego hacemos referencia a un archivo JavaScript dentro de nuestra carpetaestática.
Ahora, con JavaScript, esperaremos hasta que un usuario haga scroll hasta el final de la página y luego cargaremos más publicaciones utilizando nuestra API:
javascript
1// Comenzar con la primera publicación
2let counter =1;
3
4// Cargar 20 publicaciones a la vez
5const quantity =20;
6
7// Cuando el DOM se carga, renderizar las primeras 20 publicaciones
Otra forma de hacer que nuestros sitios sean un poco más interesantes es añadiendo alguna animación a ellos. Resulta que, además de proporcionar estilos, CSS nos facilita la tarea de animar elementos HTML.
Para crear una animación en CSS, utilizamos el formato que se muestra a continuación, donde los detalles de la animación pueden incluir estilos de inicio y fin (from y to), o estilos en diferentes etapas durante la duración (desde 0% hasta 100%). Por ejemplo:
css
1@keyframes animation_name{
2from{
3/* Algún estilo del inicio */
4}
5
6to{
7/* Algún estilo del final */
8}
9}
o también podemos usar un porcentaje:
css
1@keyframes animation_name{
20%{
3/* Algún estilo del inicio */
4}
5
675%{
7/* Algún estilo de 3/4 de la animación */
8}
9
10100%{
11/* Algún estilo del final */
12}
13}
Luego, para aplicar una animación a un elemento, incluimos el nombre de la animación (animation-name), la duración de la animación (en segundos) y el modo de llenado de la animación (por lo general, forwards). Por ejemplo, aquí hay una página en la que un título crece cuando entramos por primera vez en la página:
html
1<!DOCTYPEhtml>
2<htmllang="en">
3<head>
4<title>Animate</title>
5<style>
6@keyframes grow{
7from{
8font-size:20px;
9}
10to{
11font-size:100px;
12}
13}
14h1{
15animation-name: grow;
16animation-duration:2s;
17animation-fill-mode: forwards;
18}
19</style>
20</head>
21<body>
22<h1>Bienvenidos a Neotecs!</h1>
23</body>
24</html>
Podemos hacer más que solo manipular el tamaño: el siguiente ejemplo muestra cómo podemos cambiar la posición de un encabezado simplemente modificando algunas líneas:
css
1@keyframes move{
20%{
3left:0%;
4}
550%{
6left:50%;
7}
8100%{
9left:0%;
10}
11}
Ahora, veamos cómo configurar algunas propiedades intermedias de CSS. Podemos especificar el estilo en cualquier porcentaje del recorrido de una animación. En el siguiente ejemplo, moveremos el título de izquierda a derecha y luego de nuevo a la izquierda, alterando solo la animación mencionada anteriormente.
Si queremos repetir una animación varias veces, podemos cambiar la propiedadanimation-iteration-counta un número mayor que uno (o inclusoinfinitepara una animación sin fin). Hay muchas propiedades de animación que podemos establecer para cambiar diferentes aspectos de nuestra animación.
Además de CSS, podemos utilizar JavaScript para controlar aún más nuestras animaciones. Utilicemos nuestro ejemplo de encabezado en movimiento(con repetición infinita)para mostrar cómo podemos crear un botón que inicia y detiene la animación. Suponiendo que ya tenemos una animación, un botón y un encabezado, podemos agregar el siguiente script para iniciar y pausar la animación:
8// Seleccionamos el botón para que espere el click
9document.querySelector("button").onclick=()=>{
10// Si la animación está pausada, comenzar la animación
11if(h1.style.animationPlayState=="paused"){
12 h1.style.animationPlayState="running";
13}
14// De otra manera, pausar la animación
15else{
16 h1.style.animationPlayState="paused";
17}
18};
19});
Ahora, veamos cómo podemos aplicar nuestro nuevo conocimiento de animaciones a la página de publicaciones que creamos anteriormente. Específicamente, supongamos que queremos la capacidad de ocultar las publicaciones una vez que hayamos terminado de leerlas. Imaginemos un proyecto de Django idéntico al que acabamos de crear, pero con HTML y JavaScript ligeramente diferentes. El primer cambio que haremos será en la funciónadd_post, agregando esta vez también un botón al lado derecho de la publicación:
javascript
1// Añadir un nuevo post con los contenidos dados al DOM
Ahora, trabajaremos en ocultar una publicación cuando se hace clic en el botón de ocultar. Para hacer esto, agregaremos un event listener que se activa cada vez que un usuario hace clic en cualquier parte de la página. Luego, escribiremos una función que tome el evento como argumento, lo cual es útil porque podemos usar el atributoevent.targetpara acceder a lo que se hizo clic. También podemos utilizar la clase `parentElement` para encontrar el elemento padre de un elemento dado en el DOM.
javascript
1// Al hacer click en el botón esconder, eliminar el post
2document.addEventListener('click',event=>{
3
4// Encontrar donde fue el click
5const element = event.target;
6
7// Chequear si el usuario hizo click en el botón hide
8if(element.className==='hide'){
9 element.parentElement.remove()
10}
11
12});
Ahora podemos ver que hemos implementado el botón de ocultar, pero no se ve tan bien como podría. Tal vez queremos que la publicación se desvanezca y se encoja antes de eliminarla. Para hacer esto, primero crearemos una animación CSS. La siguiente animación dedicará el 75% de su tiempo cambiando laopacidadde 1 a 0, lo que esencialmente hace que la publicación se desvanezca lentamente. Luego, pasa el resto del tiempo moviendo todos sus atributos relacionados con laalturaa 0, reduciendo efectivamente la publicación a nada.
css
1@keyframes hide{
20%{
3opacity:1;
4height:100%;
5line-height:100%;
6padding:20px;
7margin-bottom:10px;
8}
975%{
10opacity:0;
11height:100%;
12line-height:100%;
13padding:20px;
14margin-bottom:10px;
15}
16100%{
17opacity:0;
18height:0px;
19line-height:0px;
20padding:0px;
21margin-bottom:0px;
22}
23}
A continuación, agregaríamos esta animación al CSS de nuestra publicación. Observa que inicialmente establecemosanimation-play-stateenpaused, lo que significa que la publicación no estará oculta por defecto.
css
1.post{
2background-color:#77dd11;
3padding:20px;
4margin-bottom:10px;
5animation-name: hide;
6animation-duration:2s;
7animation-fill-mode: forwards;
8animation-play-state: paused;
9}
Finalmente, queremos poder iniciar la animación una vez que se ha hecho clic en el botón de ocultar y luego eliminar la publicación. Podemos hacer esto editando nuestro JavaScript de arriba:
javascript
1// Si el boton escucha el click, borrar el post
2document.addEventListener('click',event=>{
3
4// Encontar que fue clickeado
5const element = event.target;
6
7// Chequea si el usuario hizo click en el botón hide
Para hacer esto sin django y python, que sería menos eficiente poque los posts se crean de manera dinámica con la función de python, pero también podrian tener un HTML plano de la siguiente manera:
html
1<divclass="posts"id="posts">
2<pclass="posted"></p>
3<p>Post #1</p>
4<p>Welcome!</p>
5<buttonclass="hide">Hide</button>
6</div>
7
8<divclass="posts">
9<pclass="posted"></p>
10<p>Post #2</p>
11<p>Bienvenidos!</p>
12<buttonclass="hide">Hide</button>
13</div>
14
15<divclass="posts">
16<pclass="posted"></p>
17<p>Post #3</p>
18<p>Welkome!</p>
19<buttonclass="hide">Hide</button>
20</div>
Como pudimos ver en el video de demostración de los post ahora la función de esconderhidese ve más atractiva. Aca les dejo el CSS:
React es una biblioteca de JavaScript que permite construir interfaces de usuario de manera declarativa y eficiente. A diferencia de los enfoques imperativos tradicionales, en React describes cómo debería ser la interfaz de usuario y React se encarga de actualizar y renderizar eficientemente los componentes en respuesta a los cambios de estado.
Hasta este punto, puedes imaginarte cuánto código JavaScript se necesitaría para un sitio web más complicado. Puedes mitigar la cantidad de código que realmente necesitas escribir utilizando un marco de JavaScript, al igual que usamos Bootstrap como un marco de CSS para reducir la cantidad de CSS que realmente teníamos que escribir. Uno de los marcos de JavaScript más populares es una biblioteca llamadaReact.
Hasta ahora, en este curso, hemos estado utilizando métodos de programación imperativa, donde le damos a la computadora un conjunto de declaraciones para ejecutar. Por ejemplo, para actualizar el contador en una página HTML, podríamos tener código que se ve así:
Vista
jsx
1<h1>0</h1>
Lógica
jsx
1let num =parseInt(document.querySelector("h1").innerHTML);
2num +=1;
3document.querySelector("h1").innerHTML= num;
React nos permite utilizar la programación declarativa, lo que nos permite simplemente escribir código que explica qué deseamos mostrar y no preocuparnos por cómo lo estamos mostrando. En React, un contador podría lucir algo así:
Vista:
jsx
1<h1>{num}</h1>
Lógica
jsx
1num +=1
El framework React se basa en la idea de componentes, cada uno de los cuales puede tener un estado subyacente. Un componente podría ser algo que se puede ver en una página web, como una publicación o una barra de navegación, y un estado es un conjunto de variables asociadas con ese componente. La belleza de React radica en que cuando el estado cambia, React cambiará automáticamente el DOM en consecuencia.
Hay varias formas de usar React (incluido el popular comando create-react-app publicado por Facebook), pero hoy nos centraremos en comenzar directamente en un archivo HTML. Para hacer esto, tendremos que importar tres paquetes de JavaScript:
React: Define componentes y su comportamiento.
ReactDOM: Toma componentes de React e los inserta en el DOM.
Babel: Traduce desde JSX, el lenguaje en el que escribiremos en React, a JavaScript plano que nuestros navegadores pueden interpretar. JSX es muy similar a JavaScript, pero con algunas características adicionales, incluida la capacidad de representar HTML dentro de nuestro código.
¡Vamos a sumergirnos y crear nuestra primera aplicación React!
Esta es una manera de crearla, hay otras las cuales les voy a enseñar más adelante..
En React, la capacidad de crear componentes y reutilizarlos en otros componentes es una parte fundamental del diseño y la organización del código. Esto sigue el principio de la programación modular, donde puedes dividir tu aplicación en piezas más pequeñas y reutilizables, lo que facilita el mantenimiento y la comprensión del código.
Aquí hay algunos conceptos clave relacionados con la creación y el uso de componentes en React:
Componentes Funcionales y de Clase:
Funcionales: Son funciones de JavaScript y se escriben como funciones puras. No tienen estado propio ni métodos de ciclo de vida.
De Clase: Son clases de JavaScript que extienden la clase React.Component. Pueden tener estado y métodos de ciclo de vida.
Props (Propiedades):
Los componentes pueden recibir datos externos llamados "props" (propiedades). Estos son como parámetros de función que puedes pasar a un componente cuando lo utilizas.
Composición de Componentes:
Puedes construir interfaces de usuario complejas combinando y anidando componentes más pequeños. Esto fomenta la reutilización del código y facilita el mantenimiento.
Estado del Componente:
Los componentes de clase pueden tener un estado interno que afecta su representación y comportamiento. El estado es mutable y se puede actualizar.
Ciclo de Vida del Componente:
Los componentes de clase tienen métodos de ciclo de vida, como componentDidMount y componentDidUpdate, que te permiten realizar acciones en diferentes puntos durante la vida útil del componente.
HOC (Higher-Order Components):
Son funciones que toman un componente y devuelven un nuevo componente con funcionalidades adicionales. Esto se utiliza para reutilizar lógica entre componentes.
Hooks:
Los hooks son funciones especiales que te permiten usar el estado y otros recursos de React en componentes funcionales. El hook useState permite agregar estado a los componentes funcionales.
Contexto:
El contexto de React permite pasar datos a través del árbol de componentes sin tener que pasar props manualmente en cada nivel.
La creación y reutilización de componentes en React fomenta un desarrollo más limpio, modular y fácil de mantener. Puedes construir componentes especializados para tareas específicas y combinarlos para construir interfaces complejas de manera estructurada. Esto mejora la legibilidad del código y facilita la colaboración en equipos de desarrollo.
Dado que esta es nuestra primera aplicación React, echemos un vistazo detallado a lo que está haciendo cada parte del código:
En las tres líneas anteriores al título, importamos las versiones más recientes de React, ReactDOM y Babel.
En el cuerpo, incluimos un solo div con un id de app. Casi siempre queremos dejar esto vacío y completarlo en nuestro código de React a continuación.
Incluimos una etiqueta de script donde especificamos que type="text/babel". Esto indica al navegador que el script siguiente debe traducirse utilizando Babe
A continuación, creamos un componente llamado App. Los componentes en React pueden representarse mediante funciones de JavaScript.
Nuestro componente devuelve lo que nos gustaría renderizar en el DOM. En este caso, simplemente devolvemos<div>Hello!</div>.
La última línea de nuestro script utiliza la función ReactDOM.render, que toma dos argumentos:
Un componente para renderizar.
Un elemento en el DOM dentro del cual se debe renderizar el componente.
Ahora que entendemos qué hace el código, podemos echar un vistazo a la página web resultante:
Una característica útil de React es la capacidad de renderizar componentes dentro de otros componentes. Para demostrar esto, creemos otro componente llamado Hola:
jsx
1functionHola(props){
2return(
3<h1>Bienvenidos a React</h1>
4<p>¡Hola!</p>
5);
6}
Y ahora, vamos a renderizar tres componentes Hello dentro de nuestro componente App:
jsx
1functionApp(){
2return(
3<div>
4<Hola/>
5<Hola/>
6<Hola/>
7</div>
8);
9}
Esto nos va a dar algo parecido a esto:
Hasta ahora, los componentes no han sido muy interesantes, ya que son todos exactamente iguales. Podemos hacer que estos componentes sean más flexibles agregándoles propiedades adicionales (props en términos de React). Por ejemplo, digamos que queremos saludar a tres personas diferentes. Podemos proporcionar los nombres de esas personas de una manera similar a los atributos HTML:
jsx
1functionApp(){
2return(
3<div>
4<Holaname="Neo"/>
5<Holaname="Mario"/>
6<Holaname="Gabriel"/>
7</div>
8);
9}
Podemos acceder a esas props usando props.NOMBRE_PROP. Luego, podemos insertar esto en nuestro JSX usando llaves:
jsx
1functionHola(props){
2return(
3<h1>Hola, {props.name}!</h1>
4);
5}
Ahora nuestra página mostrará lo siguiente:
Ahora, veamos cómo podemos usar React para volver a implementar la página del contador que construimos al trabajar por primera vez con JavaScript. Nuestra estructura general seguirá siendo la misma, pero dentro de nuestro componente App, usaremos el hook useState de React para agregar estado a nuestro componente. El argumento de useState es el valor inicial del estado, que estableceremos en 0. La función devuelve tanto una variable que representa el estado como una función que nos permite actualizar el estado.
jsx
1const[count, setCount]=React.useState(0);
Ahora, podemos trabajar en lo que la función renderizará, donde especificaremos un encabezado y un botón. También agregaremos un event listener para cuando se haga clic en el botón, lo cual React maneja utilizando el atributo onClick:
jsx
1return(
2<div>
3<h1>{count}</h1>
4<buttononClick={updateCount}>Count</button>
5</div>
6);
Finalmente, definamos la función updateCount. Para hacer esto, utilizaremos la función setCount, que puede tomar como argumento un nuevo valor para el estado.
jsx
1functionupdateCount(){
2setCount(count +1);
3}
Ahora tenemos una página con función de conteo:
En esta web tengo varios ejemplos del uso de React con Nextjs para hacer diferentes solicitudes a API's, con API Routes o hacer un fetch usando Reactjs y AJAX con un server Flask y Python para hacer web scraping, incluido ahí mismo hay un ejemplo como hacer un fetch de tuREADME.md(GitHub MarkDown) a tu aplicación web. Si quieren ver algo más avanzado del uso de React, aquí les dejo algunos ejemplos:
Ahora que tenemos una comprensión del marco de trabajo React, trabajemos en utilizar lo aprendido para construir un sitio similar a un juego, donde los usuarios resolverán problemas de suma. Comenzaremos creando un nuevo archivo con la misma configuración que nuestras otras páginas de React. Para comenzar a construir esta aplicación, pensemos en lo que podríamos querer llevar un seguimiento en el estado. Deberíamos incluir cualquier cosa que pensemos que podría cambiar mientras un usuario esté en nuestra página. Nuestro estado podría incluir:
num1: El primer número a sumar.
num2: El segundo número a sumar.
response: Lo que el usuario ha escrito.
score: Cuántas preguntas ha respondido correctamente el usuario.
Ahora nuestro estado puede ser un objeto de Javascript que incluya toda nuestra informacíón:
jsx
1const[state, setState]=React.useState({
2num1:1,
3num2:1,
4response:"",
5score:0
6});
Ahora usando los valores del estado podemos renderizar una interfaz básica.
jsx
1return(
2<div>
3<div>{state.num1} + {state.num2}</div>
4<inputvalue={state.response}/>
5<div>Score: {state.score}</div>
6</div>
7);
Ahora la interfaz sencilla de React se verá así:
En este momento, el usuario no puede escribir nada en el cuadro de entrada porque su valor está fijo comostate.response, que actualmente es una cadena vacía. Para solucionar esto, agreguemos un atributoonChangeal elemento de entrada y asignémoslo a una función llamadaupdateResponse.
jsx
1onChange={updateResponse}
Ahora, tendremos que definir la función `updateResponse`, que toma el evento que desencadenó la función y establece la respuesta en el valor actual del input. Esta función permite al usuario escribir y almacena lo que se ha escrito en el estado.
jsx
1functionupdateResponse(event){
2setState({
3...state,
4response: event.target.value
5});
6}
Para dar algunos toques finales a la aplicación, agreguemos estilo a la página. Centraremos todo en la aplicación y luego haremos que el problema sea más grande agregando un id de problem al div que contiene el problema. Luego, añadiremos el siguiente CSS a una etiqueta de estilo:
css
1#app{
2text-align: center;
3font-family: sans-serif;
4font-size:53px;
5}
6
7#problem{
8font-size:72px;
9}
Finalmente, vamos a realizar un juego de matemáticas en el cual quien obtenga un puntaje de 10 puntos, gana. Aquí les dejo el código que usé para hacer este mini juego, pueden probar editando las funciones y/o agregar estilos: