Svelte에서 Event를 어떻게 사용할 수 있는지 알아봅니다.
앞에서 얘기했듯 on:
을 통해 이벤트를 처리할 수 있습니니다.
<script>
let m = { x : 0, y : 0 };
function handleMousemove(event){
m.x = event.clientX;
m.y = event.clientY;
}
</script>
<div on:mousemove={handleMousemove}>
The mouse position is {m.x} x {m.y}
</div>
on:
뒤에 HTML Element에 추가하고 싶은 이벤트 핸들러의 이름을 지정해주고 함수를 넣어줍니다.
5-1의 예제의 함수를 inline에서도 적용할 수 있습니다.
<div on:mousemove={(event) => m = {x : event.clientX, y : event.clientY}}>
The mouse position is {m.x} x {m.y}
</div>
이벤트 핸들러는 once
같은 Modifiers
(수식어)를 가질 수 있습니다.
<button on:click|once={handleClick}>
Click me
</button>
on:핸들러|수식어
on:핸들러|수식어1|수식어2...={함수}
preventDefault
: 이벤트 핸들러 실행 전에 e.preventDefault()
를 실행합니다.stopPropagation
: e.stopPropagation()
을 실행해서 이벤트 버블링을 막아줍니다.passive
: 터치/휠 이벤트의 performance를 향상시켜줍니다.nopassive
: passive
를 작동하지 않습니다.capture
: 이벤트 핸들러를 bubbling
단계가 아닌 capturing
단계에서 실행합니다.once
: 핸들러를 처음 실행하고 핸들러를 제거합니다.self
: event.target
이 자신일 때에만 핸들러를 실행합니다.trusted
: event.isTrusted
가 true
일 때에만 핸들러를 실행합니다. 컴포넌트에서 event를 dispatcher를 통해 보낼 수 있습니다.
// App.svelte
<script>
import Inner from './Inner.svelte';
function handleMessage(event){
alert(event.detail.text);
}
</script>
<Inner on:message={handleMesssage}/>
// Inner.svelte
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
function sayHello(){
dispatch('message', {
text: 'Hello!'
});
}
</script>
<button on:click={sayHello}>
Click to say hello
</button>
<Inner on:message={handleMessage}/>
에서 on:message
를 통해 Inner 컴포넌트에서 보내는 메세지를 듣고 있습니다.DOM 이벤트와 달리 컴포넌트 이벤트는 버블링되지 않습니다.
<App>
<Outer>
<Inner />
</Outer>
</App>
Outer
-> Inner
로 보내진 이벤트는 버블링이 일어나지 않고 그대로 끝나게 됩니다.Outer
에서도 dispatch를 둬서 Inner
에서 받은 이벤트를 App
으로 보내주어야 합니다.<Inner on:message/>
이렇게 on:message의 값을 할당하지 않고 비워두면 '모든 message 이벤트를 forward한다.' 라는 의미를 갖게 했고 이를 이벤트 포워딩
이라 합니다.이벤트 포워딩은 DOM 이벤트에서도 작동합니다.
// App.svelte
...
<CustomButton on:click={handleClick}/>
// CustomButton.svelte
<button> Click me </button>
<style>
...
</style
CustomButton
컴포넌트에서 발생한 button onclick 이벤트는 App으로 버블링되지 않습니다.<button on:click> Click me </button>
이벤트 포워딩을 통해 CustomButton
컴포넌트에서 발생한 onlclick 이벤트를 App에서 받을 수 있습니다.