Tutorial sa Vue
Mga single-file component ng Vue 3 na may typed na prop, defineModel
two-way binding, at v-bind="$attrs" pass-through.
Ang bubuuin mo
Isang maliit na contact form — input na may label, submit button, v-model
binding, tunay na gawi ng keyboard at screen reader — una ay hubad, pagkatapos ay may istilo, sa humigit-kumulang 10 minuto.
Bago ka magsimula
Kailangan mo ng git, Node 22 o mas bago, at pnpm 10 o mas bago. Gumagana ang anumang proyektong Vue 3 — Nuxt, Vite, o payak na Vue.
Hakbang 1 — Kunin ang code
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-vue-headless
pnpm install
pnpm test # vitest + @testing-library/vue
pnpm run storybook # browse all 571 components
Ang mga component ay mga flat na file sa components/ —
Button.vue, TextInput.vue — bawat isa ay may test, story, at mga dokumento sa tabi nito. Kopyahin ang mga file na kailangan mo, o i-vendor ang repo.
Hakbang 2 — Ang una mong component
<script setup>
import Button from "lily-design-system-vue-headless/components/Button.vue";
</script>
<template>
<Button @click="save">Save</Button>
</template>
Nagre-render ng <button class="button" type="button">. Tumutugma ang mga prop sa ibang framework: type, disabled,
pressed, label, kasama ang attribute fall-through para sa lahat ng iba pa.
Hakbang 3 — Bumuo ng maliit na form
<script setup>
import { ref } from "vue";
import Form from ".../components/Form.vue";
import Field from ".../components/Field.vue";
import TextInput from ".../components/TextInput.vue";
import Button from ".../components/Button.vue";
const name = ref("");
</script>
<template>
<Form @submit="handleSubmit">
<Field label="Full name" required>
<TextInput id="name" label="Full name" v-model="name" required />
</Field>
<Button type="submit">Save</Button>
</Form>
</template>
Field ay kumukuha ng nakikitang label bilang sarili nitong prop sa halip na nested na label component — ipasa ito nang isang beses, sa
Field, at TextInputsa
label ay nagbibigay ng accessible na pangalan.
Napatunayan noong 2026-08-29: nag-nest ang naunang draft ng hiwalay na Label sa loob ng Field, na nagre-render ng
dalawang label (isang walang laman) dahil Field ay nagre-render na ng sarili nito mula sa label prop — nahuli sa pamamagitan ng pag-compile ng eksaktong snippet. Ang
composed na ruta ng contact-form
ay parehong pattern, sinubukan ng tunay na e2e at axe na pagsusuri.
TextInput ay gumagamit ng defineModel, kaya ang payak na
v-model ay gumagana agad.
Suriin ang gawa mo: patakbuhin ang app at mukhang payak ang form — eksakto ayon sa layunin: ang istilo ay nasa unahan pa. Pindutin ang Tab: gumagalaw ang focus sa bawat kontrol, naba-balita ang label, at gumagana ang pagsumite. Tapos na ang gawi; sa iyo ang hitsura at iyon ang susunod.
Hakbang 4 — Bigyan ng istilo
Bigyan ng istilo ang mga class hook — .button, .text-input,
.label, .field — sa iyong stylesheet, o mag-link ng handa nang tema sa index.html / nuxt.config:
<link rel="stylesheet" href="/themes/nord.css" />
Hakbang 5 — Tingnan ang lahat na gumagana
Ang Nuxt na halimbawang app ay ang buong catalog na may istilo at demo, na may Playwright e2e at axe-core baseline:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-vue-nuxt-examples
pnpm install && pnpm run dev
Mga susunod na hakbang
- Theming — runtime na pagpapalit gamit ang Vue theme-picker helper.
- Mga preference helper — wika at laki ng teksto.
- Catalog ng component — mga prop, ARIA, at keyboard para sa bawat component.
May mga tanong habang nasa daan? Ang pahina ng tulong ay puno ng mga sagot — at kung maaaring maging mas malinaw ang isang hakbang, sabihin sa amin at masaya naming pagbubutihin ang tutorial.