您的自定义格式化程序返回的字符串将被处理为“普通”HTML,因此 Svelte 语法不再可用......即on:click
是 Svelte 语法,不会被浏览器处理。
我不是自定义元素专家,但不幸的是,根据其他人的说法,您尝试做的事情是不可能的。也就是说,您不能仅从 HTML 中在自定义元素上注册自定义事件侦听器。您必须从 JS 中执行此操作。像这样的东西:
<script>
document.querySelector('custom-button')
.addEventListener('my-event', e => {
console.log(e.detail)
})
</script>
此外,请注意,来自 Svelte 中自定义元素的事件目前受到一些限制(请参阅此问题)。
因此,为了为您的自定义元素设置自定义事件,您必须使用某种解决方法。例如,这是一个将触发上述代码段中的侦听器的组件:
<svelte:options tag="custom-button" />
<script>
import { onMount } from 'svelte';
let el
onMount(() => {
const interval = setInterval(() => {
let event = new CustomEvent('my-event', {
detail: {time: Date.now()},
bubbles: true,
composed: true, // needed for the event to traverse beyond shadow dom
})
el.dispatchEvent(event)
}, 1000)
return () => {
clearInterval(interval)
}
})
</script>
<button bind:this={el}><slot /></button>
请注意,此类代码对旧版浏览器的支持有限。
onclick
话虽如此,对于您示例中的情况,您显然可以通过使用本机浏览器而不是 Svelte注册您的事件来使其工作on:click
。我仍然不是 CE 专家,但我的猜测是浏览器处理所有原生元素上可用的标准事件,例如 CE 元素上的 click 或 keydown ......
因此,看来这应该适合您:
return '<ul class="actions_row"><li><custom-button onclick="handleClick">Edit</custom-button></li></ul>';
注意:onclick="handleClick"
而不是on:click={handleClick}
. 您现在处于标准浏览器领域,因此适用常规规则,就像您使用普通<button>
...handleClick
必须在范围内可用,等等。