3D-Grafik von Steve Johnson – https://unsplash.com/@steve_j

Produkte visualisieren und aktualisieren mit Alpine.js

In diesem Beitrag zeigen wir euch, wie ihr mit Alpine.js eine Liste von Produkten visualisieren und deren Preise automatisch umrechnen lassen könnt.

Jairus Joer

Jairus Joer

Die Texte in diesem Beitrag wurden in Teilen von OpenAIs ChatGPT generiert und durch uns korrigiert und überarbeitet.

Als Ausgangspunkt für unsere Demonstration zur Visualisierung und Umrechnung von Produktdaten dient uns die folgende, simplifizierte Datenstruktur, die wichtige Produktinformationen wie Name, Preis und Währung enthält:

[
  {
    "name": "Arctis 1 Wireless",
    "price": {
      "value": 99.99,
      "currency": "USD"
    }
  }
]

Jedes Produkt wird als Objekt in der Liste gespeichert und enthält die Felder name und price. Der price-Schlüssel enthält wiederum ein Objekt mit den Preisinformationen.

Daten beziehen und visualisieren

Um die Daten im Frontend darstellen zu können, benötigen wir zunächst eine Möglichkeit, sie zu beziehen. Hierfür verwenden wir in unserem Beispiel eine fiktive API, von der wir die Datenstruktur mithilfe der Funktion getOffers() beziehen und im Objekt offers speichern. Dies geschieht, wie üblich, in einem eigens dafür geschaffenen Kontext innerhalb von Alpine, hier als utility bezeichnet.

Wenn Sie mehr darüber erfahren möchten, wie Sie Alpine in Ihre Umgebung einbinden können, empfehlen wir Ihnen unseren Beitrag: Alpine.js in einer Produktions-Umgebung einbinden

document.addEventListener("alpine:init", () => {
  Alpine.data("utility", () => ({
    offers: [],
    async getOffers() {
      const response = await (
        await fetch("https://steelseries.com/api/offers")
      ).json();
      this.offers = response.data;
    },
  }));
});

Um die Daten im Frontend zu visualisieren, können wir anschließend folgenden HTML-Code verwenden:

<div class="offers" x-data="utility" x-init="getOffers">
  <template x-for="offer in offers">
    <article class="offer">
      <div class="offer-title" x-text="offer.name"></div>
      <div
        class="offer-price"
        x-text="`${offer.price.value} ${offer.price.currency}`"
      ></div>
    </article>
  </template>
</div>

Umrechnungskurs beziehen und Preise aktualisieren

Um den aktuellen Produktpreis in Euro anzeigen zu können, beziehen wir aktuelle Umrechnungskurse über eine API von exchangerate.host. Die Funktion getConversion() speichert daraufhin den aktuellen Kurs im Schlüssel conversion. Falls die API unerwartet eine inkorrekte Antwort liefert, verwenden wir das initiale Objekt im Schlüssel als Referenz.

document.addEventListener("alpine:init", () => {
  Alpine.data("utility", () => ({
    conversion: { rate: 1, currency: "USD" },
    offers: [],
    async getConversion() {
      const rate = await (
        await fetch(`https://api.exchangerate.host/convert?from=USD&to=EUR`)
      ).json();
      if (!rate.success) return;
      this.conversion = { rate: rate.result, currency: rate.query.to };
    },
    async getOffers() {
      const response = await (
        await fetch("https://steelseries.com/api/offers")
      ).json();
      await this.getConversion();
      this.offers = response.data;
    },
    setPrice() {
      const price = (this.offer.price.value * this.conversion.rate).toFixed(2);
      return `${price} ${this.conversion.currency}`;
    },
  }));
});

Die Funktion setPrice() gibt den aktualisierten Preis zurück und ersetzt den interpolierten String aus dem vorherigen HTML-Code.

<div class="offers" x-data="utility" x-init="getOffers">
  <template x-for="offer in offers">
    <article class="offer">
      <div class="offer-title" x-text="offer.name"></div>
      <div class="offer-price" x-text="setPrice"></div>
    </article>
  </template>
</div>

Somit können wir Produktinformationen mit aktuellen Preisen über Alpine beziehen und visualisieren. Da es sich hierbei nur um eine simple Demonstration handelt, ließe sich im nächsten Schritt dieser Code um Loading und Fallback States erweitern, welche die Erfahrung für Nutzer im Frontend klarer und angenehmer gestalten.


TL;DR

Über Alpine wird ein Array von Produktdaten bezogen, dessen Preise anschließend, mithilfe einer externen API, in Euro umgerechnet werden, um diese Daten als Liste im Frontend zu visualisieren.