slot

슬롯은 컴포넌트에 서브컨텐츠를 만들어 사용하는 것을 말합니다. 이것은 재사용 되는 컴포넌트에 주로 많이 사용되는 데요, 예를 들어 button, popup창 과 같이 큰 틀은 변하지 않지만, 내용은 계속 변경되어 사용 되어지는 경우가 많을 것입니다. 이때 레이아웃은 그대로 사용하고, 안에 들어가는 내용만 변경해 재사용하는 경우를 바로 slot이라고 이해하시면 되겠습니다. 이제 코드를 보고 좀 더 자세히 설명드리도록 하겠습니다.

간단하나 box.selte 이라는 컴포넌트를 만들어 보겠습니다.

<style>
	.box {
		width: 300px;
		border: 1px solid #aaa;
		border-radius: 2px;
		box-shadow: 2px 2px 8px rgba(0,0,0,0.1);
		padding: 1em;
		margin: 0 0 1em 0;
	}
</style>

<div class="box">
	<slot></slot>
</div>

이제 이 컴포넌트를 불러와 사용해 보도록 하겠습니다

<script>
	import Box from './Box.svelte';
</script>

<Box>
	<h2>Hello!</h2>
	<p>This is a box. It can contain anything.</p>
</Box>

Box 라는 기본 컴포넌트 안에 들어가는 <slot></slot> 로 명명된 영역은 컴포넌트를 불러 사용하는 부모 영역에서 작성한 태그를 그대로 적용해 사용이 가능합니다.

이제 좀 더 실용적인 예제를 보도록 하겠습니다.

다음과 같이 card.svelte라는 컴포넌트를 만들어 보겠습니다.

  • card.svelte

// card.svelte

<style>
.contact-card {
		width: 300px;
		border: 1px solid #aaa;
		border-radius: 2px;
		box-shadow: 2px 2px 8px rgba(0,0,0,0.1);
		padding: 1em;
	}

	h2 {
		padding: 0 0 0.2em 0;
		margin: 0 0 1em 0;
		border-bottom: 1px solid #ff3e00
	}

	.address, .email {
		padding: 0 0 0 1.5em;
		background:  0 50% no-repeat;
		background-size: 1em 1em;
		margin: 0 0 0.5em 0;
		line-height: 1.2;
	}

	.address { background-image: url(tutorial/icons/map-marker.svg) }
	.email   { background-image: url(tutorial/icons/email.svg) }
	.missing { color: #999 }
</style>

<article class="contact-card">
	<h2>
		user name
	</h2>

	<div class="address">
		user address
	</div>

	<div class="email">
		user email
	</div>
</article>
  • card.svelte

<style>
.contact-card {
		width: 300px;
		border: 1px solid #aaa;
		border-radius: 2px;
		box-shadow: 2px 2px 8px rgba(0,0,0,0.1);
		padding: 1em;
	}

	h2 {
		padding: 0 0 0.2em 0;
		margin: 0 0 1em 0;
		border-bottom: 1px solid #ff3e00
	}

	.address, .email {
		padding: 0 0 0 1.5em;
		background:  0 50% no-repeat;
		background-size: 1em 1em;
		margin: 0 0 0.5em 0;
		line-height: 1.2;
	}

	.address { background-image: url(tutorial/icons/map-marker.svg) }
	.email   { background-image: url(tutorial/icons/email.svg) }
	.missing { color: #999 }
</style>

<article class="contact-card">
	<h2>
		<slot name="name">
			<span class="missing">Unknown name</span>
		</slot>
	</h2>

	<div class="address">
		<slot name="address">
			<span class="missing">Unknown address</span>
		</slot>
	</div>

	<div class="email">
		<slot name="email">
			<span class="missing">Unknown email</span>
		</slot>
	</div>
</article>

이 컴포넌트에 name, addrss, email 이라는 3가지의 slot을 가지게 됩니다.

이제 이 card 컴포넌트를 불러와 사용해 보겠습니다.

<script>
	import Card from './card.svelte';
</script>

<Card>
	<span slot="name">
		P. Sherman
	</span>

	<span slot="address">
		42 Wallaby Way<br>
		Sydney
	</span>
</Card>

이제 결과를 보시면 알겠지만, 각 slot 에 필요한 내용이 채워진 것을 볼 수 있습니다 그리고 사용하지 않은 값은 card.svelte에서 설정한 기본 값으로 표시된 것을 볼 수 있습니다 . <span class="missing">Unknown email</span>

그리고 이런 HTML영역 뿐이라니 prop나 dispatch 통해 상위 컴포넌트에 값을 전달 받거나 전달하는 등의 기능도 수행 가능합니다.

[만들면서 배우는 Svelte]

Last updated