Ein Ref, der sich selbst speichert
Das Speichern in localStorage braucht immer dieselben Zeilen: lesen, was gespeichert ist, wenn der Ref erstellt wird, und es mit watch speichern, wenn er sich ändert. Mit einem Composable schreibst du sie nur einmal:
import { ref, watch } from "vue";
export function useLocalStorage(schluessel, anfangswert) {
const gespeichert = localStorage.getItem(schluessel);
const wert = ref(gespeichert === null ? anfangswert : JSON.parse(gespeichert));
watch(
wert,
(neuerWert) => {
localStorage.setItem(schluessel, JSON.stringify(neuerWert));
},
{ deep: true },
);
return wert;
}Dann braucht jeder Wert, der bleiben soll, eine Zeile:
const name = useLocalStorage("name", "");
const bestellung = useLocalStorage("bestellung", []);So funktioniert es:
- Das Composable hat zwei Parameter:
schluessel, den Namen, unter dem es speichert, undanfangswert, den Wert, mit dem es beginnt, wenn noch nichts gespeichert wurde. Dank ihnen speichert dieselbe Funktion einen Namen unter"name"und eine Bestellung unter"bestellung". - Es gibt einen einzelnen Ref zurück, kein Objekt, also gibt es nichts auseinanderzunehmen: Nach
const name = useLocalStorage("name", "");istnameein Ref, bereit fürv-modeloder{{ name }}. - Das
watchdarin gehört zum Aufruf: Jeder Aufruf beobachtet seinen eigenen Ref und speichert ihn unter seinem eigenen Schlüssel.{ deep: true }steht da, damit auch einpush()in ein Array gespeichert wird, wie du aus Berechnete Werte und Watcher weißt. JSON.stringify()undJSON.parse()funktionieren auch für Text, Zahlen,trueundfalse, also kann das Composable alles speichern.
Die Komponente sieht davon nichts. Sie arbeitet mit name und bestellung wie mit jedem anderen Ref, und sie speichern sich selbst.
So schreibst du es:
Anweisungen
- 1
Schreibe in
useLocalStorage.jsuseLocalStorage(schluessel, anfangswert)wie oben. Importiere es inApp.vueund benutze es für den Namen:const name = useLocalStorage("name", "");. Probiere es aus: Tippe deinen Namen und klicke auf „Ausführen“. Der Name bleibt. - 2
Benutze es auch für die Bestellung, mit dem Schlüssel
bestellungund einem leeren Array als Anfangswert. Bestelle etwas und klicke auf „Ausführen“: Die Bestellung bleibt. UndBestellung leerenleert sie endgültig.