Thore Siefke
#meinBloɡ

Ausprobieren, ausprobieren, ausprobieren

Bei diesem Svelte-Projekt soll es um ein Eingabefeld gehen, das mit einer einfachen Funktionalität versehen ist, sowie einer darunter erscheinenden Ausgabe der Eingabe. Des Weiteren soll es um die Verwendung von Komponenten und deren Kommunikation untereinander gehen. Der in Svelte geschriebene Programmcode findet sich somit in der Hauptkomponente, »App.svelte«, sowie in zwei zusätzlichen Komponenten, »Input.svelte« und »Output.svelte«, wieder. Diese beiden zusätzlichen Komponenten werden in die Hauptkomponente eingebunden und von dieser aufgerufen.
Bei der schon erwähnten Funktionalität, die in der Input-Komponente zu finden ist, geht es einmal um das automatische Setzen des Fokus für das Eingabefeld und weiter um die Funktion, dass erst beim Betätigen der Eingabetaste, der jeweilige Wert im Eingabefeld an die Variable für die Ausgabe übermittelt wird. Die dafür zuständige Funktion mit dem Namen »handleKeydown«, wird beim Eintreten des Ereignisses, im Beispiel ist es das Betätigen der Eingabetaste, aufgerufen und ausgeführt. Ihr wird das Event-Objekt, welches das auslösende Ereignis repräsentiert, als Argument übergeben, sodass innerhalb der Funktion damit gearbeitet werden kann. Ereignisse werden in Svelte über Event-Attribute definiert, im Beispiel: »onkeydown«.
Die Variable mit der Bezeichnung »output«, steht im Zentrum dieses Projekts. Sie ist sowohl in der Input-Komponente als auch in der Output-Komponente über die »$props()-Rune« als Property-Variable definiert und erhält hier auch einen Startwert, im Beispiel eine leere Zeichenkette, zugewiesen. Die Hauptkomponente kann jetzt durch diese Art der Deklaration mit beiden Komponenten in beide Richtungen Daten austauschen. Für diesen funktionsfähigen Datenaustausch, ist jedoch auch die Variablendeklaration von »output« in der Hauptkomponente notwendig.
Die Variable »inputData«, ist dagegen über die »$state-Rune« als reaktiver Zustand definiert, bei Eingabe eines Wertes im Eingabefeld verändert sich ihr Zustand, und sie verbleibt mit ihrem Wert, im Gegensatz, auch innerhalb der Input-Komponente.
Bei der Verwendung der »$effect-Rune«, habe ich es so verstanden, dass dieser eine Funktion übergeben wird, in der der Variablen inputElement, die »focus()-Methode« angehängt wird, die schließlich für die Fokussierung zuständig ist. Die Bezugnahme/Verbindung zum DOM-Knoten, hier das input-Element, erfolgt über die Binding-Syntax.
Diese Binding-Syntax spielt dann auch eine Rolle sowohl bei der Verbindung zwischen der Variablen »output« und der Input-Komponente innerhalb der Hauptkomponente, in der sie ja eingebunden ist und sorgt so für eine korrekte Aktualisierung der Variable »output« für die Ausgabe, als auch bei der Verknüpfung zwischen dem input-Element und der Variablen »inputData«, welche ja dann ihren über das Eingabefeld erhaltenen Wert, via Zuweisung, an die Variable »output« übergibt.
In der Output-Komponente wird dann, schlussendlich, der jeweilige Wert der Variablen »output«,über ein ausgewähltes Element für die Ausgabe, ausgegeben.

Soweit eine kleine Zusammenfassung meiner Gedanken zu diesem Projekt. Den Programmcode der drei Komponenten, habe ich nachfolgend beigefügt:

App.svelte
<script>
   import Input from './Input.svelte';
   import Output from './Output.svelte';
   let output = '';
</script>

<Input bind:output />
<Output {output} />

Input.svelte
<script>
   let { output = '' } = $props();
   let inputData = $state('');
   let inputElement;

   $effect(() => {
      inputElement.focus();
   });

   function handleKeydown(event) {
      if (event.key === 'Enter') {
         output = inputData;
         inputData = '';
      }
   }
</script>

<input
   bind:this={inputElement}
   bind:value={inputData}
   onkeydown={handleKeydown} />

Output.svelte
<script>
   let { output = '' } = $props();
</script>

<div>{output}</div>