- Tags
: 소문자 태그는 일반적인 HTML 요소를 나타냄
: 대문자로 시작하는 태그는 컴포넌트를 나타냄
- Attributes와 Props
: 기본적으로 속성은 HTML 속성과 동일하게 작동
<div class="foo">
<button disabled>can't touch this</button>
</div>
: 값은 따옴표로 묶지 않고 사용 가능
<input type=checkbox />
: 속성 값에는 JavaScript 표현식을 포함하거나 표현식 사용 가능
<a href="page/{p}">page {p}</a>
<button disabled={!clickable}>...</button>
: 부울 속성은 값이 truthy이면 요소에 포함되고, falsy이면 제외됩니다.
: 나머지 속성은 값이 nullish(값이 null 또는 undefined)인 경우를 제외하고 포함
<input required={false} placeholder="This input field is not required" />
<div title={null}>This div has no title attribute</div>
: 표현식에는 일반 HTML에서 구문 강조 표시가 실패할 수 있는 문자가 포함될 수 있으므로 값에 따옴표를 사용 가능 (따옴표는 값의 구문 분석에 영향을 주지 X)
<button disabled="{number !== 42}">...</button>
: 속기 속성 : 속성 이름과 값이 일치하는 경우 (name={name}), {name}으로 대체 가능
<button {disabled}>...</button>
<!-- 다음과 같음 -->
<button disabled={disabled}>...</button>
: 속성에 전달되는 값은 DOM의 속성이 아닌 property 또는 props라고 부름
: 요소와 마찬가지로 name={name}은 {name} 단축형으로 대체 가능
<Widget foo={bar} answer={42} text="hello" {name} />
: 스프레드 속성을 사용하면 여러 속성이나 프로퍼티를 한 번에 요소나 컴포넌트에 전달 가능
: 요소나 컴포넌트에는 여러 개의 스프레드 속성과 일반 속성을 번갈아가며 사용 가능
<script>
const pkg = {
name: 'svelte',
speed: 'blazing',
version: 4,
website: 'https://svelte.dev'
};
</script>
<PackageInfo {...pkg} />
: $$props는 export로 선언되지 않은 모든 props를 포함하여 컴포넌트에 전달된 props를 참조
: $$props를 사용하면 컴포넌트가 받는 모든 props를 한 번에 전달할 수 있습니다. 이는 코드의 가독성과 유지 보수성을 향상시키는 데 도움된다. 또한, 컴파일 시간에 어떤 props가 컴포넌트에 전달될지 알 수 없는 경우에 유용할 수 있다. 컴포넌트의 props가 변경되어도 코드를 수정할 필요가 없다.
그러나 $$props를 사용할 때 성능에 주의해야 한다. $$props는 모든 props를 다시 확인해야 하므로 특정 prop에 대한 참조보다는 성능이 떨어질 수 있다. 따라서 성능이 중요한 경우에는 특정 prop에 대한 참조를 사용하는 것이 좋다.
<!-- 상위 컴포넌트 -->
<script>
export let name;
export let age;
export let email;
</script>
<!-- $$props를 사용하여 모든 props를 전달 -->
<ProfileCard {...$$props} />
<!-- ProfileCard 컴포넌트 -->
<script>
export let name;
export let age;
export let email;
</script>
<div>
<h1>{name}</h1>
<p>Age: {age}</p>
<p>Email: {email}</p>
</div>
: $$restProps는 export로 선언되지 않은 props만을 포함한다. 이는 컴포넌트 내에서 알 수 없는 다른 속성을 요소에 전달하는 데 사용될 수 있습니다. $$props와 동일한 성능 특성을 가지고 있습니다.
<input {...$$restProps} />
* input 요소의 value 속성 또는 그 자식인 option 요소들의 value 속성은 bind:group 또는 bind:checked를 사용할 때는 spread 속성을 이용하여 설정해서는 안 된다. 이 경우 Svelte는 요소의 값을 직접적으로 마크업에서 확인할 수 있어야 하기 때문이다.
* 속성의 순서가 때로는 중요할 수 있다. Svelte는 JavaScript에서 속성을 순차적으로 설정하기 때문이다. 예를 들어, <input type="range" min="0" max="1" value={0.5} step="0.1"/>의 경우, Svelte는 value를 1로 설정하려고 시도하고 (기본적으로 step은 1이기 때문에 0.5를 반올림하여 1로 설정합니다), 그 후에 step을 0.1로 설정한다. 이를 해결하기 위해서는 <input type="range" min="0" max="1" step="0.1" value={0.5}/>로 변경해야 한다.
* 또 다른 예로 <img src="..." loading="lazy" />가 있다. Svelte는 img 요소의 loading="lazy" 설정 후 src를 설정하기 때문에 이미지가 지연로드되기에는 너무 늦을 수 있다. 이를 해결하기 위해서는 <img loading="lazy" src="...">로 변경해야 한다.
Text Expression
중괄호로 감싸서 JavaScript 표현식을 텍스트로 포함시킬 수 있다.
{expression}
중괄호는 Svelte 템플릿 내에서 사용하기 위해 HTML 엔티티 문자열인 {, { 또는 {를 사용하여 표시할 수 있다. 중괄호는 }, } 또는 }를 사용하여 표시할 수 있다.
정규 표현식 (RegExp) 리터럴 표기법을 사용하는 경우 괄호로 감싸야 한다.
<h1>Hello {name}!</h1>
<p>{a} + {b} = {a + b}.</p>
<div>{(/^[A-Za-z ]+$/).test(value) ? x : y}</div>
주석
: 컴포넌트 내에서 HTML 주석을 사용할 수 있다.
<!-- this is a comment! --><h1>Hello world</h1>
svelte-ignore로 시작하는 주석은 다음 마크업 블록에 대한 경고를 비활성화합니다. 일반적으로 이는 접근성 경고다. 경고를 비활성화하는 이유가 충분한지 확인해야한다.
<!-- svelte-ignore a11y-autofocus -->
<input bind:value={name} autofocus />
Reference) 위 내용은 Svelte 공식 문서의 내용을 번역한 내용입니다.
Basic markup • Docs • Svelte
Edit this page on GitHub On this page On this page A lowercase tag, like , denotes a regular HTML element. A capitalised tag, such as or , indicates a component. import Widget from './Widget.svelte'; Attributes and propspermalink By default, attributes wor
svelte.dev
'개발 공부 > Svelte' 카테고리의 다른 글
Svelte) Special elements (2) | 2023.10.15 |
---|---|
Svelte) Component directives (1) | 2023.10.15 |
Svelte) Element directives (2) | 2023.09.18 |
Svelte) Special-tags (0) | 2023.09.18 |
Svelte) Logic Blocks (1) | 2023.09.18 |