SvelteKit-learn

Personal SvelteKit learning note

Including Svelte and SvelteKit

Basic Svelte

Introduction

Svelte 可以用来制作小的JS模块,并且通过组合这些组件来构建应用。

组件是可重复使用的代码块,包含HTML,CSS和JS并且一个组件就是一个.svelte文件。

简单的添加数据并使用:

1
2
3
4
5
6
7
<script>
let src = '/image.gif';
let name = 'Rick Astley';
</script>

<img {src} alt="{name} dances." />

添加样式:

1
2
3
4
5
6
7
8
9
10
<p>This is a paragraph.</p>

<style>
p {
color: goldenrod;
font-family: 'Comic Sans MS', cursive;
font-size: 2em;
}
</style>

前后顺序并不影响。

引用另一个组件的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
import Nested from "./Nested.svelte"
</script>
<Nested/>
<p>This is a paragraph.</p>

<style>
p {
color: goldenrod;
font-family: 'Comic Sans MS', cursive;
font-size: 2em;
}
</style>

引用的组件并不会套用当前组件的css,组件名需要首字母大写。

string里插入html片段

1
2
3
4
5
<script>
let string = `this string contains some <strong>HTML!!!</strong>`;
</script>

<p>{@html string}</p>

在使用string变量名的时候添加{@html xxx}即可

button点击事件

1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
let count = 0;

function increment() {
count += 1;
}
</script>

<button on:click={increment}>
Clicked {count}
{count === 1 ? 'time' : 'times'}
</button>

首先用button标签新建一个按钮,在on监听click事件并绑定给一个函数。

可变变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
let count = 0;
$: doubled = count * 2;

function increment() {
count += 1;
}
</script>

<button on:click={increment}>
Clicked {count}
{count === 1 ? 'time' : 'times'}
</button>

<p>{count} doubled is {doubled}</p>

加这个修饰符可以让他实时计算变量值并更新。这个修饰符里也可以包裹很多其他东西比如if语句,就会实时判断。这个里边的更新只会在这个变量被更改或赋值的时候执行,但是数组操作并不是赋值所以不会触发,所以需要赋值给他自己。

Props

components之间传值

首先在需要接收输入的组件里把变量设置为export let x

然后在另一个组件里用<Nested x={42} />.

也可以在定义变量的时候设置默认值。

Logic

If/Else

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script>
let count = 0;

function increment() {
count += 1;
}
</script>

<button on:click={increment}>
Clicked {count}
{count === 1 ? 'time' : 'times'}
</button>

{#if count > 10}
<p>{count} is greater than 10</p>
{:else}
<p>{count}</p>
{/if}

Each

可以遍历数组并且循环添加元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script>
const colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet'];
let selected = colors[0];
</script>

<h1 style="color: {selected}">Pick a colour</h1>

<div>
{#each colors as color}
<button
aria-current={selected === color}
aria-label=color
style="background: {color}"
on:click={() => selected = color}
></button>
{/each}

</div>
1
2
3
4
5
6
7
8
9
10
<div>
{#each colors as color, i}
<button
aria-current={selected === color}
aria-label={color}
style="background: {color}"
on:click={() => selected = color}
>{i + 1}</button>
{/each}
</div>

也可以用第二个参数获得当前index