npx degit sveltejs/template 프로젝트이름
이후 npm install
npm build : 빌드
npm dev : 개발 서버
npm start : 배포
rollup : 코드 변화 파악해 컴파일 새로해준다.
App.svelte
<script>
export let name;
// 파일 내에서 {name} 으로 쓰일수 있고, 외부에서 설정 가능하다 < export >
</script>
<style>
h1 {
color: purple;
}
</style>
<h1>Hello {name.length}!</h1>
main.js
import App from './App.svelte';
const app = new App({
target: document.body,
props: {
name: 'world'
// export 되어있던 name의 값을 설정
}
});
export default app;
<script>
let name = 'Woo';
let age = 26;
// age를 1 늘려준다.
function incrementAge() {
age += 1;
}
</script>
<style>
h1 {
color: purple;
}
</style>
<h1>Hello {name}! My age is {age}</h1>
// 하단의 버튼을 클릭시 나이가 1씩 늘어난다.
<button on:click={incrementAge}>Change Age</button>
on:click 은 svelte 문법
<script>
let name = 'Woo';
let age = 26;
$: uppercaseName = name.toUpperCase();
$: console.log(name);
$: if(name === 'WooKyeongHoon') {
console.log('Oh he is woo');
}
function incrementAge() {
age += 1;
}
</script>
uppercaseName의 경우 name의 값에 의해 동적으로 정해진다.
name이 바뀔때마다 새로 계산되는것
정확히는 재 계산 이후 렌더링이 새로 일어난다
{#if (formState === 'done')}
<ContactCard />
{:else if (formState === 'invalid')}
<p>invalid card</p>
{/if}
{#each createdContacts as createdContact}
<ContactCard userName={createdContact.name}/>
{/each}
{#each createdContacts as createdContact, index (createdContact.id)}
on:click|once > 한번만 작동하는 click
on:click|preventDefault > 기본동작 방지
<body>
<div id="Header"></div>
<div id="App"></div>
</body>
import App from './App.svelte';
import Header from './UI/Header.svelte';
const app = new App({
target: document.querySelector('#App')
});
const header = new Header({
target: document.querySelector('#Header')
})
export default app;
자식 컴포넌트에 아래와 같이 dispatcher 구성
import { createEventDispatcher } from "svelte";
const dispatch = createEventDispatcher();
const sendEvent = () => {
dispatch("buttonClick", "Hello");
}
dispatch의 첫번째 값은 이벤트의 이름, 두번째 값은 이벤트 핸들러 함수에 전달할 값을 넣는다.
<script>
import ChildComponent from "./Child.svelte";
const handleButtonClick = event => {
console.log(event.detail);
}
</script>
<div>
<ChildComponent on:buttonClick={handleButtonClick}/>
</div>
<!-- Box.svelte -->
<div class="box">
<slot></slot>
</div>
<Box>
<h2>Hello!</h2>
<p>This is a box. It can contain anything.</p>
</Box>
슬롯에 이름 붙히기
자식 컴포넌트에 slot 넣을때 name 붙히기
<!-- ContactCard.svelte -->
<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>
부모 컴포넌트에서 사용할때 slot="이름" 을 자식에 넣어서 제공하기
<ContactCard>
<span slot="name">
P. Sherman
</span>
<span slot="address">
42 Wallaby Way<br>
Sydney
</span>
</ContactCard>
<div on:mouseenter={enter} on:mouseleave={leave}>
<slot hovering={hovering}></slot>
</div>
<Hoverable let:hovering={active}>
<script>
import { onMount } from 'svelte';
let photos = [];
onMount(async () => {
const res = await fetch(`/tutorial/api/album`);
photos = await res.json();
});
</script>
<script>
import { onDestroy } from 'svelte';
let counter = 0;
const interval = setInterval(() => counter += 1, 1000);
onDestroy(() => clearInterval(interval));
</script>
await tick(); // DOM 적용될 때까지 기다립니다.