บทเรียน Svelte
ไลบรารี Svelte ของ Lily คือการนำไปใช้ตัวหลัก: runes ของ Svelte 5, props ที่มีชนิดข้อมูล, การกระจาย props ที่เหลือ และการผูกข้อมูลสองทางด้วย
bind:value.
สิ่งที่คุณจะสร้าง
ฟอร์มติดต่อขนาดเล็ก — ช่องกรอกที่มีป้ายกำกับ, ปุ่มส่ง, การผูกข้อมูลสองทาง, พฤติกรรมของแป้นพิมพ์และโปรแกรมอ่านหน้าจอจริง — เริ่มจากแบบไม่ตกแต่งก่อน แล้วค่อยใส่สไตล์ ภายในประมาณ 10 นาที
ก่อนเริ่ม
คุณต้องมี git, Node 22 ขึ้นไป และ pnpm 10 ขึ้นไป โปรเจกต์ Svelte 5 ใดก็ได้ — โปรเจกต์ใหม่ npx sv create ก็เพียงพอ
ขั้นที่ 1 — รับโค้ด
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-headless
pnpm install
pnpm test # vitest — thousands of component cases
pnpm run storybook # browse all 571 components
คอมโพเนนต์อยู่ใน src/lib/components/{Name}/หนึ่งไดเรกทอรีต่อคอมโพเนนต์ พร้อมไฟล์ .svelte การทดสอบ story และเอกสารของมันอยู่เคียงกัน คัดลอกไดเรกทอรีที่ต้องการเข้าแอปของคุณ หรือพึ่งพารีโพแล้วนำเข้าโดยตรง
ขั้นที่ 2 — คอมโพเนนต์แรกของคุณ
<script>
import Button from "#lib/components/Button/Button.svelte";
function save() { console.log("saved"); }
</script>
<Button onclick={save}>Save</Button>
แสดงผล <button class="button" type="button">props มีชนิดข้อมูล: type, disabled,
pressed (แสดงผล aria-pressed (แสดงผล label ( aria-label สำหรับปุ่มสลับ)
ขั้นที่ 3 — ประกอบฟอร์มเล็ก ๆ
<script>
import Form from "#lib/components/Form/Form.svelte";
import Field from "#lib/components/Field/Field.svelte";
import TextInput from "#lib/components/TextInput/TextInput.svelte";
import Button from "#lib/components/Button/Button.svelte";
let name = $state("");
</script>
<Form label="Contact form" onsubmit={handleSubmit}>
<Field label="Full name" required>
<TextInput id="name" label="Full name" bind:value={name} required />
</Field>
<Button type="submit">Save</Button>
</Form>
Field รับ label เป็น prop ของตัวเอง แทนที่จะเป็นคอมโพเนนต์ป้ายกำกับที่ซ้อนอยู่ข้างใน — ส่งเพียงครั้งเดียวที่ Fieldและ TextInputที่ตรงกัน label ให้ชื่อที่เข้าถึงได้ TextInput's value ใช้แทนที่) และแอตทริบิวต์เพิ่มเติมใด ๆ จะกระจายไปที่ราก
$bindable เป็น prop แบบ bind:value rune ดังนั้น
ตรวจสอบเมื่อ 2026-08-29: ให้การผูกข้อมูลสองทางได้ทันที svelte/server ตัวอย่างโค้ดนี้ถูกคอมไพล์ผ่าน <label for> และตรวจสอบว่ามีป้ายกำกับที่เชื่อมถูกต้องเพียงอันเดียว Label ภายใน Field— ร่างก่อนหน้านี้ซ้อน
ป้ายกำกับ สองอัน (อันหนึ่งว่างเปล่า) เพราะ Field แสดงป้ายกำกับของตัวเองอยู่แล้วจาก label แยกต่างหากไว้ข้างใน ซึ่งทำให้แสดงผลได้
เส้นทางฟอร์มติดต่อแบบประกอบ
เป็นรูปแบบเดียวกัน และผ่านการทดสอบ e2e และ axe จริง
ตรวจสอบงานของคุณ: รันแอปแล้วฟอร์มจะดูธรรมดา — ตามที่ตั้งใจ สไตล์ยังรออยู่ข้างหน้า กด Tabโฟกัสจะเลื่อนผ่านทุกตัวควบคุม ป้ายกำกับถูกอ่านออกเสียง และการส่งทำงานได้ พฤติกรรมเสร็จแล้ว ส่วนรูปลักษณ์เป็นของคุณ และเป็นขั้นต่อไป
ขั้นที่ 4 — ใส่สไตล์
ทุกอย่างข้างบนเรนเดอร์เป็นโครงสร้างล้วน พร้อมรับสไตล์ของคุณ ใส่สไตล์ให้ class hook —
.button, .text-input, .label,
.field — ในสไตล์ชีตส่วนกลางของคุณ หรือลิงก์ธีมสำเร็จรูปใน app.html:
<link rel="stylesheet" href="/themes/dark.css" />
การปรับแต่งรายอินสแตนซ์ทำผ่าน class prop ซึ่งต่อท้าย hook พื้นฐาน: <Button class="wide"> แสดงผล
class="button wide".
ขั้นที่ 5 — ดูทุกอย่างทำงาน
แอปตัวอย่าง SvelteKit คือแคตตาล็อกเดียวกันที่ใส่สไตล์ครบ พร้อมเดโมสด การทดสอบ Playwright e2e และเส้นฐานการเข้าถึง axe-core:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-sveltekit-examples
pnpm install && pnpm run dev
ขั้นต่อไป
- การกำหนดธีม — การสลับขณะรันไทม์ด้วยตัวช่วย theme-picker ของ Svelte
- ตัวช่วยการตั้งค่า — ภาษาและขนาดตัวอักษร
- แคตตาล็อกคอมโพเนนต์ — props, ARIA และแป้นพิมพ์ของแต่ละคอมโพเนนต์
มีคำถามระหว่างทางไหม? หน้าช่วยเหลือ เต็มไปด้วยคำตอบ — และถ้าขั้นตอนไหนทำให้ชัดเจนกว่านี้ได้ บอกเรา แล้วเรายินดีปรับปรุงบทเรียน