localStorage

localStorage er en måte å lagre informasjon i nettleseren. Hvert domene har sitt eget localStorage, slik du kan lagre ulik informasjon for nrk.no og facebook.com. Informasjon i localStorage er lagret selv om du åpner nettsiden på nytt, starter datamaskinen på nytt og så videre.

Siden informasjonen er knyttet til nettleseren så må du bruke samme nettleser for å få tilgang til informasjonen. Informasjonen er altså ikke tilgjengelig hvis du bytter mellom ulike enheter (PC, bærbar PC, mobiltelefon).

localStorage i javascript

I Javascript kan man få tilgang til localStorage på følgende måte

localStorage.variabelnavn = "ny verdi"

Lagre array av objekter i localStorage

Siden alt som lagres i localStorage er tekststrenger, så må vi gjøre noen små endringer dersom vi for eksempel ønsker å lagre et Array av objekter.

Her er et eksempel på en huskeliste i Svelte med objekter som består av hva man skal huske og en tilhørende tidsfrist.

<script>
let huskeliste = []
let hva = ""
let naar = ""
import { browser } from '$app/environment'
if (browser) {
    if (localStorage.hasOwnProperty('huskeliste')) {
        huskeliste = JSON.parse(localStorage.huskeliste)
    }
}
const leggTilListe = () => {
    huskeliste.push({"hva": hva, "naar": naar})
    localStorage.huskeliste = JSON.stringify(huskeliste)
    huskeliste = huskeliste // Denne er nødvendig for at Svelte skal forstå at "huskeliste" er oppdatert.
}

</script>

<input type="text" bind:value={hva} placeholder="Hva skal du huske?" />
<input type="text" bind:value={naar} placeholder="Tidsfrist" />
<button on:click={leggTilListe}>Legg til</button>

<ul>
    {#each huskeliste as husketing}
        <li>{husketing.naar}: {husketing.hva}</li>
    {/each}
</ul>

localStorage i Sveltekit

Hvis man bruker Sveltekit til å serve Svelte-nettsider så kan man ikke bruke localStorage direkte. Sveltekit kompilerer nettsiden før den blir tilgjengelig for brukeren, men det finnes ikke noe localStorage for servere. Derfor får vi feilmeldingen ReferenceError: localStorage is not defined.

Løsning

For å bruke localStorage med Sveltekit så gjør vi følgende:

import { browser } from '$app/environment'
if (browser) {
	localStorage.variabelNavn = "verdi"
}

Vi henter inn en komponent kalt browser. browser er true dersom koden kjøres i en nettleser. browser er false dersom koden kjøres på serveren. Det betyr at koden localStorage.variabelNavn = "verdi" kun vil kjøres dersom i nettleseren.

Hver gang du skal bruke localStorage og du ikke er sikker på at koden kun vil kjøres i nettleseren, så bør du sjekke om browser == true.