Em alguns momento o localStorage pode ser uma saída bem interessante, mas você sabe o que é e pra que serve? Sabe como usar no NextJs sem ter erros no servidor?
O que é o localStorage?
Se já sabe o que é o localStorage pode pular esse primeiro tópico
O localStorage é uma API do navegador que permite armazenar dados localmente no navegador/computador do usuário.
Esses dados são armazenados permanentemente e podem ser acessados e modificados, permitindo acessar e recuperar mesmo após o usuário fechar o navegador ou até mesmo reiniciar o computador. Essa é uma explicação bem breve, mais detalhes o tio Google ou GPT explicam.
Como Gravar
O código completo desse exemplo você pode acessar pelo GitHub, mas por favor leia com atenção, no final deixei o link ✌
Nesse exemplo, eu gravo os dados de um state no localStorage quando o usuário clica num botão, segue abaixo a sequencia.
1- Passo as variáveis pra função handle
javascript <button onClick={() => handleAddToCart(prod.id, prod.name, prod.valor)}> //aqui eu chama a função e passo as variáveis do array <Image src={addBt} width="24" height="24"/> </button>
2- Na função handle, eu chamo o hook useReducer e atualizo o state 👇
javascript function handleAddToCart(itemId: any, itemName: any, itemValue: any) { dispatch({ type: "ADD_TO_CART", payload: { id: itemId, name: itemName } }); }
3- Nesse useEffect eu monitoro o state e sempre que tem uma alteração nos valores, ele grava os dados no localStorage.
useEffect(() => { if (state.cartItens !== null) { localStorage.setItem("cartItems", JSON.stringify(state.cartItems)); } }, [state]);
Aqui nesse print, pelo DevTools do Chrome, é possível ver no navegador como os dados são salvos.
Repare que ele cria um cara chamado cartItems
, que foi o nome que eu defini. Ele pega o valor do state.cartItems
e salva numa variável cartItems
dentro do localStorage.
localStorage.setItem("cartItems",JSON.stringify(state.cartItems));
Conforme eu vou adicionando itens ao meu carrinho, ele adiciona esses itens no localStorage também.
Como Ler
Até aqui talvez não tenha nenhuma novidade, mas no Next, o detalhe está na hora da leitura.
Como o NextJs roda no servidor, mas os dados do localStorage estão no client, é preciso criar uma verificação, e fiz isso nessa função getStoredCartItems()
function getStoredCartItems() { if (typeof window !== "undefined") { const storedCartItems = localStorage.getItem("cartItems"); if (storedCartItems !== null) { try { const cartItems = JSON.parse(storedCartItems); return cartItems; } catch (error) { console.error(error); } } } return []; }
E o segredo está todo aqui no if
... aqui ele valida se está rodando no client evitando erros, pois no server não existem essas os dados do window
.
if (typeof window !== "undefined")
E na variável do useReducer
ele começa chamando essa função 👇
const [state, dispatch] = useReducer(cartReducer, { cartItems: getStoredCartItems() });
Dessa forma, temos os seguintes passos:
- Verifica se está rodando no client
- Verifica se existem dados gravados no localStorage
- Se houver, carrega esses dados no state.
O código completo desse projeto está no link abaixo, especificamente em Components/Lista.tsx 👉 GitHub/andpeicunha
Top comments (0)