Javascript – Die geschweifte Klammer in der Funktions Parameterliste

Vielleicht habt ihr das schon mal gesehen. Eine geschweifte Klammer in der Funktionsparameterliste. Was ist das und wozu ist das gut? Um hier Licht ins dunkel zu bringen, bediene ich mich eines kleine Fallbeispiels. Im folgendem Beispiel möchte ich aus einem Objekt den Namen der Person mit der id = 8 finden.

let obj = [
  {id: 8, name: ‘Klaus‘},
  {id: 9, name: ‘Hansi‘}
];

console.log( obj.find(({ id }) => id === 8).name );
// output: Klaus 

Vielleicht erkennt der Ein oder Andere schon, was die geschweifte Klammer hier zu bedeuten hat. Ich helfe mal ein wenig! Die geschweifte Klammer bestimmt, welche Werte des Datenobjekts (obj) überprüft werden sollen und geben diese statt des ganzen Objektes nur die gewünschten Werte mit in die Funktion (ich nutze hier eine anonyme Funktion in der Pfeilfunktion-Schreibweise) . Da wir in unserem Beispiel die Überprüfung über die id durchführen, geben wir doch der Funktion gleich das mit was er benötigt. Die etwas längere Schreibweise wäre ansonsten diese:

let obj = [
  {id: 8, name: ‘Klaus‘},
  {id: 9, name: ‘Hansi‘}
];
console.log(obj.find(el => el.id === 8).name);
// output: Klaus 

Da wir nun die kurze (das Ding mit der geschweiften Klammer / Brakets) und die längere Version gegenüber gestellt haben, sollte nun den meisten klar werden, was die geschweifte Klammer bewirkt.

Ich hoffe ich konnte Euch einwenig helfen. Wo ich das erste Mal das gesehen habe sah ich ungefähr so aus wie der nette Koale im unteren Bild.

Cheers!

surprised-koala
Photo Credit: unknown

Tailwind und VanillaJS – Toast Hawaii bzw. Notification

Stellt euch vor ihr wollt für ein Shop eine Notification oder auch bekannt als Toast ausgeben. Zum Beispiel Produkt in Warenkorb gelegt. Oder „ups, leider ist das Produkt in ihrer Größe nicht mehr vorhaben. Es gibt hier echt viele und gute Bibliotheken. Aber ich will selber eine Toaster Klasse bauen, weil mir der Overhead gerade nicht passt. Ansonsten immer gerne. Weil man muss ja nicht das Rad jedes Mal von vorne erfinden.

Die Vorüberlegung

– die ToastHawaii Klasse kann bei der Initiierung ein Config Objekt mitgegeben werden. In meinem Beispiel ist nur die Verweildauer des Toast in der Config enthalten. Man kann es hier noch genügend anreichern. Position des Posts, Style Klassen und und und.

– mit der Toast Methode makeToast( {title: <string>, msg: <string>,style:<string>}) kann ein Toast angetriggert werden
– Wenn mehrere Toast hintereinander abgefeuert werden hänge den neusten Toast unten ran
– Im Quelltext befindet sich nur Componenten Container der mit der id toast-hawaii angesprochen wird

Der Aufbau der Klasse

– constructor(paras = {}),
– getIcon()
– makeToast()
– die Klasse beinhaltet das HTML und kann somit für andere Toastdesign problemlos angepasst werden
– makeToast kann default Config Parameter die bei der Instanziierung des Objekts mitgegeben wurden überschreiben (zum Beispiel Anzeigedauer / duration)
– makeToast besitzt Pflichtfelder die als Parameter vom Type Objekt mitgegeben werden ( {title:‘‘, msg: ‘‘, style=‘‘} )

Die Umsetzung

– HTML
– VanillaJS
– TailwindCSS

Es würde mich riesig freuen, wenn ihr auf GitHub das Projekt Folkt und mit weiterentwickelt. Um somit ein solides und einfaches sowie flexibles Notifikation System in Tailwind und purem Javascript anzubieten.

Zum GitHub: https://github.com/MikeLowrey/toast-hawaii

Demo Toast Hawaii

TailwindCSS und VanillaJS – Step Progress Bar

Ich persönlich finde bei Bestellvorgängen oder Behördenformularen es extrem hilfreich eine sogenannte Prozessverfolgung auf dem Bildschirm zu haben. Damit weiß man stets Bescheid, wo man gerade ist und wie lange das noch in etwa dauern kann.

Ich dachte mir, es ist Samstagabend und die Kinder sind im Bett und die bessere Hälfte macht noch Steuern, dann baue ich mir doch mal eine „Step Progress Bar“ selber. Allein nur mit den Zutaten TailwindCSS und VanillaJS. Viel besser als Katzenvideos auf Youtube oder Netflix.

