on click
Svelte에 VanillaJS를 더한 기준으로 DOM을 찾아 버튼에 연결시켜 이벤트를 수행한다면 다음과 같은 과정을 거쳐야 한다.
App.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
import { onMount } from 'svelte'
let text = "안녕하세요!"
onMount(() => {
const but = document.querySelector('.myButton')
but.addEventListener('click', () => text = '잘가세요!')
})
</script>
<button class='myButton'>
버튼
</button>
<h1>
{text}
</h1>
onMount라는 걸 받고, onMount()는 콜백 함수를 받는다. 그 안에서 우리의 addEventListener를 실행시킬 수 있다. 하지만 svelte에서 우리가 이렇게 어려운 과정을 거칠 일은 없을 것이다. on Event를 사용한다면 말이다.
App.svelte
1
2
3
4
5
6
7
8
9
<script>
let text = "안녕하세요!"
</script>
<button on:click={() => {text = "잘 가세요!"}>
버튼
</button>
<h1>
{text}
</h1>
on Event는 AddEventListener로 실행되는 모든 이벤트를 받을 수 있다. on:click 메소드는 콜백 함수를 하나 받고, 그 안에 우리가 실행할 내용을 적어주면 된다. 물론 내용이 길다면 그 내용을 스크립트로 별도로 빼서 적용해도 문제 없다.
on input
App.svelte
1
2
3
4
5
6
7
8
9
10
<script>
let myText
function handleInput(event) {
myText = event.target.value
}
</script>
<input on:input={handleInput} />
<h1>
{myText}
</h1>
on:input에 인풋 핸들러 함수를 넣고, event를 받는다. event.target.value는 우리의 인풋 상자를 가리킨다. 따라서 우리는 이렇게 간단한 방법으로 인풋 값을 받아올 수 있다.
on focus
App.svelte
1
2
3
4
5
6
7
8
9
10
11
12
<script>
let state
function handleFocus() {
state = "포커스가 있어요!"
}
function handleBlur() {
state = "포커스가 나갔어요!"
}
</script>
<h1> {state} </h1>
<input on:focus={handleFocus} on:blur={handleBlur} />
focus와 blur를 이용하면 포커스 유무에 따라 다양한 이벤트를 사용할 수 있다.
on mouse
App.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script>
let boxSize = 200
function me() {
boxSize = 300
}
function ml() {
boxSize = 200
}
</script>
<div class='myBox'
on:mouseenter={me}
on:mouseleave={ml}
style="width: {boxSize}px;height: {boxSize}px;"></div>
<style>
.myBox {
background-color: green;
}
</style>
다양한 마우스 이벤트들도 처리할 수 있다. 위 코드는 마우스가 들어가면 div 크기를 키우고, 마우스가 나오면 div 크기를 원상복구시키는 동적 페이지를 만들 수 있다.