on:eventname
Svelte 컴포넌트는 DOM 이벤트와 동일하게 컴포넌트에서도 이벤트를 발생시키고 수신할 수 있습니다. 이벤트는 createEventDispatcher
함수를 사용하여 프로그램적으로 디스패치할 수 있으며, DOM 이벤트를 전달(forwarding)하는 방식으로도 가능합니다.
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
</script>
<!-- 프로그램적으로 이벤트 디스패치 -->
<button on:click={() => dispatch('hello')}> one </button>
<!-- 선언적으로 이벤트 전달 -->
<button on:click> two </button>
컴포넌트 이벤트 수신은 DOM 이벤트와 동일하게 처리됩니다.
<SomeComponent on:whatever={handler} />
on:
지시어가 값 없이 사용되면 이벤트가 전달되며, 소비자가 해당 이벤트를 수신할 수 있게 됩니다.
<SomeComponent on:whatever />
--style-props
컴포넌트에 CSS 사용자 정의 속성을 사용해 스타일을 props로 전달할 수 있습니다. Svelte는 이를 위해 래퍼 요소를 추가하는 문법적 설탕을 제공합니다.
예를 들어:
<Slider bind:value min={0} --rail-color="black" --track-color="rgb(0, 0, 255)" />
위 코드는 다음과 같이 변환됩니다:
<div style="display: contents; --rail-color: black; --track-color: rgb(0, 0, 255)">
<Slider bind:value min={0} max={100} />
</div>
주의할 점은, 이렇게 추가된 <div>
요소가 CSS 구조에 영향을 미칠 수 있다는 것입니다. SVG 네임스페이스에서 이 문법은 <g>
태그로 변환됩니다.
<g style="--rail-color: black; --track-color: rgb(0, 0, 255)">
<Slider bind:value min={0} max={100} />
</g>
컴포넌트에서 쉽게 테마를 설정할 수 있도록 Svelte의 CSS 변수를 사용할 수 있습니다.
<style>
.potato-slider-rail {
background-color: var(--rail-color, var(--theme-color, 'purple'));
}
</style>
전역 테마 색상을 설정하거나 컴포넌트 소비자 수준에서 이를 재정의할 수 있습니다.
/* global.css */
html {
--theme-color: black;
}
<Slider --rail-color="goldenrod" />
bind:property
컴포넌트의 속성에도 bind:
지시어를 사용하여 바인딩할 수 있습니다. 이를 통해 컴포넌트 내부에서 속성 값이 변경될 때, 상위 컴포넌트에 그 값이 전달됩니다.
<Keypad bind:value={pin} />
기본적으로 Svelte의 속성은 반응성을 가지지만, 바인딩은 기본적으로 하향식(상위 → 하위)으로만 흐릅니다. bind:property
를 사용하면 하위 컴포넌트의 값 변경이 상위로 흐르게 할 수 있습니다.
bind:this
컴포넌트 인스턴스에도 bind:this
를 사용하여 컴포넌트와 프로그램적으로 상호작용할 수 있습니다. 이를 통해 컴포넌트의 메서드를 호출하거나 상태를 조작할 수 있습니다.
<ShoppingCart bind:this={cart} />
<button on:click={() => cart.empty()}> 장바구니 비우기 </button>
참고로, 렌더링 시점에 cart
는 아직 정의되지 않았기 때문에 {cart.empty}
와 같은 방식으로 바로 호출하면 오류가 발생할 수 있습니다.
'프로그래밍 > Web' 카테고리의 다른 글
svelte 번역 - 8 - Template Syntax / Special elements (1) | 2024.10.17 |
---|---|
svelte 번역 - 6 - Template Syntax / Element directives (1) | 2024.10.17 |
svelte 번역 - 5 - Template Syntax / Special tags (0) | 2024.10.17 |
svelte 번역 - 4 - Template Syntax / Logic blocks (0) | 2024.10.17 |
svelte 번역 - 3 - Template Syntax / Basic markup (0) | 2024.10.17 |
댓글