Wat is Local Storage?
Local Storage is een simpele manier om data op te slaan in de browser. De data blijft staan, ook als de gebruiker de tab sluit.
- Data blijft staan tot het wordt verwijderd
- Elke website heeft zijn eigen Local Storage
- Werkt alleen met strings
- Limiet per site (ongeveer 5-10 MB)
Wanneer gebruik je Local Storage?
- Gebruikersinstellingen (thema, taal)
- Formulier data bewaren
- Winkelwagen items
- Inlogstatus of laatst bezochte pagina
localStorage.setItem() en localStorage.getItem()
// Data opslaan
localStorage.setItem('gebruikersnaam', 'jan123');
// Data ophalen
const gebruiker = localStorage.getItem('gebruikersnaam');
console.log(gebruiker); // 'jan123'
// Als data niet bestaat, krijg je null
const nietBestaand = localStorage.getItem('bestaat-niet');
console.log(nietBestaand); // null
- setItem(key, value) slaat een waarde op onder een sleutel
- getItem(key) haalt de waarde weer op
- een bestaande key wordt overschreven bij setItem
Instelling opslaan
localStorage.setItem('thema', 'donker');
const opgeslagenThema = localStorage.getItem('thema');
if (opgeslagenThema === 'donker') {
document.body.classList.add('dark-mode');
}
Data verwijderen
// Verwijder één item
localStorage.removeItem('gebruikersnaam');
// Verwijder alles
localStorage.clear();
DOM manipulatie en input values
Met de DOM kun je elementen opzoeken, waardes lezen en tekst op de pagina aanpassen.
Element selecteren
const inputElement = document.querySelector('#naam-input');
const outputElement = document.querySelector('#welkom-bericht');
Input waarde ophalen
<input type="text" id="naam-input">
const naamInput = document.querySelector('#naam-input');
const ingevoerdeNaam = naamInput.value;
if (ingevoerdeNaam === '') {
alert('Voer een naam in');
}
Tekst weergeven
<p id="welkom-bericht"></p>
const welkomElement = document.querySelector('#welkom-bericht');
welkomElement.textContent = 'Welkom Jan';
welkomElement.innerHTML = '<strong>Welkom Jan</strong>';
- textContent: alleen tekst
- innerHTML: tekst plus HTML tags
Input leeg maken
document.querySelector('#naam-input').value = '';
Compleet DOM voorbeeld
function slaOpNaam() {
const naam = document.querySelector('#naam-input').value;
if (naam === '') {
alert('Voer eerst een naam in');
return;
}
localStorage.setItem('gebruikersnaam', naam);
document.querySelector('#welkom-bericht').textContent =
`Naam '${naam}' opgeslagen`;
document.querySelector('#naam-input').value = '';
}
Loading state & lege staat
Als je data ophaalt met fetch, duurt dat even. Een loading state laat de gebruiker weten dat er iets gebeurt. Een lege staat geeft een nette melding als er geen resultaten zijn.
Loading state — tonen en verbergen
<p id="laden">Laden...</p>
<section id="resultaten"></section>
const laden = document.querySelector('#laden');
const resultaten = document.querySelector('#resultaten');
// Toon de loading state vóór fetch
laden.style.display = 'block';
fetch('./data.json')
.then(response => response.json())
.then(data => {
// Verberg de loading state zodra data er is
laden.style.display = 'none';
// Toon de data
resultaten.innerHTML = data.map(item =>
`<article>${item.naam}</article>`
).join('');
})
.catch(error => {
laden.style.display = 'none';
resultaten.textContent = 'Er ging iets mis. Probeer het opnieuw.';
});
- Vóór fetch: loading state zichtbaar maken
- In .then(): loading state verbergen, data tonen
- In .catch(): loading state verbergen, foutmelding tonen
Lege staat — geen resultaten
Als een filter of zoekopdracht niets oplevert, toon je een nette melding in plaats van een lege pagina.
const toonResultaten = (items) => {
const container = document.querySelector('#resultaten');
// Controleer of de array leeg is
if (items.length === 0) {
container.innerHTML = '<p class="leeg">Geen resultaten gevonden.</p>';
return;
}
container.innerHTML = items.map(item =>
`<article>${item.naam}</article>`
).join('');
};
Lege staat met zoekterm
const zoekInput = document.querySelector('#zoekbalk');
const container = document.querySelector('#resultaten');
zoekInput.addEventListener('input', () => {
const zoekterm = zoekInput.value.toLowerCase();
const gevonden = producten.filter(product =>
product.naam.toLowerCase().includes(zoekterm)
);
if (gevonden.length === 0) {
container.innerHTML = `<p class="leeg">Geen resultaten voor "${zoekInput.value}".</p>`;
return;
}
container.innerHTML = gevonden.map(product =>
`<article>${product.naam}</article>`
).join('');
});
toonResultaten(items) die altijd de lege staat afhandelt. Roep die functie aan vanuit je filter, sortering én fetch — dan hoef je het maar op één plek te onderhouden.
JSON.stringify() en JSON.parse()
Local Storage werkt alleen met strings. Voor objecten en arrays gebruik je JSON.
const gebruiker = { naam: 'Jan', leeftijd: 25 };
localStorage.setItem('gebruikerData', gebruiker); // fout
Object opslaan en ophalen
const gebruiker = { naam: 'Jan', leeftijd: 25 };
localStorage.setItem('gebruikerData', JSON.stringify(gebruiker));
const opgehaald = JSON.parse(localStorage.getItem('gebruikerData'));
console.log(opgehaald.naam); // 'Jan'
Wat doet JSON.stringify()
const object = { naam: 'Jan', leeftijd: 25 };
const string = JSON.stringify(object);
// '{"naam":"Jan","leeftijd":25}'
Wat doet JSON.parse()
const string = '{"naam":"Jan","leeftijd":25}';
const object = JSON.parse(string);
// object.naam → 'Jan'
- JSON.stringify: object naar string
- JSON.parse: string terug naar object
Voorbeeld met array
const favorieten = ['appel', 'banaan', 'druif'];
localStorage.setItem('favorieten', JSON.stringify(favorieten));
const lijst = JSON.parse(localStorage.getItem('favorieten'));
lijst.push('peer');
Winkelwagen voorbeeld
function voegToeAanWinkelwagen(product) {
let winkelwagen =
JSON.parse(localStorage.getItem('winkelwagen')) || [];
winkelwagen.push(product);
localStorage.setItem('winkelwagen',
JSON.stringify(winkelwagen)
);
}
voegToeAanWinkelwagen({ naam: 'Laptop', prijs: 899 });
Formulier data opslaan: compleet voorbeeld
HTML
<form>
<input type="text" id="naam" placeholder="Naam">
<input type="email" id="email" placeholder="Email">
<input type="number" id="leeftijd" placeholder="Leeftijd">
<button type="button" onclick="slaProfielOp()">Opslaan</button>
<button type="button" onclick="laadProfiel()">Laden</button>
</form>
JavaScript
function slaProfielOp() {
const naam = document.querySelector('#naam').value;
const email = document.querySelector('#email').value;
const leeftijd = document.querySelector('#leeftijd').value;
if (naam === '' || email === '') {
alert('Naam en email zijn verplicht');
return;
}
const profiel = { naam, email, leeftijd };
localStorage.setItem('gebruikerProfiel',
JSON.stringify(profiel)
);
alert('Profiel opgeslagen');
}
function laadProfiel() {
const profielString = localStorage.getItem('gebruikerProfiel');
if (!profielString) {
alert('Geen profiel gevonden');
return;
}
const profiel = JSON.parse(profielString);
document.querySelector('#naam').value = profiel.naam;
document.querySelector('#email').value = profiel.email;
document.querySelector('#leeftijd').value = profiel.leeftijd;
alert('Profiel geladen');
}
Error handling met try/catch
Bij kapotte JSON of volle storage kan er een fout ontstaan. try/catch voorkomt dat je app crasht.
try {
const data = JSON.parse(localStorage.getItem('complexData'));
console.log(data);
} catch (error) {
console.log('Fout bij het ophalen van data', error);
}
Corrupte data
localStorage.setItem('slechteData', 'dit is geen JSON');
try {
const data = JSON.parse(localStorage.getItem('slechteData'));
} catch (error) {
console.log('JSON is kapot', error);
}
Helper functies
function veiligOpslaan(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
return true;
} catch (error) {
console.error('Fout bij opslaan', error);
return false;
}
}
function veiligOphalen(key, standaard = null) {
try {
const data = localStorage.getItem(key);
return data ? JSON.parse(data) : standaard;
} catch (error) {
console.error('Fout bij ophalen', error);
return standaard;
}
}
Samenvatting
| Functie | Wat doet het | Voorbeeld |
|---|---|---|
| localStorage.setItem | waarde opslaan onder een key | localStorage.setItem('naam', 'Jan') |
| localStorage.getItem | waarde ophalen | localStorage.getItem('naam') |
| localStorage.removeItem | één item verwijderen | localStorage.removeItem('naam') |
| localStorage.clear | alle data verwijderen | localStorage.clear() |
| JSON.stringify | object of array naar string | JSON.stringify({ a: 1 }) |
| JSON.parse | string terug naar object of array | JSON.parse('{"a":1}') |
| element.style.display | element tonen of verbergen | laden.style.display = 'none' |
| array.length === 0 | controleren of array leeg is | if (items.length === 0) { ... } |
Altijd JSON
Gebruik JSON voor alles behalve simpele strings
Check op null
getItem kan null teruggeven als er nog niets is opgeslagen
Loading state
Toon een laad-indicator vóór fetch, verberg hem in .then() en .catch()
Lege staat
Controleer altijd of je array leeg is en geef een nette melding
Valideer input
Controleer formulier velden voor je ze opslaat
Debug met console
Controleer inhoud van localStorage in de DevTools