Привязать функцию к кнопке легко и просто:
<button on:click={handleClick}>
Clicks are handled by the handleClick function!
</button>
Но я не вижу способа передать параметры (аргументы) в функцию, когда я делаю это:
<button on:click={handleClick("parameter1")}>
Oh no!
</button>
Функция вызывается при загрузке страницы и никогда больше.
Можно ли вообще передавать параметры в вызываемую функцию on:click{}
?
РЕДАКТИРОВАТЬ:
Я только что нашел хакерский способ сделать это. Вызов функции из встроенного обработчика работает.
<button on:click={() => handleClick("parameter1")}>
It works...
</button>
Ответы:
TL; DR
Просто оберните функцию обработчика в другую функцию, для элегантности используйте функцию стрелки
Вы должны использовать объявление функции, а затем вызвать обработчик с аргументами. Функция стрелки элегантна и хороша для этого сценария.
ПОЧЕМУ мне нужна еще одна функция-обертка?
Если бы вы использовали только обработчик и передавали параметры, как бы это выглядело?
Вероятно, что-то вроде этого:
Но помните,
handleClick("arg1")
это то, как вы вызываете функцию мгновенно, и именно так и происходит, когда вы ее называете так, она будет вызываться, когда выполнение достигает этой строки, а не так, как ожидалось, НА КНОПКЕ CLICK ...Следовательно, вам нужно объявление функции, которое будет вызываться только событием click, и внутри него вы вызываете свой обработчик с таким количеством аргументов, сколько захотите.
Как отметил @Rich Harris (автор Svelte) в комментариях выше: это не хак, но то, что документация показывает также в своих руководствах: https://svelte.dev/tutorial/inline-handlers.
источник
Рич ответил на это в комментарии, так что поверьте ему, но способ привязки параметров в обработчике кликов заключается в следующем:
Чтобы предоставить некоторые дополнительные сведения людям, которые также борются с этим, и это должно быть в документах, если это не так, вы также можете получить событие click в таком обработчике:
источник
Я получил это работает с этим:
источник
Вот это с методом debounce и аргументом события:
источник
Там нет четкого пути, упомянутого в документации, и ваше решение будет работать, но на самом деле не очень элегантно. Мое собственное предпочтительное решение - использовать каррирование в самом блоке скрипта .
И в HTML
Остерегайтесь карри
Как уже упоминалось в комментариях, карри имеет свои подводные камни. Наиболее распространенный
handleClick('parameter1')
вариант, который в приведенном выше примере будет вызываться не при нажатии, а при рендеринге, возвращая функцию, которая, в свою очередь, будет запущена при нажатии. Это означает, что эта функция всегда будет использовать «параметр1» в качестве аргумента.Поэтому использование этого метода будет безопасным только в том случае, если используемый параметр является некоторой константой и не изменится после того, как он будет представлен.
Это привело бы меня к другому вопросу:
1) Если в качестве константы используется параметр, вы также можете использовать отдельную функцию
2) Если значение является динамическим, но доступно внутри компонента, это все равно можно обработать с помощью отдельной функции:
3) Если значение является динамическим, но не доступно из компонента, поскольку оно зависит от некоторой области видимости (например, список элементов, отображаемых в блоке #each), подход «хакерский» будет работать лучше. Однако я думаю, что в этом случае было бы лучше, если бы сами элементы списка были компонентом и вернулись к случаю № 2.
В заключение: карри будет работать при определенных обстоятельствах, но не рекомендуется, если вы не очень хорошо осведомлены и не знаете, как его использовать.
источник
on:click={() => handleClick('parameter1')}
)handleClick('parameter1')
именно это происходит, когда щелчок происходит неправильно. Во-вторых, это означает, что обработчик должен быть отскочен при изменении параметров, Это неоптимально. В настоящее время есть ошибка, означающая, что она все равно не работает svelte.dev/repl/a6c78d8de3e2461c9a44cf15b37b4dda?version=3.12.1