Das Binden einer Funktion an eine Schaltfläche ist einfach und unkompliziert:
<button on:click={handleClick}>
Clicks are handled by the handleClick function!
</button>
Aber ich sehe keine Möglichkeit, Parameter (Argumente) an die Funktion zu übergeben, wenn ich dies tue:
<button on:click={handleClick("parameter1")}>
Oh no!
</button>
Die Funktion wird beim Laden der Seite aufgerufen und nie wieder.
Ist es überhaupt möglich, Parameter an die aufgerufene Funktion zu übergeben on:click{}
?
BEARBEITEN:
Ich habe gerade einen hackigen Weg gefunden, es zu tun. Das Aufrufen der Funktion von einem Inline-Handler aus funktioniert.
<button on:click={() => handleClick("parameter1")}>
It works...
</button>
Antworten:
TL; DR
Wickeln Sie die Handlerfunktion einfach in eine andere Funktion ein. Verwenden Sie für Eleganz die Pfeilfunktion
Sie müssen eine Funktionsdeklaration verwenden und dann den Handler mit Argumenten aufrufen. Die Pfeilfunktion ist elegant und gut für dieses Szenario.
WARUM brauche ich einen anderen Funktions-Wrapper?
Wenn Sie nur den Handler verwenden und die Parameter übergeben würden, wie würde es aussehen?
Wahrscheinlich so etwas:
Aber denken
handleClick("arg1")
Sie daran, auf diese Weise rufen Sie die Funktion sofort auf, und genau das passiert, wenn Sie sie so ausdrücken. Sie wird aufgerufen, wenn die Ausführung diese Zeile erreicht, und nicht wie erwartet, AUF TASTE KLICKEN ...Daher benötigen Sie eine Funktionsdeklaration, die nur vom click-Ereignis aufgerufen wird. Darin rufen Sie Ihren Handler mit so vielen Argumenten auf, wie Sie möchten.
Wie @Rich Harris (der Autor von Svelte) in den obigen Kommentaren betonte: Dies ist kein Hack, aber das zeigt die Dokumentation auch in ihren Tutorials: https://svelte.dev/tutorial/inline-handlers
quelle
Rich hat dies in einem Kommentar beantwortet, also danke ihm, aber die Art und Weise, Parameter in einem Klick-Handler zu binden, ist wie folgt:
Etwas mehr Detail für Menschen, die auch mit diesem Kampf, und es sollte in der Dokumentation, wenn dies nicht der Fall, können Sie auch das Click - Ereignis in eine solche Handler bekommen kann:
quelle
Ich habe es damit zum Laufen gebracht:
quelle
Hier ist es mit einer Entprellungsmethode und einem Ereignisargument:
quelle
In der Dokumentation wird kein klarer Weg erwähnt, und Ihre Lösung wird funktionieren, ist aber in der Tat nicht sehr elegant. Meine eigene bevorzugte Lösung ist die Verwendung currying im Skript selbst blockieren.
Und im HTML
Vorsicht vor Curry
Wie in den Kommentaren erwähnt, hat Curry seine Tücken. Die häufigste, die im obigen Beispiel
handleClick('parameter1')
nicht beim Klicken, sondern beim Rendern ausgelöst wird und eine Funktion zurückgibt, die wiederum beim Klicken ausgelöst wird. Dies bedeutet, dass diese Funktion immer 'parameter1' als Argument verwendet.Daher ist die Verwendung dieser Methode nur dann sicher, wenn der verwendete Parameter eine Konstante ist und sich nach dem Rendern nicht ändert.
Dies würde mich zu einem anderen Punkt bringen:
1) Wenn es sich um eine Konstante handelt, die einen Parameter verwendet, können Sie auch eine separate Funktion verwenden
2) Wenn der Wert dynamisch ist, aber innerhalb der Komponente verfügbar ist, kann dies weiterhin mit einer eigenständigen Funktion behandelt werden:
3) Wenn der Wert dynamisch ist, aber nicht in der Komponente verfügbar ist, da dies von einem bestimmten Bereich abhängt (z. B. einer Liste von Elementen, die in einem # jedes Block gerendert werden) , funktioniert der 'hacky'- Ansatz besser. Ich denke jedoch, dass es in diesem Fall besser wäre, die Listenelemente selbst als Komponente zu haben und auf Fall 2 zurückzugreifen
Fazit: Currying funktioniert unter bestimmten Umständen, wird jedoch nicht empfohlen, es sei denn, Sie wissen genau, wie Sie es verwenden.
quelle
on:click={() => handleClick('parameter1')}
)handleClick('parameter1')
dies passiert, wenn der Klick falsch erfolgt. Zweitens bedeutet dies, dass der Handler bei jeder Änderung der Parameter zurückgebunden werden muss. Das ist suboptimal. Derzeit gibt es einen Fehler, der bedeutet, dass er sowieso nicht funktioniert. svelte.dev/repl/a6c78d8de3e2461c9a44cf15b37b4dda?version=3.12.1