Enlazar una función a un botón es fácil y directo:
<button on:click={handleClick}>
Clicks are handled by the handleClick function!
</button>
Pero no veo una manera de pasar parámetros (argumentos) a la función, cuando hago esto:
<button on:click={handleClick("parameter1")}>
Oh no!
</button>
La función se llama al cargar la página y nunca más.
¿Es posible pasar parámetros a la función desde la que se llama on:click{}
?
EDITAR:
Acabo de encontrar una manera hacky de hacerlo. Llamar a la función desde un controlador en línea funciona.
<button on:click={() => handleClick("parameter1")}>
It works...
</button>
Respuestas:
TL; DR
Simplemente ajuste la función del controlador en otra función, por elegancia use la función de flecha
Debe usar una declaración de función y luego llamar al controlador con argumentos. La función de flecha es elegante y buena para este escenario.
¿POR QUÉ necesito otro contenedor de funciones?
Si usara solo el controlador y pasara los parámetros, ¿cómo se vería?
Probablemente algo como esto:
Pero recuerda,
handleClick("arg1")
así es como invocas la función al instante, y eso es exactamente lo que está sucediendo cuando la pones de esta manera, se llamará cuando la ejecución llegue a esta línea, y no como se esperaba, HAGA CLIC EN EL BOTÓN ...Por lo tanto, necesita una declaración de función, que será invocada solo por el evento click y dentro de ella llamará a su controlador con todos los argumentos que desee.
Como @Rich Harris (el autor de Svelte) señaló en los comentarios anteriores: Esto no es un truco, pero es lo que la documentación muestra también en sus tutoriales: https://svelte.dev/tutorial/inline-handlers
fuente
Rich ha respondido esto en un comentario, así que acéptalo, pero la forma de vincular los parámetros en un controlador de clics es la siguiente:
Para proporcionar algunos detalles adicionales a las personas que también luchan con esto, y debería estar en los documentos si no lo está, también puede obtener el evento click en dicho controlador:
fuente
Lo tengo trabajando con esto:
fuente
Aquí está con un método de rebote y argumento de evento:
fuente
No hay una forma clara mencionada en la documentación y su solución funcionará, pero de hecho no es muy elegante. Mi propia solución preferida es usar curry en el bloque de script .
Y en el HTML
Cuidado con el curry
Como se menciona en los comentarios, el curry tiene sus trampas. El más común que en el ejemplo anterior
handleClick('parameter1')
no se activará al hacer clic, sino al renderizar, devolviendo una función que a su vez se activará al hacer clic. Esto significa que esta función siempre usará 'parámetro1' como argumento.Por lo tanto, usar este método solo sería seguro si el parámetro utilizado es una constante de algún tipo y no cambiará una vez que se procese.
Esto me llevaría a otro punto:
1) Si es una constante que usa un parámetro, también podría usar una función separada
2) Si el valor es dinámico pero está disponible dentro del componente, esto aún podría manejarse con una función independiente:
3) Si el valor es dinámico pero no está disponible desde el componente porque depende de algún tipo de alcance (por ejemplo: una lista de elementos representados en un bloque # cada) enfoque 'hacky' funcionará mejor. Sin embargo, creo que sería mejor en ese caso tener los elementos de la lista como un componente y recurrir al caso # 2
Para concluir: el curry funcionará bajo ciertas circunstancias, pero no se recomienda a menos que sea muy consciente y cuidadoso sobre cómo usarlo.
fuente
on:click={() => handleClick('parameter1')}
)handleClick('parameter1')
es lo que sucede cuando ocurre el clic , incorrectamente. En segundo lugar, significa que el controlador debe recuperarse cada vez que cambian los parámetros, que es subóptimo. Actualmente, hay un error, lo que significa que de todos modos no funciona svelte.dev/repl/a6c78d8de3e2461c9a44cf15b37b4dda?version=3.12.1