Contenido del curso
Introducción a React Router DOM 6
- 4

Instalar React Router Dom 6 paso a paso
11:18 min - 5

Browser Router vs Hash Router en GitHub Pages
07:25 min - 6

Primeras rutas con React Router Dom 6
10:41 min - 7

Link y NavLink para navegación en React
13:18 min - 8

Rutas dinámicas con React Router DOM y useParams
15:36 min - 9

useNavigate para navegar con JavaScript
08:56 min - 10

Outlet y rutas anidadas en React Router
06:56 min
Fake authentication con React Router DOM 6
- 11

Rutas privadas con fake auth en React
23:48 min - 12

Rutas privadas y públicas en React
09:50 min - 13

Rutas protegidas con Navigate en React
13:45 min - 14

Roles y permisos en aplicaciones web: Autenticación y autorización
11:56 min - 15

Retos avanzados en React: manejo de estado y composición de componentes
08:21 min - 16

Redirect al login con useLocation en React
03:42 min - 17

Rutas dinámicas con roles de usuario
04:56 min
React Router en TODO Machine
- 18

Cómo migrar React portals a rutas reales
11:33 min - 19

Estructura de carpetas con React Router Dom 6
18:40 min - 20

Botón de editar todos con React y SVG
12:19 min - 21

Generación de IDs únicos para gestionar tareas en React
15:22 min - 22

Migrar modales a rutas con useNavigate
17:36 min - 23

Cómo funciona editTodo con useParams
Viendo ahora - 24

Texto por defecto en textarea con useLocation
21:54 min - 25

Implementación de React Router en Proyectos Legacy
11:07 min
Próximos pasos
Cómo funciona editTodo con useParams
Resumen
Editar un TODO en React parece simple hasta que descubres que necesitas coordinar tres piezas: un custom hook que maneje la lógica, una ruta dinámica que cargue el identificador correcto y un formulario que devuelva el nuevo texto. Aquí verás cómo conectar esas piezas usando useTodos, useParams y state updaters para que tu aplicación realmente persista los cambios.
Cómo amplío el custom hook useTodos para editar
La lógica de edición vive dentro del custom hook useTodos, junto a funciones como addTodo, completeTodo y deleteTodo. La función editTodo reutiliza el patrón de completeTodo, pero con una diferencia importante: ahora necesitas dos argumentos en lugar de uno.
El primero es el id, que sigue siendo el identificador único del TODO. El segundo es el newText, porque editar implica reemplazar el contenido. Trabajar con id en vez de con el texto te da una ventaja clara: la URL no cambia, el índice no se rompe y la identificación se mantiene estable aunque modifiques el contenido [09:30].
¿Por qué usar id en lugar de texto como identificador? Porque el id es único e inmutable. Si identificas TODOs por su texto, cualquier edición rompería las referencias en URLs, índices y estados.
Cómo retorno editTodo desde el hook
Dentro del objeto stateUpdaters que retorna el hook, agregas editTodo para que cualquier componente que llame a useTodos pueda acceder a esta función. Aprovecha el momento para limpiar lo que ya no usas: si tenías funciones de modales que ningún componente consume, elimínalas sin miedo.
- Recibes
idynewTextcomo argumentos. - Encuentras el
todoIndexcon elid. - Creas un nuevo arreglo de TODOs.
- Modificas la propiedad
texten la posición encontrada.
Este patrón mantiene la inmutabilidad del estado en React, algo clave para que los renders se disparen correctamente.
Cómo obtengo el id del TODO desde la URL con useParams
En la página EditTodoPage, el id no llega como prop ni como estado: viene de la URL. Cuando el usuario hace clic en el lápiz de edición desde el home, navega a una ruta tipo /edit/:id, y ahí es donde entra useParams de React Router DOM [16:45].
js const params = useParams(); const todoId = Number(params.id);
El detalle que muchos pasan por alto: los parámetros de URL siempre llegan como string. Si tu lógica interna compara id numéricos, vas a tener bugs silenciosos. Por eso conviertes el valor con Number(), parseInt() o el operador +.
¿Qué hace useParams en React Router? Devuelve un objeto con los parámetros dinámicos de la ruta actual. Si tu ruta es
/edit/:idy la URL es/edit/1,useParams()retorna{ id: "1" }.
Cómo conecto el formulario con editTodo
El componente TodoForm ya emite el nuevo texto a través de la prop submitEvent. En EditTodoPage recibes ese valor (puedes llamarlo newText) y lo combinas con el id extraído de la URL para llamar a editTodo(todoId, newText).
La secuencia importa: primero ejecutas la edición y después rediriges al home. Si inviertes el orden, el redirect cancela la actualización antes de que el estado se guarde.
Cómo replico el patrón en NewTodoPage para agregar TODOs
La página de creación sigue la misma estructura, pero más simple. Como addTodo genera el id internamente con la función newTodoId, solo necesitas pasarle el texto que devuelve el formulario.
- Importas
useTodosy desestructurasaddTododesdestateUpdaters. - En el
submitEventrecibes el texto del formulario. - Llamas a
addTodo(newText). - Rediriges al home.
Con este cambio, agregar un TODO desde una página dedicada funciona igual que hacerlo desde el modal original, pero ahora con una URL propia y navegación nativa del navegador.
Qué falta pulir en la experiencia de edición
Hay un detalle de UX pendiente: cuando entras a /edit/:id, el textarea aparece vacío. El usuario tiene que reescribir todo desde cero, incluso si solo quería corregir una tilde. Lo lógico sería precargar el texto actual del TODO como valor por defecto del formulario, leyéndolo del estado a partir del id de la URL.
Ese ajuste queda para la siguiente iteración, pero el flujo principal ya funciona: editas un TODO, ves el cambio reflejado en la lista y el id se mantiene estable en todo el proceso.
¿Cómo resolverías tú la precarga del texto en el formulario de edición? Cuéntame en los comentarios qué enfoque usarías.