Meine Vorüberlegung:

– ich setze flexibel mit der Klasseninitialisierung die einzelnen Schritte mit ihren Namen

– die „Step Progress Bar“ Klasse hat eine Funktion mit der ich zwischen den einzelnen Schritten springen kann. Somit kann man sie in anderen Projekten mit einer Callback Funktion aufrufen

– die „Step Progress Bar“ Klasse rendert nach jeder Aktualisierung die View automatisch

Als erstes brauchen wir TailwindCSS. Das besorge ich mir der Einfachheit über CDN. Dann benötige ich ein HTML Gerüst in dem ich die Steps / Schritte anzeigt.

<section><!-- Q: https://tailwindcomponents.com/component/steps-bar -->
    <!-- component -->
    <div class="container mx-auto py-6" >
      <div class="flex" id="ProgressStepper">
      </div>
    </div>
 </section>

Dann gehen wir zum JS Teil über. Ich baue eine Klasse ProgressStepper.

<script>
  // Progress Stepper Class
   class ProgressStepper {
        constructor(paras) {
            this.step_names = paras.step_names;            
            this.reached_step = 1;
            this.paras = paras;
            this.build_progress_bar();
        }

        setPointerToStep(step) {
            if (step > this.step_names.length) {
                console.log("step>length")
                return ;
            }
            this.reached_step = step;
            this.build_progress_bar();
        }

        build_progress_bar() {

            let _html_start_part = function(data, index, reached = 0) {
                return `<!-- progress item -->
                <div class="w-1/4">
                  <div class="relative mb-2">
                    <div class="w-10 h-10 mx-auto bg-green-500 rounded-full text-lg text-white flex items-center">
                      <span class="text-center text-white w-full">
                        ${index} 
                      </span>
                    </div>
                  </div>

                  <div class="text-xs text-center 2xl:text-base">${data}</div>
                </div>
                <!-- /progress item -->`};

            let _html_start_part1 = function(data, index, reached = 0, procentBar = 0, compleated_icon = '') {
                return `<!-- progress item middle -->
                <div class="w-1/4">
                  <div class="relative mb-2">
                    <div class="absolute flex align-center items-center align-middle content-center" style="width: calc(100% - 2.5rem - 1rem); top: 50%; transform: translate(-50%, -50%)">
                      <div class="w-full bg-gray-200 rounded items-center align-middle align-center flex-1">
                        <div class="w-0 bg-green-300 py-1 rounded" style="width: ${procentBar}%;"></div><!-- middle part 100 full & 50 half progressstatus-->
                      </div>
                    </div>

                    <div class="w-10 h-10 mx-auto ${reached == 0 ? 'bg-white border-2 border-gray-200': 'bg-green-500' } rounded-full text-lg text-white flex items-center">
                      <span class="text-center ${reached == 0 ? 'text-gray-600': 'text-white' } w-full">                        
                        ${index}
                      </span>
                    </div>
                  </div>

                  <div class="text-xs text-center 2xl:text-base">${data}</div>
                </div>`;}
            
            var output = '';
            for (let i=0; i<this.step_names.length;i++)
            {                
                if (i==0) 
                {                    
                    output += _html_start_part(this.step_names[i], i+1);
                    continue;
                }
                let reached = this.reached_step >= (i+1) ? 1:0;
                let procentBar, compleated_icon;
                if (this.reached_step >= (i+1)) {
                    procentBar = 100;
                    compleated_icon = this.paras.compleated_icon;
                } else if (this.reached_step > (i+1)) {
                    procentBar = 0;
                } else if(this.reached_step == (i)) {
                    procentBar = 50;
                }
                output += _html_start_part1(this.step_names[i], i+1, reached, procentBar, compleated_icon);
            }

            document.getElementById('ProgressStepper').innerHTML = output;
            return ('build')
        }
   }
</script>

Nun benötige ich noch die einzelnen Schritte. Ziel war es ja ein Shop Checkout zu bauen. Dann nehme ich mal Adressem Zahlungsart, Bestätigen und Completed bzw. Fertig.

<script>
   let paras = {
    step_names: ['Adresse', 'Zahlungsart', 'Bestätigen', 'Fertig'],  
    }

    let p = new ProgressStepper(paras);
</script>

Nun kann man mit der Methode setPointerToStep() auf den Step springen wo man gerade hin möchte. Scotty step me up …

p. setPointerToStep(2);
p. setPointerToStep(0);
p. setPointerToStep(99);
Demo Step Progress Bar

