Svelte Basic
Published at Jan 23, 2024
svelte-basic
Svelte Learn!
์ํ๊ฐ
<script>
let count = 0;
//์ํ๋ ๋ณ์ ๋ฟ์๋๋ผ ๋ฐฐ์ด, object, object array๋ฑ js์ ๋๋ถ๋ถ์ ํ์
์ ์ง์ ํ ์ ์์
function handleClick() {
count += 1;
}
</script>
<button on:click={handleClick}>
ํด๋ฆญ์ { count }
</button>
๋ฐ์์ฑ
<script>
let count = 0
$: doubled = count * 2
$: if(count >= 10) {
alert('์นด์ดํธ 10์ ๋์์ต๋๋ค.')
count = 9
}
//if๋ฌธ๋ ์ฌ์ฉ ๊ฐ๋ฅ
$: {
console.log( count )
console.log( doubled )
}
//๋ฐ์์ฑ์ $๋ก ํ์ํ๊ณ ํจ๊ป ์ฌ์ฉํ ์ ์์
function handleClick() {
count += 1;
}
</script>
<button on:click={handleClick}>
ํด๋ฆญ์ { count } { count === 1 ? 'time' : 'times'}
</button>
<p>{count} ๋๋ฐฐ๋ {doubled}</p>
์ํ๊ฐ ๋ณ๊ฒฝ์ ๋์์ ์ผ๋ก ๋น ๋ฅด๊ฒ ํ ์ ์์
Component
<script>
import Header from './header.svelte'
import Content from './content.svelte'
import Footer from './footer.svelte'
</script>
<Header />
<Content />
<Content />
<Content />
<Footer/>
์ปดํฌ๋ํธ๋ฅผ importํด์ฌ๋๋ ๋๋ฌธ์ ์์ํด์ผํ๊ณ html๋จ์์ ๊ทธ๋ฅ ํ๊ทธ ์ฐ๋๊ฒ์ฒ๋ผ ์ฐ๋ฉด ๋ถ๋ฌ์ฌ ์ ์์
props
//app.svelte
<script>
import CountComp from './countComp.svelte'
import BtnComp from './btnComp.svelte'
let count = 0
$: doubled = count * 2
$: if(count >= 10) {
alert('์นด์ดํธ 10์ ๋์์ต๋๋ค.')
count = 9
}
function handleClick() {
count += 1;
}
</script>
<BtnComp { count } { handleClick }/>
<CountComp { count } { doubled }/>
<script>
//btnComp.svelte
export let count;
export let handleClick;
import LabelComp from './labelComp.svelte'
</script>
<button on:click={handleClick}>
ํด๋ฆญ์ { count } <LabelComp {count}/>
</button>
props๋ ๋ถ๋ชจ์ปดํฌ๋ํธ๊ฐ ์์์ปดํฌ๋ํธ์๊ฒ๋ง ๋ณด๋ผ ์ ์์
ํจ์๋ ๋ณ์๋ export let ๋ณ์๋ช
ํ๋ฉด ์์์ปดํฌ๋ํธ์์ ์ฌ์ฉ ๊ฐ๋ฅ
๋จ๋ฐฉํฅ ๋ฐ์ธ๋ฉ
์
๊ทธ๋์ context, dipatcher, store๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ผ๋ฆฌ ํต์ ํ ์ ์์
๋ ผ๋ฆฌ๋ธ๋ก
<script>
let auth = {
loggedIn: false
}
const handleLogin = () => auth.loggedIn = true;
const handleLogout = () => auth.loggedIn = false;
</script>
<button on:click={handleLogin}>Log In </button>
<button on:click={handleLogout}>Log out</button>
{#if auth.loggedIn === true}
<p>๋ก๊ทธ์ธ ์ํ์
๋๋ค.</p>
{:else}
<p>๋ก๊ทธ์์ ์ํ์
๋๋ค.</p>
{/if}
์ ๋ ๊ฒ #if๋ฅผ ์น๋ฉด ์กฐ๊ฑด๋ฌธ์ ์ธ ์ ์์ ๋ง์ง๋ง์ /if๋ก ๋ซ์์ค์ผํจ
๋ฐ๋ณต๋ธ๋ก
<script>
let todos = [
{
id: 0,
content: '์ฒซ ๋ฒ์งธ ํ ์ผ',
done: false
},
{
id: 1,
content: '๋ ๋ฒ์งธ ํ ์ผ',
done: false
},
{
id: 2,
content: '์ธ ๋ฒ์งธ ํ ์ผ',
done: false
},
{
id: 3,
content: '๋ค ๋ฒ์งธ ํ ์ผ',
done: false
}
]
</script>
<ul>
{#each todos as todo}
<li>
<span>
{todo.id}
</span>
<span>
{todo.content}
</span>
<span>
{todo.done}
</span>
</li>
{/each}
</ul>
๋ฐฐ์ด์ ๋ด์ฉ์ #each๋ฅผ ์ฌ์ฉํด์ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์
store
์ ์ญ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅํ ์ํ๊ฐ ์ ์ฅ์
import { writable } from 'svelte/store';
function createCount() {
const { subscribe, set, update } = writable(0);
const increment = () => update(count => count +1)
//update๋ ๊ฐ์ ๋ฐ์์ ์ฐ์ฐํ๊ณ , ๊ฐ์ ๋ค์ ๋ฆฌํดํด์ค
const decrement = () => update(count => count -1)
const reset = () => set(0)
//set์ ๊ฐ์ ์ด๊ธฐํํด์ค
return {
subscribe,
increment,
decrement,
return
}
//์์ ๋ด์ฉ์ ๋ฌด์กฐ๊ฑด ๋ฆฌํดํด์ค์ผํจ
export cosnt count = createCount();
}
//์ฌ์ฉ์ ์ง์ ํจ์ ์ฌ์ฉ๋ฒ์ ๋ณ์์ฒ๋ผ ๋๊ฐ์
//writable์ importํด์จ ํ ์ ๋ ๊ฒ export๋ก ์ ์ธํ๋ฉด ์ํ๊ฐ ์ ์ฅ์๊ฐ ์๊ธฐ๊ณ ์ ๊ฑธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ๋๋ ์ปดํฌ๋ํธ importํด์ค๋๊ฑฐ์ฒ๋ผ ์ฌ์ฉํ๋ฉด ๋จ
slot
์ปดํฌ๋ํธ ์ฌ์ฌ์ฉํ ๋ ์ฌ์ฉํจ
card.svelte
<article class="contact-card">
<h2>
<slot name="name">
<span class="missing">๋ฏธ์
๋ ฅ</span>
</slot>
</h2>
<div class="address">
<slot name="address">
<span class="missing">๋ฏธ์
๋ ฅ</span>
//Missing์ ์ฐ๋ฉด ์
๋ ฅ๋์ง ์์์๋ ๋ฏธ์
๋ ฅ์ด๋ผ๊ณ ์ถ๋ ฅ๊ฐ๋ฅํจ
</slot>
</div>
{#if $$slots.email}
//'$$slots.์ฌ๋กฏ์ด๋ฆ'์ ์ ์ผ๋ฉด ์ฌ๋กฏ์ด ์ฌ์ฉ๋์๋์ง ์๋์๋์ง ํ์ธํ ์ ์์
<div class="email">
<hr>
<slot name="email"></slot>
</div>
{/if}
</article>
<script>
import Card from './card.svelte'
</script>
<Card>
<span slot="name">
ํ๊ธธ๋
</span>
<span slot="address">
tjdnfxmrquftl<br>
์ฌ์๋๋
</span>
</Card>
<Card>
<span slot="name">
ํ๊ธธ๋
</span>
//slotํด๋์ค๋ง๋ค ๋ค๋ฅด๊ฒ ๋ฃ์ด์ ์ด๋ฆ๊ณผ ํ๊ทธ๋ฅผ ๋ฐ๊ฟ์ธ์ ์์
<span slot="address">
tjdnfxmrquftl<br>
์ฌ์๋๋
</span>
<span slot="email">
a243qw@masdgas.com
</span>
</Card>
div๋ง๊ณ svelte:fragment๋ฅผ ์ฌ์ฉํ๋ฉด div๋์ฉ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