Formulario para crear TODOs
Clase 19 de 23 • Curso de React 17
Contenido del curso
Clase 19 de 23 • Curso de React 17
Contenido del curso
Daniel Rodrigo Valdivieso Merino
Luis Alejandro Nieto Ruth
Diego Francisco Luna Lopez
Jairo Campos Ruiz
José David Ureña Torres
Julio Loarte Huerto
Jairo Campos Ruiz
Julio Loarte Huerto
Christian Aguilar
Daniel Rodrigo Valdivieso Merino
Max Andy Diaz Neyra
Stiven Trujillo
Andrea Estefania Blanco Avila
Luis Fernando Rodriguez Boett
Sneider Narvaez
Mauricio Gonzalez Falcon
Francisco Javier Segura Saviñon
Juan Castro
Esteban Gómez Fernández
Lucas Frezzini
Iván Garcia
Reinaldo Mendoza
Damián Valenzuela Negrete
Gustavo Gonzalez Montero
Yesid Alejandro Peláez Posada
xi Rg
Arturo Mauricio Terceros Beltrán
Stiven Trujillo
Santiago Pérez Sanabria
Julio Loarte Huerto
Mariano Gastón Paduani
Jesus Daniel Castro Flores
Luis E. Gama Ramirez
Jorge Arias Argüelles
Pedro Roberto Capriles Morales
Reinaldo Mendoza
Andrea Viviana Diaz Fonseca
Andres López
Marco Antonio Alducin Garcia
Rodrigo Andrés Moreno Pertúz
Leopoldo Sanclemente
Aqui el CSS del archivo TodoForm.css de la carpeta TodoForm
form { width: 90%; max-width: 300px; background-color: #fff; padding: 33px 40px; display: flex; align-content: center; flex-direction: column; } label { text-align: center; font-weight: bold; font-size: #1E1E1F; margin-bottom: 26px; } textarea { background-color: #F9FBFC; border: 2px, solid #202329; border-radius: 2px; box-shadow: 0px 5px 50px rgba(32, 35, 41, 0.25); color: #1E1E1F; font-size: 20px; text-align: center; padding: 12px; height: 96px; width: calc(100%-25px); } textarea::placeholder { color: #a5a5a5; font-family: 'Montserrat'; font-weight: 400; } textarea:focus { outline-color: #61DAFA; } .TodoForm-buttonContainer { margin-top: 14px; display: flex; justify-content: space-between; align-items: center; width: 100%; } .TodoForm-button { cursor: pointer; display: inline-block; font-size: 20px; color: #202329; font-weight: 400; width: 120px; height: 48px; border-radius: 2px; border: none; font-family: 'Montserrat'; } .TodoForm-button-add { background-color: #61DAFA; box-shadow: 0px 5px 25px rgba(97, 218, 250, 0.5); } .TodoForm-button-cancel { background: transparent; }
Codigo del archivo index.js de la carpeta TodoForm
import './ToDoForm.css' <form onSubmit={onSubmit} > <label>Escribe tu nuevo To Do</label> <textarea value = {newTodoValue} onChange = {onChange} placeholder = "Escribe una nueva tarea" /> <div className="TodoForm-buttonContainer"> <button type="button" className="TodoForm-button TodoForm-button-cancel" onClick = {onCancel} > Cancelar </button> <button className="TodoForm-button TodoForm-button-add" type= "submit" > Añadir </button> </div> </form>
NOTA: Recuerden importar el archivvo CSS en el archivo index.js 🧐
hay un pequeño error en los estilos en la etiqueta label esta:
label { text-align: center; font-weight: bold; font-size: #1E1E1F; margin-bottom: 26px; }
y deberia ser algo como asi:
label { text-align: center; font-weight: bold; font-size: 22px; margin-bottom: 26px; color: black; }
Gracias chicos.
Yo quise variar un poco de lo que estaba haciendo el profesor y para la creación de tareas no hice modal pero hice uno para la eliminación de las misma.
Muy bonito le quedó
excelente
Un consejo cuando hagáis un textarea en css podéis bloquear el resize para que no aparezca en la esquina inferior derecha ya que si lo mueven se rompe todo el css.
Para ellos solo tenéis que añadir esta propiedad en css:
resize: none;
muy buen aporte
O más que no pueda agrandar el textarea quizá sería mejor que solo lo pudiera agrandar en vertical (más alto o más bajo), pero no en horizontal (más ancho o más angosto). Para eso solo se utiliza
resize: vertical;
Realicé pequeños cambios en el CSS de los archivos creados en clases anteriores.
Así quedó :)
esta bacan!!
Como hiciste ese gif o video para ponerlo en el comentario?
el curso es muy bueno y no se tanto de javascript asi que me perdia en algunas cosas, pero luego hice una pausa y me sente a analizar todo el codigo y hacer lo del modal sin usar react context y todo y si pude XD me emociona la explicación del profe, me quedo enganchada y si yo se que todo es practica pero les juro que cuando intente hacer react con otros videos, solo logre usar el estado y el useEffect y ni siquiera lo entendia al nivel que lo entiendo ahora, era mas como ensayo y error, esto me funciona, esto no, inclusive hicimos (porque es un proyecto grupal el que estoy haciendo ahora) un bucle infinito por el useEffect y nos bloquearon por un dia de firebase jajajaja
Acabo de tener un Flashback. Ese truco de prevState => !prevState lo habia aprendido en otro lado. Me siento feliz de recordarlo <3
Esto también funciona: setOpenModal(!openModal)
Yo no lo conocía, increíble y útil
Creo que la funcion onSubmit debe tener una condicion para evitar que agreguemos Todos vacios. Asi lo hice yo:
const onSubmit =(e) =>{ e.preventDefault(); if(newTodoValue.length <= 0)return; addTodo(newTodoValue); setOpenModal(false); }
Me encanta :ok_hand:
Otra manera de validarlo sería:
const addToDoModal = (name) => { if (!name.trim()) { alert("El nombre está vacío, escribe algo"); return; } let toDos = [...toDo]; toDos.push({ id: toDos.length + 1, name, complete: false, }); setToDo(toDos); };
Cito un poco la documentación de React - Compononentes controlados para dar un poco de contexto: .
Los elementos de formularios en HTML funcionan un poco diferente a otros elementos del DOM en React, debido a que los elementos de formularios conservan naturalmente algún estado interno.
.
Teniendo esto en cuenta, los elementos de los formularios, naturalmente contienen un value o mejor dicho, mantienen sus propios estados y acciones dependiendo la interacción del usuario.
.
Y como ya sabemos, React realiza eso mismo para sus componentes con useState y solo los modifica con setState. Entonces para buscar una hegemonía entre los dos posibles casos y evitar esa "pelea de control", se enlaza la propiedad natural value con el propio estado de ese campo de formulario.
.
De esta forma es por eso que el profesor agrega: value={newTodoValue} en el textarea, para enlazarlos y que solo sea React quien se encargue de manejarlo.
.
Eso se llama "Componente controlado". El profe ya comentó sobre esto en los principios del curso incluso dejo la misma lectura, ahora con más conocimiento de la Librería se comprende mejor el concepto.
.
ES de saber que incluso si no se pone value={newTodoValue} en el textarea, el estado sigue funcionando y se puede realizar lo mismo, pero no lo estaría controlando React solamente, sino que se autocontrola también el mismo campo en sí. Se busca evitar eso.
Interacción con el Teclado
⠀⠀ Me daba cringe que no pudiera interactuar con las teclas jaja. ⠀⠀ Experimentando y rompiendo cositas por ahí aprendí que podemos añadir el evento onKeyPress que al presionar una tecla podemos validar que si es Enter la tecla que presionamos realice las mismas acciones que onSubmit. ⠀⠀
const onKeyUp = (e) => { if (e.charCode === 13) { e.preventDefault(); addTodo(newTodoValue); onCancel(); } };
Si el charCode que escuchamos es igual a 13 entonces..
<form onSubmit={onSubmit} onKeyPress={onKeyUp}>
Genio!!, esta buenisimo
Muchas gracias! Tenia unos tres meses que en un proyecto de JS vanilla, no me salia lo de capturar el input con la tecla **Enter **. Hice varias pruebas, y como dice, también rompí varias veces el código pero nada mas no me quedaba, y con tu comentario y la explicación de Juan en clase, pude por fin resolverlo. Por un lado, yo estaba evaluando el evento así:
const teclaCode = parseInt(key.keyCode);
Pero me generaba un error, y con el key.charCode, ya no tuve problemas. El otro punto era que me faltaba usar el preventDefault();
La App desde la vista principal:
El modal:
Mi paleta de colores:
Está genial. Qué cursos tuviste que tomar antes para que te quedara tan bien?
Lindo diseño Gustavo!
Así va quedando la aplicación. Feedback en los comentarios...
Que colores utilizaste?
Me gustó mucho tu diseño! ¿Que programa usas para realizar esos gifs?
realice algunas modificaciones en el CSS:
Excelente!!!
Asi va hasta ahora, acepto muchas correciones jaja 😁
Como grabas ? , quedo muy bien !
Asi va quedando el proyecto!
Resultado Final:
Repo
TODO Web
Por que unas tienen el check y están tachadas y otras no?
Para que se haga la validación sola de campo requerido solo necesitan colocar required dentro del tag del input o textarea
así
<textarea value={newTodoValue} onChange={onChange} placeholder="Agrega un TODO" required />
La verdad estoy bastante conforme con el resultado
Pues hoy con mucho orgullo, les comento que aca quedo mi aplicacion.
import React from 'react'; import { TodoContext } from '../Context'; import './TodoForm.css'; function TodoForm(){ const {addTodo, setOpenModal} = React.useContext(TodoContext); const [newTodoValue, setNewTodoValue] = React.useState(''); const onCancel = () =>{ setOpenModal(false); }; const onSubmit = (event) => { event.preventDefault(); addTodo(newTodoValue); setOpenModal(false); }; const onChange = (event) => { setNewTodoValue(event.target.value); }; return ( <form onSubmit={onSubmit} className="TodoForm"> <p><label>Escribe tu nuevo TODO</label></p> <textarea value={newTodoValue} onChange={onChange} placeholder='Cortar la Cebolla para el almuerzo' className='todoTXA' required /> <p className='botones'> {/* ?: preguntar si existe el dato en el arreglo, antes de imprimir el dato text */} <button type='button' className='exitModal' onClick={onCancel}>Cancelar</button> <button type='submit' className='addModal' >Añadir</button> </p> </form> ); } export{TodoForm};
Hay algunas cosas ya las habia realizado pero ya quedo con todo, y listo para lo siguiente.
asi va la mia hehehe despues de 5452545 dias
Hola hola a todos, con ++ imr ++ se realiza la importación de React sin necesidad de escribir todo, y si no lo sabias.....ahora lo sabes!! :P
PD: uso las extensiones: ES7+ React/Redux/React-Native snippets ( https://marketplace.visualstudio.com/items?itemName=dsznajder.es7-react-js-snippets) Simple React Snippets (https://marketplace.visualstudio.com/items?itemName=burkeholland.simple-react-snippets)
Saludos colegas!!