No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

14 Días
16 Hrs
12 Min
33 Seg
Curso de React.js

Curso de React.js

Juan David Castro Gallego

Juan David Castro Gallego

Local Storage con React.js

13/34
Recursos

Aportes 54

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

🔵Evita acceder al localStorage dentro del componente

Acceder a los valores del localStorage dentro del componente es muy pesado en cuanto al rendimiento, ya que se ejecuta sincrónicamente en cada re-renderizado del componente. En su lugar, puedes leerlo utilizando un callback que retorne el valor inicial del useState, esto permitirá acceder a la información una sola vez al momento que se crea el componente, esto por la definición de useState.
.

const [todos, setTodos] = useState(() => {
  const todosFromStorage = window.localStorage.getItem('TODOS_V1')
  if (todosFromStorage) return JSON.parse(todosFromStorage)
  return []
})

LocalStorage es una forma de almacenar datos en el navegador web, que persisten aún después de que el usuario haya cerrado la ventana o salido del sitio web. Es útil para guardar información del usuario, como preferencias, configuraciones, entre otros.
.
Los métodos más comunes de LocalStorage son:
.
localStorage.setItem(key, value): Agrega un elemento con una clave y un valor al almacenamiento local.
localStorage.getItem(key): Recupera el valor de la clave especificada en el almacenamiento local.
localStorage.removeItem(key): Remueve un elemento del almacenamiento local según su clave.
localStorage.clear(): Borra todos los elementos del almacenamiento local.

Chicos para comentar las lineas de codigos recuerden que el atajo es control + k + c, para descomentar es control + k + u

Renderizado inicial desde Local Storage (version abreviada):

Yo use useEffect() para manejar el localStorage.
El primer useEffect() trae los datos de localStorage a nuestra app, y el segundo actualiza el LocaStorage cada vez que cambia el estado de tasks.

  useEffect(() => {
    if (localStorage.getItem("TODOS_V1")) {
      if (JSON.parse(localStorage.getItem("TODOS_V1")).length > 0) {
        setTasks(JSON.parse(localStorage.getItem("TODOS_V1")));
      }
    }
  }, []);
  useEffect(() => {
    const savedData = [...tasks];
    localStorage.setItem("TODOS_V1", JSON.stringify(savedData));
  }, [tasks]);

Local Storage con React.js

💡 Local Storage es un metodo para tener datos persistentes del lado del navegador. Se pueden almacenar inicios de sesion y/o estados y aunque se recarge, cierre o reinicie permaneceran disponibles para su uso.
.
Local Storage solo puede guardan datos en formato string. Se guardan en formato de Clave : Valor.
.

Como guardar y acceder a datos en Local Storage

  1. Todo dato a guardar en Local Storage debe ser convertido a string, se puede hacer con la funcion JSON.stringyfi( datos ).

    //* transformar datos a string
    let stringifiedTodos = JSON.stringify(localStorageTodos)
    
  2. Guardar datos en Local Storage mediante la funcion localStorage.setItem( ).
    Esta funcion recibe dos parametros: 1. El nombre identificador de los datos y 2. los datos como string.
    Si la clave ya existe se reemplazara su valor.

    //* Guardar datos en Local Storage con setItem()
    localStorage.setItem('TODOS_V1', stringifiedTodos)
    
  3. Acceder a datos guardados en Local Storage con el metodo getItem()
    getItem recibe un parametro que es el nombre identificador de los datos que se requieren.

    //* Obteniendo datos de Local Storage con getItem()
    const localStorageTodos = localStorage.getItem('TODOS_V1')
    
  4. Convertir datos de Local Storage a datos de JavaScript: Los datos vienen en formato string y se pueden transformar para ser manipulados en JavaScript mediante la funcion JSON.parse()

    let parsedTodos = JSON.parse(localStorageTodos);
    
  5. Remover datos de Local Storage: con el metodo localStorage.removeItem( nombreItem ) se puede eliminar un valor guardado.
    localStorage.removeItem( 'nombreItem' )

  6. Limpiar Local Storage: se pueden eliminar todos los datos guardados con el metodo localStorage.clear();

