Tutorial Vue

Componente într-un singur fișier Vue 3 cu props tipizate, defineModel legare bidirecțională și transmitere v-bind="$attrs" .

Ce vei construi

Un mic formular de contact — câmp cu etichetă, buton de trimitere, v-model legare, comportament real al tastaturii și al cititorului de ecran — mai întâi simplu, apoi stilizat, în aproximativ 10 minute.

Înainte să începi

Ai nevoie de git, Node 22 sau mai nou și pnpm 10 sau mai nou. Orice proiect Vue 3 merge — Nuxt, Vite sau Vue simplu.

Pasul 1 — Obține codul

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

Componentele sunt fișiere plate în components/ — Button.vue, TextInput.vue — fiecare cu testul, story-ul și documentația alături. Copiază fișierele de care ai nevoie sau adu depozitul.

Pasul 2 — Prima ta componentă

<script setup>
import Button from "lily-design-system-vue-headless/components/Button.vue";
</script>

<template>
  <Button @click="save">Save</Button>
</template>

Randează <button class="button" type="button">. Props corespund celorlalte frameworkuri: type, disabled, pressed, label, plus transmiterea atributelor pentru orice altceva.

Pasul 3 — Compune un formular mic

<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 primește label ca propriul prop, în loc de o componentă etichetă imbricată — transmite-o o singură dată, pe Fieldși TextInputcorespunzător din label oferă numele accesibil.

Verificat la 2026-08-29: o ciornă anterioară imbrica o componentă Label în interiorul Field, ceea ce randa două etichete (una goală) deoarece Field randează deja propria etichetă din intrarea label prop — descoperit compilând fragmentul exact. Ruta Ruta compusă a formularului de contact este același tipar, exersat cu teste e2e și axe reale.

TextInput folosește defineModel, deci un simplu v-model funcționează din prima.

Verifică-ți munca: rulează aplicația și formularul arată simplu — exact cum era intenționat: stilizarea urmează. Apasă Tab: focalizarea trece prin fiecare control, eticheta este anunțată, iar trimiterea funcționează. Comportamentul este gata; aspectul este al tău și urmează.

Pasul 4 — Stilizează-l

Stilizează cârligele de clasă — .button, .text-input, .label, .field — în foaia ta de stil sau leagă o temă gata făcută în index.html / nuxt.config:

<link rel="stylesheet" href="/themes/nord.css" />

Pasul 5 — Vezi totul funcționând

Aplicația-exemplu Nuxt este catalogul complet stilizat și demonstrat, cu Playwright e2e și o linie de bază axe-core:

git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-vue-nuxt-examples
pnpm install && pnpm run dev

Pașii următori

Întrebări pe parcurs? Pagina de ajutor este plină de răspunsuri — iar dacă un pas poate fi mai clar, spune-ne și vom îmbunătăți cu plăcere tutorialul.