Para que el input quede vacío al momento de agregar una tarea a la lista, solamente se agrega input.value='' en el método changeHandler() '; Quedando así:

¿Cómo hacer la lista de tareas dinámica?
No basta con renderizar una lista de tareas, hay que hacerla dinámica para que actualice automáticamente cuando se agregan nuevos elementos. Comenzamos leyendo el input donde se introduce la nueva tarea. Implementaremos un método para capturar el cambio en el input y actualizar nuestro Array.
¿Cómo capturar los cambios en el input?
En el código, ya tenemos un input donde introducimos las tareas. Crearemos un método llamado chainHandler para recibir el valor que ingrese el usuario y almacenarlo en el Array.
function chainHandler(event) { let inputElement = event.target; let newTask = inputElement.value; // Implementar lógica para agregar nueva tarea en el Array }
¿Cómo agregar una nueva tarea a la lista?
Para incorporar la nueva tarea sin reiniciar la lista, usaremos Signals con el método update, que nos permite modificar o incluir un nuevo valor manteniendo los existentes:
function chainHandler(event) { let inputElement = event.target; let newTask = inputElement.value; tasks.update(previousTasks => [...previousTasks, newTask]); }
¿Qué hace el método update?
El método update en Signals crea un nuevo estado sin mutar el anterior, clonando las tareas actuales y añadiendo la nueva al final. Esto es clave para manejar estados de forma efectiva.
¿Cómo eliminar tareas de la lista?
Eliminar un elemento de la lista también debe preservar el estado sin mutar el original, utilizando Signals y creando un nuevo estado.
¿Cómo implementar el método deleteTask?
Creamos un método que reciba la posición de la tarea a eliminar y use un filtro para crear un nuevo Array sin esa tarea:
function deleteTask(index) { tasks.update(previousTasks => previousTasks.filter((_, pos) => pos !== index) ); }
¿Cómo se integra el deleteTask en la interfaz?
Agregamos un click handler al botón de eliminación para llamar el método deleteTask con el índice de la tarea:
<button onclick="deleteTask(index)">Eliminar</button>
¿Cómo verificar el funcionamiento?
Podemos probarlo ingresando nuevas tareas y eliminando las existentes en la aplicación para verificar cómo el estado de la lista se actualiza de forma dinámica y eficiente. Recuerda que mantener la interfaz y la lógica de la aplicación reactividad mejora la experiencia del usuario y facilita el manejo de estados a gran escala. ¡Sigue experimentando y aprendiendo!
No basta con renderizar una lista de tareas, hay que hacerla dinámica para que actualice automáticamente cuando se agregan nuevos elementos. Comenzamos leyendo el input donde se introduce la nueva tarea. Implementaremos un método para capturar el cambio en el input y actualizar nuestro Array.
input?En el código, ya tenemos un input donde introducimos las tareas. Crearemos un método llamado chainHandler para recibir el valor que ingrese el usuario y almacenarlo en el Array.
function chainHandler(event) {
let inputElement = event.target;
let newTask = inputElement.value;
// Implementar lógica para agregar nueva tarea en el Array
}
Para incorporar la nueva tarea sin reiniciar la lista, usaremos Signals con el método update, que nos permite modificar o incluir un nuevo valor manteniendo los existentes:
function chainHandler(event) {
let inputElement = event.target;
let newTask = inputElement.value;
tasks.update(previousTasks => [...previousTasks, newTask]);
}
update?El método update en Signals crea un nuevo estado sin mutar el anterior, clonando las tareas actuales y añadiendo la nueva al final. Esto es clave para manejar estados de forma efectiva.
Eliminar un elemento de la lista también debe preservar el estado sin mutar el original, utilizando Signals y creando un nuevo estado.
deleteTask?Creamos un método que reciba la posición de la tarea a eliminar y use un filtro para crear un nuevo Array sin esa tarea:
function deleteTask(index) {
tasks.update(previousTasks =>
previousTasks.filter((_, pos) => pos !== index)
);
}
deleteTask en la interfaz?Agregamos un click handler al botón de eliminación para llamar el método deleteTask con el índice de la tarea:
<button onclick="deleteTask(index)">Eliminar</button>
Podemos probarlo ingresando nuevas tareas y eliminando las existentes en la aplicación para verificar cómo el estado de la lista se actualiza de forma dinámica y eficiente. Recuerda que mantener la interfaz y la lógica de la aplicación reactividad mejora la experiencia del usuario y facilita el manejo de estados a gran escala. ¡Sigue experimentando y aprendiendo!
Para que el input quede vacío al momento de agregar una tarea a la lista, solamente se agrega input.value='' en el método changeHandler() '; Quedando así:

En mi caso lo hice con splice
deleteTask(index: number): void {
this.tasks.update((tasks) => {
tasks.splice(index, 1);
return tasks;
});
}
Otra alternativa por si desean...

Personalmente prefiero usar nombres más semanticos en las funciones por ejemplo:
onNewTaskInputEvent(event: Event) {
const inputField = event.target as HTMLInputElement; const newTask = inputField.value; this.tasks.update((tasks) => [...tasks, newTask]);
}
El método filter recibe una función de callback que puede tener hasta tres parámetros:

hola, entiendo ala perfeccion el video pero me genero una duda, la cual es ¿por que filter? y funciona con la misma lojica al traer la informacion desde una base de datos? (se que no han tocado temas de bases de datos pero me genero esa duda)
Creo que hay un error conceptual al hablar de inmutabilidad ya que al final el estado del array 'Tasks' si está mutando.
En este caso no hay diferencia entre utilizar el .update o .set.
deleteTask(index: number) {
this.tasks.set(
this.tasks()
.filter((_, position) => position != index));
}
hola, profe estoy siguiendo el curso tal cual y no me aparece el menu , me puede indicar lo que
puede hacer para corregirle este parte


Yo lo hice por el nombre
handleDestroyTask(currentTask: string) {
this.tasks.update((prev) => prev.filter(task => !task.toLowerCase().includes(currentTask.toLowerCase())));
}