1 분 소요

Action

  • 엘리먼트 레벨의 라이프사이클 함수입니다. 다음과 같은 경우에 유용하다.
    • 타사 라이브러리와의 인터페이스
    • 지연 로딩되는 이미지
    • 툴팁
    • 사용자 정의 이벤트 핸들러 추가

The use directive

  • use라는 지시자를 썼는데, 다른 js에 있는 함수 엘리먼트에 적용하였다.

예시

  • App.svelte의 div에 click-outside.js의 함수를 적용하는 예시.
    App.svelte
1
2
3
4
5
6
7
8
9
<script>
  import { clickOutside } from "./click_outside.js";

  let showModal = true;
</script>

<div class="box" use:clickOutside on:outclick={() => (showModal = false)}>
Click outside me!
</div>
click_outside.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export function clickOutside(node) {
	const handleClick = (event) => {
		if (!node.contains(event.target)) {
			node.dispatchEvent(new CustomEvent("outclick"));
		}
	};

	document.addEventListener("click", handleClick, true);

	return {
		destroy() {
			document.removeEventListener("click", handleClick, true);
		}
	};
}

Adding parameters

  • use를 사용할때 parameter를 넘길수도 있다.

예시

  • longpress.js의 longpress 함수를 호출할때 duration을 parameter로 넘겨서 함수 기능이 추가되었다.
App.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script>
	import { longpress } from './longpress.js';

	let pressed = false;
	let duration = 2000;
</script>

<label>
	<input type=range bind:value={duration} max={2000} step={100}>
	{duration}ms
</label>

<button use:longpress={duration}
	on:longpress="{() => pressed = true}"
	on:mouseenter="{() => pressed = false}"
>press and hold</button>


click_outside.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
export function longpress(node, duration) {
	let timer;
	
	const handleMousedown = () => {
		timer = setTimeout(() => {
			node.dispatchEvent(
				new CustomEvent('longpress')
			);
		}, duration);
	};
	
	const handleMouseup = () => {
		clearTimeout(timer)
	};

	node.addEventListener('mousedown', handleMousedown);
	node.addEventListener('mouseup', handleMouseup);

	return {
		update(newDuration) {
			duration = newDuration;
		},
		destroy() {
			clearTimeout(timer);
			node.removeEventListener('mousedown', handleMousedown);
			node.removeEventListener('mouseup', handleMouseup);
		}
	};
}

참고 사이트

# Svelte 공식사이트 튜토리얼 - Bindings

댓글남기기