cuando el profesor iba a ver si el condicional funcionó en el minuto 19:56 a mi me aparecía enste nuevo error: **VM659:1 Uncaught SyntaxError: Unexpected token 'o', "\[object Obj"... is not valid JSON at JSON.parse (\<anonymous>)** que significaba que cuando quería parsear el localStorageTodos en caso de que hubiera infomación, no era válido, y yo no entendía qué estaba sucediendo si había escrito todo bien. estuve unos buenos minutos tan frustrada que lloré (tengo mucho estrés acumulado) y al final me tocó acudir con mi hermano mayor. todo el problema era que tenía información guardada en el localStorage y eso obstruía todo el flujo de código nuevo que había escrito, justo como el profesor había advertido. había olvidado que no borré la información que había guardado de las pruebas. les recomiendo mucho que, en caso de que se sientan muy estresados con un error, se levanten de la silla y se despejen un rato. a mí la frustración me cegó de tal forma que no pude recapitular todo lo que había hecho y encontrar el error a base de ello. espero que mi experiencia le sea de ayuda a alguna persona que tal vez esté pasando por lo mismo o algo parecido.

Local Storage herramienta que nos ayuda hacer persistencia de datos en el navegador.

LocalStorage en React:

LocalStorage es una característica del navegador que permite a las aplicaciones web almacenar datos de forma persistente en el navegador. Estos datos se conservan incluso cuando se cierra la pestaña del navegador o se reinicia la computadora. En React, LocalStorage se utiliza comúnmente para almacenar y recuperar información importante del usuario, como configuraciones, preferencias o datos temporales.

Principales Conceptos:

  1. Almacenamiento de Datos:

    • LocalStorage permite almacenar pares clave-valor en el navegador. Los datos se almacenan como cadenas de texto.
  2. Persistencia de Datos:

    • Los datos almacenados en LocalStorage persisten a través de las recargas de página y las sesiones del navegador. Esto significa que los datos estarán disponibles incluso después de cerrar y volver a abrir la aplicación.
  3. Capacidad de Almacenamiento:

    • La capacidad de almacenamiento de LocalStorage es generalmente mayor que la de las cookies, pero aún así tiene límites. Se puede almacenar alrededor de 5 MB de datos por dominio.

Uso de LocalStorage en React:

En React, puedes interactuar con LocalStorage para almacenar y recuperar datos utilizando las siguientes funciones principales:

  1. localStorage.setItem(key, value)

    • Esta función se utiliza para almacenar un par clave-valor en LocalStorage. key es la clave con la que se identificará el valor y value es el dato que se almacenará.
    localStorage.setItem('username', 'john_doe');
    
  2. localStorage.getItem(key)

    • Esta función se utiliza para recuperar el valor asociado con una clave específica desde LocalStorage.
    const username = localStorage.getItem('username');
    
  3. localStorage.removeItem(key)

    • Esta función elimina el par clave-valor asociado con la clave especificada de LocalStorage.
    localStorage.removeItem('username');
    

Uso Común en React:

En una aplicación React, LocalStorage se utiliza comúnmente para:

  • Guardar Preferencias del Usuario:

    • Guardar configuraciones personalizadas, temas o preferencias del usuario para que se mantengan entre sesiones.
  • Persistir Datos Temporales:

    • Mantener datos temporales, como formularios no completados, incluso si la página se recarga.
  • Manejar Sesiones de Usuario:

    • Almacenar información sobre la sesión del usuario para mantenerlo autenticado incluso después de cerrar y volver a abrir la aplicación.

Ejemplo en React:

// Almacenar en LocalStorage
localStorage.setItem('theme', 'dark');

// Recuperar de LocalStorage
const theme = localStorage.getItem('theme');

// Eliminar de LocalStorage
localStorage.removeItem('theme');

Recuerda que los datos almacenados en LocalStorage son accesibles a través de JavaScript en el navegador, por lo que no se deben almacenar datos sensibles o críticos de seguridad en LocalStorage.

Si el elemento de localStorage se encuentra en el estado inicial, o si está vacío, recomiendo:

const [todos, setTodos] = React.useState(parsedTodos || []);

