LocalStorage es una herramienta poderosa para el almacenamiento de datos persistentes del lado del cliente en las aplicaciones web. Te ofrece una manera de guardar datos en el navegador del usuario de forma que persistan incluso después de cerrar el navegador o recargar la página. A diferencia de un objeto en JavaScript, LocalStorage no pierde su información tras estas acciones, convirtiéndolo en una opción ideal para el manejo de datos que deben perdurar.
¿Cómo interactuamos con LocalStorage?
Para utilizar LocalStorage, es esencial seguir ciertos mecanismos debido a las restricciones en su manejo:
SetItem: Usamos este método para guardar un valor. Debe recibir el nombre clave y el valor que deseamos almacenar.
GetItem: Permite leer la información almacenada usando el nombre clave.
Storage length: Indica el número de elementos almacenados.
La estructura en LocalStorage es similar a la de un objeto en JavaScript, requiriendo nombres claves únicos para cada valor. Sin embargo, a diferencia de los objetos de JavaScript tradicionales, LocalStorage solo admite almacenamiento en formato string.
// Ejemplo de cómo almacenar un valorlocalStorage.setItem('nombreClave','valor');
¿Cómo gestionamos los datos más complejos?
LocalStorage está limitado a almacenar datos en formato string, lo que presenta un reto cuando intentamos guardar objetos o arrays. Para esto, utilizamos funciones como JSON.stringify y JSON.parse:
JSON.stringify: Convierte objetos o arrays en un formato string para ser almacenados.
JSON.parse: Restaura un string a su forma de objeto original.
// Conversión de un objeto a string para almacenarloconst miObjeto ={nombre:'Película',puntuación:4.5};localStorage.setItem('miObjeto',JSON.stringify(miObjeto));// Conversión de string a objeto para su usoconst objetoRecuperado =JSON.parse(localStorage.getItem('miObjeto'));console.log(objetoRecuperado.nombre);// Output: Película
¿Cómo se implementa LocalStorage en una aplicación?
Para la implementación práctica, una función puede identificar si un elemento debe ser almacenado o eliminado basado en su estado de preferencia (like o dislike). Supongamos que queremos gestionar una lista de películas favoritas:
Identificación y almacenamiento: Al hacer clic en un botón de "like", verificamos si la película ya está en el localStorage; si no, la añadimos.
Eliminación: Si la película ya está almacenada, procedemos a eliminarla al "deslikear".
Ejemplo de implementación de LocalStorage para "like/dislike" de películas
functionlikeMovie(movie){let likedMovies =JSON.parse(localStorage.getItem('likedMovies'))||{};if(likedMovies[movie.id]){delete likedMovies[movie.id];// Eliminar si ya existía}else{ likedMovies[movie.id]= movie;// Agregar si no existía}localStorage.setItem('likedMovies',JSON.stringify(likedMovies));}
¿Qué limitaciones y recomendaciones existen?
Tamaño de almacenamiento: LocalStorage tiene un límite máximo de alrededor de 5MB por dominio, superarlo puede resultar en errores.
Seguridad: Los datos en LocalStorage no deben contener información sensible, ya que no se cifran de forma predeterminada.
Sincronización: Los datos almacenados no se sincronizan automáticamente entre dispositivos.
Consejos para un uso eficiente de LocalStorage
Optimización de datos: Almacena solo lo necesario y utiliza compresión de datos si es posible.
Manejo de errores: Siempre verifica la disponibilidad de LocalStorage en el navegador del usuario antes de su uso.
Pruebas: Realiza pruebas exhaustivas para verificar la persistencia y consistencia de los datos entre sesiones.
LocalStorage es una herramienta versatile, pero requiere una correcta comprensión y uso adecuado para maximizar sus beneficios sin comprometer el rendimiento de la aplicación. Sigue explorando y experimentando con el almacenamiento local en tus proyectos para aprovechar al máximo esta característica. ¡Buena suerte y sigue aprendiendo!
si, yo tambien lo hice de esa forma, me parece mejor
Para no tener que hacer el localStorage.removeItem('elemento') cada vez que quieran borrar algo del localStorage pueden desde las herramientas de desarrollador en Chrome, en la barra donde aparece Elements, Console y Network darle a las flechas y seleccionar Application. Ahí van a ver una opción de Local Storage que si le dan click derecho les da la opción para borrar todo el Local Storage de la página.
Este video no lo puedo descargar desde la app mobile, porfa arreglarlo, porque con lo lento de mi internet no puedo ver la clase :(
Reportado al equipo
Dejo un pequeño aporte. :D
Una forma de acortar el código en las funciones likeMovie y likedMoviesList es utilizando el operador ternario de la siguiente forma:
Supongo que la otra forma de agregar películas a favoritos es usando el endpoint de favorites de la API, y justo allí llega la dicotomía de si usar los llamados directamente a la API o usando localstorage.
aqui tengo mi solucion para que agregue y para que borre los favoritos
functionlikeMovie(movie){const likedMovies =likedMovieList()if(likedMovies[movie.id]){console.log("quitar")delete likedMovies[movie.id];localStorage.setItem("liked_movies",JSON.stringify(likedMovies))console.log(JSON.parse(localStorage.getItem("liked_movies")))}else{console.log("agregar") likedMovies[movie.id]= movie
localStorage.setItem("liked_movies",JSON.stringify(likedMovies))console.log(JSON.parse(localStorage.getItem("liked_movies")))}}
aparte hay un bug aqui cuando la pagina recarga pone los corazones morados aun cuando el el local storage ya estan agregadas a favoritos asi que hice una comprobacion el la funcion donde se le agregan las clases al btn para que le coloque la correspondiente
No puedo ver el video, dice que es error del servidor o de mi red, pero todos los demas si los puedo ver. Probe con una solucion que vi en otra pregunta de cambiar de servidor pero solo me aparece disponible el c, por lo que no lo puedo cambiar . Tambien probe en otros navegadores y me da el mismo error :(
Hola Luis.
Estuve revisando el contenido y todo parece ir sin problemas, ¿has intentado borrar el caché del equipo?
Hola! Si, probe borrando cachè, probe en incognito, pero no consigo solucionarlo.
18:49
.
No estamos enviando el objeto en forma de string al localStorage y tampoco le asignamos una key
Ví el vídeo e intente replicarlo luego pero sin éxito :(...y eso que lo estoy haciendo apenas me levanté con la mente despejada :(...¿algún consejo que permita entender mejor la lógica?
Hola Ricardo, he estado exactamente en la misma posición en la que te encuentras tú infinidad de veces. Lo que hago es que reduzco al máximo la lógica que implementa el profesor.
.
Es decir, reduzco el problema a pasos simples y muy muy sencillos, que puedo implementar en un espacio de "entrenamiento" o "experimento". Básicamente aíslo el problema. Así he podido resolver problemas complejos.
.
Y además, resolver problemas de lógica, ejercicios de programación donde se trate más de resolver un problema per sé en vez de implementar algo en una aplicación.
JSON.stringify y JSON.parse no saben trabajar con métodos así que simplemente los ignoran y no los parsean o stringyfea🤔
Yep, pero no necesitas guardar métodos en Local Storage... ¿o sí?
Para baciar el localStorage facilmente puedes usar esta extension en Chrome
Clear Cache
Dejo mi pequeño aporte. :D
Para los que están confundidos como yo preguntándose «¿cómo es que se borra la película? En ningún momento utilizamos algo para borrarla»
La respeta es que si, si estamos usando código para poder borrar la película de local storage. Lo hacemos utilizando el método statico JSON.stringifly(), cuando convierte el objeto en un string y unos de los valores del mismo es undefined la key es ignorada.
Mi aporte, esta fue la manera en que defini las funciones.
functionlikedMoviesList(){const item =localStorage.getItem('liked_movies');return item ?JSON.parse(item):{};}functionlikeMovie(movie){// movie.idif(!movie ||!movie.id){console.error('El objeto movie es inválido o no tiene un id');return;}console.log(movie);const likedMovies =likedMoviesList();console.log("Peliculas guardadas", likedMovies);if(likedMovies[movie.id]){delete likedMovies[movie.id];}else{ likedMovies[movie.id]= movie;}localStorage.setItem('liked_movies',JSON.stringify(likedMovies));}```Dentro de la funcion createMovies fue lo siguiente:
```js
// Primera parte del codigo...//...const movieBtns = container.querySelectorAll('[data-favorite-btn]'); movieBtns.forEach(movieBtn=>{const movieId = movieBtn.getAttribute('data-favorite-btn');const movie = movies.find(m=> m.id== movieId); movieBtn.addEventListener('click',(e)=>{ e.stopPropagation(); e.stopImmediatePropagation(); movieBtn.classList.toggle('movie-btn--liked');likeMovie(movie);});});//LazyLoad ...
functionfavoritesMoviesList(){returnJSON.parse(localStorage.getItem('liked_movies'));}functionsaveFavoriteMovie(movie){const listMovies =favoritesMoviesList();if(listMovies.length>0&& listMovies.find(item=> item.id=== movie.id)){const arr = listMovies.findIndex(item=> item.id=== movie.id)console.log(arr) favoriteMovies.splice(arr,1)}else{ favoriteMovies.push(movie)}localStorage.setItem('liked_movies',JSON.stringify(favoriteMovies));getFavoritesPreview();}```Al intentarlo hacer por mi cuenta yo cree un array vacio donde lo llenaba con push al agregar favoritos de estamanera queda en el orden que los voy agregando, cosa que no vi en el ejemplo del profe, no se que tanto afecet el rendimiento.functionfavoritesMoviesList(){returnJSON.parse(localStorage.getItem('liked\_movies'));}functionsaveFavoriteMovie(*movie*){const listMovies =favoritesMoviesList();if(listMovies.length>0&& listMovies.find(*item*=>*item*.id===*movie*.id)){const arr = listMovies.findIndex(*item*=>*item*.id===*movie*.id)console.log(arr) favoriteMovies.splice(arr,1)}else{ favoriteMovies.push(*movie*)}localStorage.setItem('liked\_movies',JSON.stringify(favoriteMovies));getFavoritesPreview();}
Intenet hacerlo por mi cuenta y creo que me alargue un poco mas, abierto a observaciones si es una buena solucion o me complique:
Esta es la forma que se me ocurre min 17:00const likedFilmsList = () => { const item = localStorage.getItem('likedFilm')
return item ? localStorage.getItem('likedFilm') : '{}'}
const likeFilm = (movie) => { const likedFilms = JSON.parse(likedFilmsList()) if (likedFilms[movie.id]) { delete likedFilms[movie.id] localStorage.setItem('likedFilm' , JSON.stringify(likedFilms)) } else { likedFilms[movie.id] = movie localStorage.setItem('likedFilm' , JSON.stringify(likedFilms)) }}
export { likeFilm }
constlikedFilmsList=()=>{const item =localStorage.getItem('likedFilm')return item
?localStorage.getItem('likedFilm'):'{}'}constlikeFilm=(movie)=>{const likedFilms =JSON.parse(likedFilmsList())if(likedFilms[movie.id]){delete likedFilms[movie.id]localStorage.setItem('likedFilm',JSON.stringify(likedFilms))}else{ likedFilms[movie.id]= movie
localStorage.setItem('likedFilm',JSON.stringify(likedFilms))}}export{ likeFilm }```Convertir los datos a JSON borrarlos o agregarlos y pasárselos de nuevo