在Svelte中处理DOM事件

133 阅读2分钟

倾听DOM事件

在Svelte中,你可以直接在模板中定义一个DOM事件的监听器,使用on:<event> 语法。

例如,要监听click 事件,你将传递一个函数给on:click 属性。

要监听onmousemove 事件,你将传递一个函数到on:mousemove 属性。

下面是一个内联定义处理函数的例子。

<button on:click={() => {
  alert('clicked')
}}>Click me</button>

和另一个例子,处理函数定义在组件的script 部分。

<script>
const doSomething = () => {
  alert('clicked')
}
</script>

<button on:click={doSomething}>Click me</button>

当代码不是太冗长时,我更喜欢内联。例如,如果只有2-3行,否则我会将其移到脚本部分。

Svelte将事件处理程序作为函数的参数传递,如果你需要停止传播或引用事件对象中的某些内容,这很方便。

<script>
const doSomething = event => {
  console.log(event)
  alert('clicked')
}
</script>

<button on:click={doSomething}>Click me</button>

现在,我提到了 "停止传播"。这是一个非常常见的事情,例如,停止表单提交事件。Svelte为我们提供了修改器,一种直接应用它而不需要手动操作的方法。stopPropagationpreventDefault 是你最常使用的两个修改器,我认为。

你像这样应用一个修改器。<button on:click|stopPropagation|preventDefault={doSomething}>Click me</button>

还有其他的修改器,这些修改器更小众。capture 可以捕获事件而不是冒泡once 只触发一次事件,self 只在事件的目标是这个对象时才触发事件(把它从冒泡/捕获的层次中移除)。

在组件中创建你的事件

有趣的是,我们可以在组件中创建自定义事件,并且使用与内置DOM事件相同的语法。

要做到这一点,我们必须从svelte 包中导入createEventDispatcher 函数,并调用它来获得一个事件分配器。

<script>
  import { createEventDispatcher } from 'svelte'
  const dispatch = createEventDispatcher()
</script>

一旦我们这样做了,我们就可以调用dispatch() 函数,传递一个标识事件的字符串(我们将在其他使用这个的组件中使用on: 语法)。

<script>
  import { createEventDispatcher } from 'svelte'
  const dispatch = createEventDispatcher()

  //when it's time to trigger the event
  dispatch('eventName')
</script>

现在其他组件可以使用我们的,使用

<ComponentName on:eventName={event => {
  //do something
}} />

你也可以向事件传递一个对象,向dispatch() 传递第二个参数。

<script>
  import { createEventDispatcher } from 'svelte'
  const dispatch = createEventDispatcher()
  const value = 'something'

  //when it's time to trigger the event
  dispatch('eventName', value)

  //or

  dispatch('eventName', {
    someProperty: value
  })
</script>

dispatch() 传递的对象在event 对象上可作为event.detail