Leí en un comentario que no se debe trabajar tanto con el storage dentro del componente por tema de optimización, así que lo hice un poquito diferente para evitar los condicionales en medio del componente y acceder al localStorage ahí.
¿Alguien sabe si es correcto y óptimo hacerlo así?

Nota: la herramienta es CodeSnap en VS Code.

🔥 Atajos de VSC

Si quieren saber los atajos de VSC y quieren elegir los más útiles, pueden leer estos ✨ apuntes sobre atajos de VSC. La verdad es que sirven mucho.

Alguien me puede enseñar como el profe Juan borra palabras tan rapido? jaja estoy en Mac

Mi nuevo verbo aprendido: "estringuifiar". Tú estringuifeas, yo estringuifeo. ... jejeje A ver qué tal me sale el trabalenguas: "*un estringuifiador no pudo estringuifiar. Cualquiera que sí lo pueda estringuifiar, buen estringuifiador será*" Un abrazo Juan...

Para el manejo del error de que no exista data inicial, acorté un poco el código:

  let parsedTodos = JSON.parse(localStorage.getItem('TODOS_V1'));
  if (!parsedTodos) {
    localStorage.setItem('TODOS_V1', JSON.stringify([]))
    parsedTodos = []
  }

otra clase muy satisfactoria… 😃

A mi me funciona si el operador ternario lo colocamos directo en el estado inicial de todos quedano de la asiguiente forma:

const [todos, setTodos] = React.useState(
    parsedToDos ? JSON.parse(parsedToDos) : []
  );

Para hacer el paso de manejo de localStorage no es 100% necesario usar el condicional if, si quieren usar un codigo mas corto simplemente pueden apoyarse en los valores por defecto o default values

const localStorageTodos = localStorage.getItem('Todos_V1')

let parsedTodos = JSON.parse(localStorageTodos) || localStorage.SetItem('Todos_V1', JSON.stringify([]))

De esta manera tenemos el mismo resultado pero mas legible para mi gusto.

Local Storage es una API del navegador que permite almacenar datos de manera persistente. Funciona guardando pares clave-valor en forma de strings. Puedes acceder a los datos con `getItem`, guardarlos con `setItem`, y eliminarlos con `removeItem`. Recuerda que para guardar objetos o arrays, debes convertirlos a string usando `JSON.stringify` y, al recuperarlos, convertirlos de nuevo a su forma original con `JSON.parse`. Esto asegura que la información se mantenga incluso después de cerrar el navegador.
`const parsedTodos = JSON.parse(localStorage.getItem('TODOS_V1')) ?? [];`
me ha matado, estoy totalmente en OffSide. Hice paso por paso y se me rompió toda la página. A tal punto que dije "ok, voy a recursos y copio y pego y analizó en donde estoy mal" y nada O.o. Hice correr directamente el código de recursos y tampoco O.o. A alguien le ha funcionado? infelizmente tuve que buscar info por internet porque me rendí y tuve que reemplazar ese if-else por try \&catch. Habra que ver en donde mas se me va a romper a futuro O.o
Se puede simplificar con una ternaria para evitar sintaxis de condicional. let getTaskFromLocalStorage = localStorage.getItem('TaksListStorage') let parsedLocalStorage = getTaskFromLocalStorage ? getTaskFromLocalStorage.JSON.stringify() : \[] ```js let getTaskFromLocalStorage = localStorage.getItem('TaksListStorage') let parsedLocalStorage = getTaskFromLocalStorage ? getTaskFromLocalStorage.JSON.stringify() : [] ```
Se puede usar una ternaria en vez de la sintaxis tradicional de condiciones. ```js let getTaskFromLocalStorage = localStorage.getItem('TaksListStorage') let parsedLocalStorage = getTaskFromLocalStorage ? getTaskFromLocalStorage.JSON.stringify() : [] ```
Compiled with problems:X

ERROR in ../../../../../../../node_modules/nodemon/lib/utils/index.js 2:11-26

Module not found: Error: Can't resolve 'path' in '/home/ervin/node_modules/nodemon/lib/utils'

BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:
	- add a fallback 'resolve.fallback: { "path": require.resolve("path-browserify") }'
	- install 'path-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
	resolve.fallback: { "path": false }

si les pasa este error es por que vscode automaticamente importo.

import { stringify } from "nodemon/lib/utils";

solo tiene que borrar esta importaciòn que esta en app.js

no es mucho pero ami me gusta ![](https://static.platzi.com/media/user_upload/image-a05dfc6f-fe33-4a9d-a9e0-89892e0c1376.jpg)

con todo respeto a el proje juan, y a todos los desarrolladores de scripting, que cuando la gente cree que lo unico en el mundo que existe es javascript no saben crear codigo scalable y mantenible. Este codigo en la vida real seria muy dificil de mantener por que tiene un nivel brutal de acoplamiento. Eso hace que sea muy dificil de debuggear y modificar. y no hablo que se necisite dividir en carpetas eso no es importante. Es que las funciones deberian ser abstractas y no cambiar su funionamiento dentro si no por parametros pero este codigo no es para nada ingenieria de software parece mas hecho de afan.

adjunto mi pequeño aporte para mejorar un poco la lectura del codigo

//local storage
    const local_Todos = () => {
        let localStorageTodos = JSON.parse(localStorage.getItem("TODOS"));
        if (!localStorageTodos) {
            localStorage.setItem("TODOS", JSON.stringify([]));
            return (localStorageTodos = []);
        } else {
            return localStorageTodos;
        }
    };
    const [searchValue, setSearchValue] = React.useState("");
    const [todos, setTodos] = React.useState(local_Todos()); 

Local Storage herramienta que nos ayuda hacer persistencia de datos en el navegador.

Me encanto esta clase, localStorage es una API del navegador muy poderosa que debemos aprender.

usé saveTask jajaja

Que curiosidad, comparé la línea de código 43 con la del profe y me di cuenta que él no tenía el método ‘toLowerCase’ en esa línea, quité ese método y al completar algún Todo, y refrescar la página; no salía el Todo completado

return todoText.toLowerCase().includes(searchText)

Para aquellos que se aventuraron a hacer este curso en TS, bueno les dejo mi codigo para que puedan guiarse y comentar algun plus

const useLocalStorege = <T,>(itemName:string, initialValue:T): [T, (newTodos: T) => void] => {
  
  const localStorageTodos = localStorage.getItem(itemName);
  
  let parsedTodos:T;
  
  if(!localStorageTodos){
    localStorage.setItem(itemName, JSON.stringify(initialValue))
    parsedTodos = initialValue
  } else {
    parsedTodos = JSON.parse(localStorageTodos) as T;
  }

  const [item, setItem] = useState<T>(parsedTodos);

  const saveTodos = (newTodos:T) => {
    setItem(newTodos);
    localStorage.setItem(itemName, JSON.stringify(newTodos))
  }

  return [
    item,
    saveTodos
  ]

}

Como el profe Juan pidió que en comentarios pongamos si pusimos otro nombre a la función de salvar y guardar en local y en el estado. Les comparto: `setStateAndSave`
Mi aproximacion al problema de no encontrar los toDos verificando los posibles errores: la funcion setStorage se encarga de obtener los ToDos y la funcion setStorage se encaga exclusivamente de setear los ToDos. Me gustaria saber que opinan. `const localStorageId = "TODOS-1";` `const setStorage = (newTodos = null) => {` ` const stringifiedDefaultTodos = JSON.stringify(newTodos || defaultTodos);` ` localStorage.setItem(localStorageId, stringifiedDefaultTodos);` `};` `const getStorage = (isFirsTry = false) => {` ` try {` ` const localStorageTodos = localStorage.getItem(localStorageId);` ` const parsedToDos = JSON.parse(localStorageTodos);` ` if (parsedToDos == null) throw new Error("No storage saved");` ` return parsedToDos;` ` } catch (error) {` ` console.error(error);` ` if (!isFirsTry) {` ` setStorage();` ` return getStorage(true);` ` }` ` }` `};`
tengo una duda, he tratado de usar useEffect para poder guardar los datos en localStorage pero por algun motivo no guarda correctamente, aqui dejo lo que estaba implementando por si alguno tiene una recomendación. ```js const [taskOption, setTaskOption] = useState(() => { try{ const taskFromStorage = window.localStorage.getItem('YOURLISTTASK') return taskFromStorage ? JSON.parse(taskFromStorage) : [] } catch (error){ console.error('Error accesing localStorage: ', error) return [] } }) useEffect(() => { window.localStorage.setItem('YOURLISTTASK_V1', JSON.stringify(taskOption)) }, [taskOption]) ```
Spoiler: Eventualmente esto se volvera un post o un put al backend :D
Yo siempre uso update para que tenga sentido al guardar, borrar etc `updateTodos()`
Hola tengo una pregunta esto quiere decir que siempre que yo quiera guardar informacion etc deberia hacerlo con localStorage ? no es mejor usar un lenguaje backend como SQL perdon por mi ignorancia. Un cordial saludo a todos asi va mi TODO machine por el momento. ![](https://static.platzi.com/media/user_upload/Screenshot%202024-09-05%20120446-3cd47259-4213-4657-97b8-62ed0fadb59a.jpg)
**LOCAL STORAGE** *El **Local** **Storage** en* **React.js** *es una **característica** del **navegador** que permite **almacenar** **datos** en **formato** **clave-valor** **directamente** en el **cliente**, de **forma** **persistente**, es decir, **incluso** **después** de **cerrar** la **pestaña** o el **navegador**. En el **contexto** de **aplicaciones*** **React***, se **utiliza comúnmente** para **guardar** el **estado** de la **aplicación**, **configuraciones** del **usuario** o **cualquier** **información** que deba **persistir entre sesiones**. La* **API** *de **Local Storage** es **accesible** **a travé**s del **objeto*** **window.localStorage***, y permite **interactuar** con los **datos** mediante **métodos** como* **setItem***,* **getItem***, **removeItem** y* **clear***. Su **uso** puede **mejorar** la **experiencia** del **usuario** al **mantener** la **consistencia** de los **datos** y **reducir** la **necesidad** de **realizar** **solicitudes** al **servidor** para **recuperar** la **misma** **información**.*
cada vez que agrego algo nuevo en el código se me desaparece otra parte del código mi código para cubo rubik :(
una solucion para eliminar el local storage de golpe es * LocalStorage.clear()
TIP INMENSO para solucionar la complejidad del local storage. class Storage { constructor( ){ this.key = "todos\_v1"; this.value = ""; } setInitialData(todos) { localStorage.removeItem(this.key); this.saveData(todos) } stringify(array) { return JSON.stringify(array) } parser(array) { return JSON.parse(array) } saveData(todos) { localStorage.removeItem(this.key); let stringifiedTodos = this.stringify(todos) localStorage.setItem(this.key, stringifiedTodos) console.log(localStorage.getItem(this.key)) } getData() { let data = localStorage.getItem(this.key) let parsedTodos = this.parser(data) console.log(parsedTodos) return parsedTodos; } } const useLocalStorage = new Storage(); function App() { const \[ todos, setTodos ] = React.useState(useLocalStorage.getData() || \[{ name: 'cyberpunk 2077', completed: false }]) ```js class Storage { constructor( ){ this.key = "todos_v1"; this.value = ""; } setInitialData(todos) { localStorage.removeItem(this.key); this.saveData(todos) } stringify(array) { return JSON.stringify(array) } parser(array) { return JSON.parse(array) } saveData(todos) { localStorage.removeItem(this.key); let stringifiedTodos = this.stringify(todos) localStorage.setItem(this.key, stringifiedTodos) console.log(localStorage.getItem(this.key)) } getData() { let data = localStorage.getItem(this.key) let parsedTodos = this.parser(data) console.log(parsedTodos) return parsedTodos; } } const useLocalStorage = new Storage(); function App() { const [ todos, setTodos ] = React.useState(useLocalStorage.getData() || [{ name: 'cyberpunk 2077', completed: false }]) ```
![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-02-01%20183845-7adac515-3e79-488e-afb6-0108b9682803.jpg)![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-02-01%20183857-7212170e-0668-4ce0-855c-0fe14639b964.jpg) Separemos el código en dos partes: El código comentado en la parte superior y el componente principal App. Es el componente principal porque donde termina la foto, es decir, a partir de la línea de código 66 empieza el return() donde se añaden los demás componentes "hijos" de App. 1\. El array comentado es opcional dejarlo en nuestra consola del navegador, para así tener algunos TODOs iniciales de referencia. 2\. La línea 20 del código, comentada también, solo es necesaria dejarla en la consola del navegador si la dejamos seguida del array inicial. Esta se leería: Guárdame en localStorage un nuevo objeto "TODOS\_V1" una copia del array inicial convertido en string. Esto es porque como recordamos, solo debemos guardar strings en localStorage. 3\. Entre la línea 25 y 29 tenemos una arrow function llamada saveTodos a la que pasamos el parámetro newArray. Esta se va a encargar de establecer en local storage un string con el parámetro newArray bajo el nombre "TODOS\_V1" y llamar a la función actualizadora del estado también con el parámetro newArray. Esto ocurrirá solamente cuando esta función sea llamada y, como lleva dentro a la función actualizadora del estado queda directamente vinculada con las líneas 57 y 64. Esto significa que en ellas ya no llamamos a la función actualizadora setTodos si no a esta nueva función y así almacenar los cambios de completar o eliminar un TODO en localStorage. 4\. En la línea 31 tenemos una constante llamada parsedTodos que se leería: Conviérteme de nuevo a un objeto legible con JSON.parse el string que te pido que me muestres con getItem y que está almacenado en localStorage llamado "TODOS\_V1". 5\. Por último, en la línea 34, en nuestro estado 'todos' hacemos una modificación y le pedimos que, en vez de empezar con arrayTodos como primera fase del estado que lo haga con parsedTodos, y si este no existe, con un array vacío. Todo esto encapsulado en una arrow function. Si no entregamos un array vacío y en este caso parsedTodos no existiese, React se rompería.
Hola, tengo un error... Uncaught SyntaxError: Unexpected token 'o', "\[object JSON]" is not valid JSON Estoy buscando en google cómo solucionarlo
![]()necesito ayuda :( dice que tengo un problema con la propiedad filter ![](https://static.platzi.com/media/user_upload/FSDFE-fe708840-f6da-4c14-90e6-939ff0b96b6c.jpg)

Osea el localStorage es lo mismo que cuando apago mi PC y luego vuelvo al curso, esta justo donde lo deje.

Tu lo guardas demasiado rapido en localStorage y me pierdo

no me da me vota error

Local Storage herramienta que nos ayuda hacer persistencia de datos en el navegador.

Me gustó mucho la forma en la que se aplicó el tema de persistencia de datos, gracias profe Juan, se valora su trabajo!
El artículo de esta página resume de forma bastante clara los conceptos vistos de Persistencia de datos en el navegador con js: Web Storage API, atributos y métodos. https://somospnt.com/blog/206-persistencia-de-datos-en-el-navegador-con-js-web-storage-api

mi alternativa para obtener el localstorage: `const LOCALSTORAGEKEY = 'TODOS_V1';` `const defaaultTodos = [  { id: 1, text: 'Cortar cebolla', completed: true },  { id: 2, text: 'Tomar el curso de intro a React', completed: true },  { id: 3, text: 'Algo', completed: true },  { id: 4, text: 'Otro', completed: true }];` `const getDefaultTodos = () => {  const todos = localStorage.getItem(LOCALSTORAGEKEY);  if (todos) {    const todoItems = JSON.parse(todos);    if (todoItems.length) {      return todoItems;    }   }  localStorage.setItem(LOCALSTORAGEKEY, JSON.stringify(defaaultTodos));  return getDefaultTodos();};`
Una nota es que para actualizar el localStorage no es necesario crear una función, ya que, si al localStorage le asignamos el estado, cuando el estado reciba cambios, también actualizará el localStorage ![](https://static.platzi.com/media/user_upload/image-33114dae-e26a-48ae-82fa-7ace277a487a.jpg)