20-Eliminar Película - Paso 20
Objetivo
Implementar la funcionalidad para eliminar una película de nuestra aplicación de películas.
Requisitos Previos
Tener implementado el listado de películas
Tener implementada la edición de películas
Servicio
MovieServicecon método para eliminar películas
Pasos para Implementar la Eliminación
Paso 1: Crear el método para eliminar
En el archivo movie.js (o el componente de edición de película), justo antes del return, agregamos el método deleteMovie:
// Método para eliminar una película
const deleteMovie = () => {
// Pedir confirmación al usuario
const confirmDelete = window.confirm("¿Seguro que deseas eliminar esta película?");
// Si el usuario cancela, no hacer nada
if (!confirmDelete) return;
// Llamar al servicio para eliminar la película
MovieService.delete(movie.id)
.then(() => {
// Navegar de vuelta al listado de películas
props.history.push('/movies');
// Mostrar mensaje de éxito (opcional)
alert("Película eliminada correctamente");
})
.catch((error) => {
// Manejar errores
console.error("Error al tratar de eliminar la película:", error);
alert("Hubo un error al eliminar la película");
});
};Paso 2: Agregar el botón de eliminar en la interfaz
En la sección de botones (junto al botón de "Actualizar Película"), agregamos:
{/* Botón para eliminar la película */}
<button
className="btn btn-danger mr-2"
onClick={deleteMovie}
>
Eliminar Película
</button>
{/* Botón para actualizar (ya existente) */}
<button
className="btn btn-primary"
onClick={handleSubmit}
>
Actualizar Película
</button>Paso 3: CSS para el botón (opcional)
/* Estilos para el botón de eliminar */
.btn-danger {
background-color: #dc3545;
border-color: #dc3545;
color: white;
}
.btn-danger:hover {
background-color: #c82333;
border-color: #bd2130;
}
/* Espaciado entre botones */
.mr-2 {
margin-right: 0.5rem;
}Paso 4: Método en el servicio (MovieService)
Asegurarnos que el servicio tenga el método delete:
// En MovieService.js
class MovieService {
// ... otros métodos ...
static delete(id) {
return fetch(`${API_URL}/movies/${id}`, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
// Agregar token de autenticación si es necesario
}
});
}
}Explicación del Código
1. Confirmación del Usuario
const confirmDelete = window.confirm("¿Seguro que deseas eliminar esta película?");Usamos
window.confirm()para mostrar un diálogo de confirmaciónEsto evita eliminaciones accidentales
Si el usuario hace clic en "Cancelar", el método retorna inmediatamente
2. Llamada al Servicio
MovieService.delete(movie.id)Enviamos solo el ID de la película al servicio
El servicio construye la URL completa:
/movies/{id}
3. Navegación después de eliminar
props.history.push('/movies');Después de eliminar exitosamente, redirigimos al usuario al listado
Esto permite ver que la película ya no aparece en la lista
4. Manejo de Errores
.catch((error) => {
console.error("Error al tratar de eliminar la película:", error);
alert("Hubo un error al eliminar la película");
});Capturamos cualquier error que ocurra durante la eliminación
Informamos al usuario sobre el problema
Ejemplo Completo del Componente
import React, { useState, useEffect } from 'react';
import MovieService from '../services/MovieService';
import { useParams, useHistory } from 'react-router-dom';
function MovieEdit() {
const { id } = useParams();
const history = useHistory();
const [movie, setMovie] = useState({
title: '',
director: '',
year: '',
genre: '',
rating: ''
});
// Cargar datos de la película
useEffect(() => {
MovieService.getById(id)
.then(response => setMovie(response.data))
.catch(error => console.error("Error cargando película:", error));
}, [id]);
// Método para eliminar
const deleteMovie = () => {
const confirmDelete = window.confirm("¿Seguro que deseas eliminar esta película?");
if (!confirmDelete) return;
MovieService.delete(id)
.then(() => {
history.push('/movies');
alert("Película eliminada correctamente");
})
.catch((error) => {
console.error("Error eliminando película:", error);
alert("Error al eliminar la película");
});
};
// Método para actualizar
const handleSubmit = (e) => {
e.preventDefault();
MovieService.update(id, movie)
.then(() => history.push('/movies'))
.catch(error => console.error("Error actualizando:", error));
};
return (
<div className="container mt-4">
<h2>Editar Película</h2>
<form onSubmit={handleSubmit}>
{/* Campos del formulario */}
<div className="form-group">
<label>Título</label>
<input
type="text"
className="form-control"
value={movie.title}
onChange={(e) => setMovie({...movie, title: e.target.value})}
/>
</div>
{/* Más campos... */}
<div className="mt-4">
<button
type="button"
className="btn btn-danger mr-2"
onClick={deleteMovie}
>
Eliminar Película
</button>
<button
type="submit"
className="btn btn-primary"
>
Actualizar Película
</button>
</div>
</form>
</div>
);
}
export default MovieEdit;Buenas Prácticas
1. Confirmación Doble
Siempre pedir confirmación antes de eliminar
Considerar usar un modal más elaborado en lugar de
window.confirm()
2. Feedback al Usuario
Mostrar mensajes de éxito/error
Considerar usar notificaciones toast en lugar de
alert()
3. Estados de Carga
const [isDeleting, setIsDeleting] = useState(false);
const deleteMovie = () => {
// ... confirmación ...
setIsDeleting(true);
MovieService.delete(id)
.then(() => {
// ... éxito ...
})
.catch((error) => {
// ... error ...
})
.finally(() => {
setIsDeleting(false);
});
};4. Accesibilidad
<button
aria-label="Eliminar película"
disabled={isDeleting}
>
{isDeleting ? 'Eliminando...' : 'Eliminar'}
</button>Resumen
Hemos completado el CRUD completo de películas:
✅ Create - Crear nueva película
✅ Read - Leer/listar películas
✅ Update - Actualizar película existente
✅ Delete - Eliminar película
La funcionalidad de eliminar incluye:
Botón en la vista de edición
Confirmación del usuario
Llamada al servicio API
Redirección al listado
Manejo de errores
Recursos Adicionales
¡Felicidades! Has completado el módulo de operaciones CRUD para películas. Este patrón se puede aplicar a cualquier entidad en tus aplicaciones React.
Comentarios
Publicar un comentario