Man kann jetzt hier ordentlich noch was machen:
– Setze einen grünen Hacken sobald der Prozess über den Schritt hinaus ist
– Gebe mit dem Namen auch die Links mit um Sprungmarken zu haben
und noch vieles Mehr …

Alpine.js – Ein kurzer Einstieg

Nicht alle Webprojekte müssen zwangsläufig darauf hinauslaufen sie mit Javascript Frameworks wie Vue JS, React oder Angular umzusetzen. In den Jahren 2015 bis 2020 war das schon ein spürbarer Trend. Man betrachtet nicht mehr den Overhead von Frameworks bei kleinen Projekten sondern wie schnell man ohne lange Nachzudenken Projekte bauen kann. Allerdings fällt dieser Ansatz spätestens bei neuen Anforderungen einen auf die Füße. Ich meine jetzt nicht, dass es schlecht ist Frameworks zu nutzen. Ich baue sehr gerne Webapplikationen mit Vue JS. Aber kleine Projekte oder auch größere mit geringem dynamischen Frontendelementen bauen ich mittlerweile und mit vorliebe in Vanilla JS. Seit dem ich das mache wächst meine Javascript Passion von Codezeile zu Codezeile.

Heute möchte ich euch die Javascript Bibliothek Alpine.js vorstellen. Alpine ist quasi ein mini Miniframwork. Es bietet dem Nutzer die Reaktivität von größeren Framworks wie Vue oder React aber das zu deutlich weniger Rechenleistung und Code. Eigentlich genau das was man für ein kleines ansprechendes Webprojekt braucht.

Test Shop Seite gebaut mit TailwindCSS und Alpine.js.
Test Shop Seite gebaut mit TailwindCSS und Alpine.js. Zur Demo Seite.

Installation

Alpine.js kann man sich über CDN oder über NPM ins Projekt holen. In unserem Beispiel nutzen wir CDN. Ziel unseres Projekts wird sein, eine Shoping Cart Seite eines Fahrradshops zu bauen mit dynamischen Warenkorbmenü und Produktinformationen in Tab Style.

<script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.8.0/dist/alpine.min.js" defer></script>

Wie funktioniert Alpine.js

Es ist wirklich ganz einfach und am besten ich erkläre euch das in Schritten.

  1. Deklaration der Variablen im Scope. D.h. man definiert einen Container und deklariere im Start HTML Tag die Variablen die dynamisch sein sollen.
<div x-data="{ isOpen: false }">...</div>

2. In diesem Container hat Alpine.js nun zugriff auf die Variable isOpen. Sie ist mit false initialisiert worden. Im Container befindet sich ein Button der ein bestimmtes Textfeld anzeigen oder ausblenden soll (toogle).

<button @click="isOpen = !isOpen" @keydown.escape="isOpen = false" >klick</button>

Wiederrum im gleichen Container befindet sich auch der Content Block bzw. Textfeld der ein- und ausgeblendet werden soll.

<div x-show="isOpen">Lorem ipsum </div>

Hier kurz das ganze Beispiel:

<div x-data="{ isOpen: false }">
	<button @click="isOpen = !isOpen" @keydown.escape="isOpen = false" >klick</button>
	<div x-show="isOpen">Lorem ipsum</div>
</div>

Ähnlich wie bei Vue Js können wir auch dynamische Klassen hinzufügen. In unserem Beispiel wollen wir die Buttonfarbe zwischen rot und grün wechseln. Grün offen und Rot zu.

<div x-data="{ isOpen: false }">
   <p x-text="isOpen"></p>
   <button class="focus:outline-none" @click="isOpen = !isOpen">
      <span class="px-2 py-1 bg-red-700 text-white" :class="{ 'bg-green-300' : isOpen }">
   klick
      </span>
   </button>
   <div x-show="isOpen">
      Lorem ipsum                
   </div>                    
</div>

Das ist nur eine kleine Auswahl an Möglichkeiten. Alpine.js harmoniert blendend mit TailwindCSS.

Die eben aufgeführten Beispiele reichen aber bereits um das Tutorial Ziel zu erreichen. Hier der

Link zur ShopTest Seite

die ich mit Alpine.js und TailwindCSS umgesetzt habe. Dynamisch sind hier das toogle des Warenkorbes, Profilmenü sowie in der mobilen Ansicht das Burgermenü.

Links
Hier ein Link zu einer Seite die viele Alpine.js Snippets für euch bereit hält.
  • https://www.alpinetoolbox.com/examples/
  • https://github.com/alpinejs/alpine

SeoTheater Autoren