Orbito - Dokumentacja modułówOrbito - Dokumentacja modułów
Wprowadzenie
Pierwsze kroki
API
Komunikacja
Widoki
Wdrożenie
Społeczność
For AI agents
Wprowadzenie
Pierwsze kroki
API
Komunikacja
Widoki
Wdrożenie
Społeczność
For AI agents
  • OrbitoViewEngine

    • Wprowadzenie
    • BaseView – Klasa bazowa
    • Zmienne (VarStore)
    • Listy i notacja .$
    • Szablony Handlebars
    • Akcje (ActionHandler)
    • Tabele danych
    • Edycja danych
    • Kontrolki wartości
    • Warianty stylistyczne
    • Komponenty i sloty
    • Pliki, kamera i schemat z serwera
  • Widoki

    • AvatarView
    • BadgeView
    • ButtonView
    • CameraView
    • CardView
    • CheckboxGroupView
    • CheckboxView
    • ComponentView
    • CssBoxView
    • DataTableView
    • DropdownView
    • DynamicListView
    • DynamicView
    • FilePickerView
    • FilePreviewView
    • FlexView
    • GridView
    • HtmlView
    • InlineEditView
    • InputView
    • ListView
    • ModalView
    • PopoverView
    • RadioGroupView
    • RowView
    • SelectView
    • SliderView
    • SlotView
    • StepperView
    • TabsView
    • TextInputView
    • TextView

Komponenty i sloty

Źródło: ComponentRegistry.js, ComponentView.js, SlotView.js

Komponent to nazwany, reużywalny fragment schematu z parametrami (props) i opcjonalnymi slotami. Zamiast kopiować ten sam układ w kilkunastu miejscach, opisujesz go raz i tworzysz instancje widokiem type: component.

Rejestracja

Komponenty deklaruje się w sekcji components na najwyższym poziomie schematu strony — obok głównego type. Definicja przyjmuje:

PoleZnaczenie
propsNazwy parametrów i ich wartości domyślne
templateSchemat widoku (wymagany, musi mieć type)
actionDefinitionsNazwane akcje komponentu dla action: run; przesłaniają akcje o tej samej nazwie ze strony
components:
  infoRow:
    props:
      label: ""
      value: ""
    template:
      type: flex
      direction: column
      childs:
        - type: text
          content: "{{ $props.label }}"
          className: text-muted small text-uppercase
        - type: text
          content: "{{ $props.value }}"
type: card
title: Zamówienie
content:
  - type: component
    component: infoRow
    props:
      label: Klient
      value: "{{ order001.customer.name }}"

To samo da się zrobić z kodu:

import { registerComponents } from '@/viewengine';

registerComponents({ infoRow: { props: { label: '', value: '' }, template: { type: 'text' } } });

Instancja

PoleZnaczenie
type"component"
componentNazwa zarejestrowanego komponentu (wymagana, chyba że podano definition)
props [template]Wartości parametrów; niepodane biorą wartości domyślne z definicji
definitionDefinicja inline { props, template } — dla lokalnych, jednorazowych komponentów
childsZawartość slotu domyślnego
slotsMapa { nazwaSlotu: [schematy widoków] } dla slotów nazwanych

Wartości propsów są parsowane w miejscu użycia, więc widzą notację .$ oraz zmienne $page / $global — a wyrażenie {{ $props.x }} w propsach odnosi się do propsów komponentu nadrzędnego, nie tego właśnie tworzonego.

Odczyt propsów

Wewnątrz template propsy dostępne są pod kluczem $props:

  • w szablonach Handlebars — {{ $props.label }} (we wszystkich polach [template] oraz w warunkach renderIf),
  • jako ścieżka danych — varPath: "$props.items" w widoku listvar,
  • jako typowana referencja w akcjach — valueFrom: $props.id (zachowuje typ wartości).
components:
  tagList:
    props:
      items: []
    template:
      type: listvar
      varPath: "$props.items"
      template:
        type: badge
        label: "{{ $props.items.$ }}"

Sloty

Widok { type: slot } w szablonie komponentu wyznacza miejsce, w które trafi zawartość z instancji: childs (slot domyślny) albo slots.<nazwa> (slot nazwany). Gdy instancja nic nie przekazała, renderowana jest tablica fallback.

components:
  panel:
    props:
      title: ""
    template:
      type: card
      title: "{{ $props.title }}"
      content:
        - type: slot           # tu trafi `childs` instancji
        - type: slot
          name: footer         # tu trafi `slots.footer` instancji
          fallback:
            - type: text
              content: Brak stopki
type: component
component: panel
props:
  title: Podsumowanie
childs:
  - type: text
    content: Treść panelu
slots:
  footer:
    - type: button
      label: Zapisz

Zawartość slotu jest ewaluowana w kontekście miejsca użycia (tak jak sloty w Vue), więc {{ $props.x }} w slocie odnosi się do propsów komponentu nadrzędnego, a nie tego, w którym slot się znajduje.

Zasięg rejestru

Rejestr komponentów jest wspólny dla całej strony. Ponowna rejestracja pod tą samą nazwą nadpisuje definicję (z ostrzeżeniem w konsoli), a unregisterComponents() czyści rejestr, żeby komponenty poprzedniej strony nie wyciekały do następnej.

Stąd wynika ograniczenie zdalnych schematów: schemat pobrany przez schemaFrom nie może rejestrować komponentów, bo podmieniłby definicję używaną gdzie indziej na stronie — patrz Pliki, kamera i schemat z serwera.

Kiedy komponent, a kiedy widok natywny

  • Komponent — gdy ten sam układ istniejących widoków powtarza się w schemacie: wiersz etykieta/wartość, kafelek statusu, panel z nagłówkiem i stopką. Nie wymaga kodu JS ani przebudowy aplikacji.
  • Widok natywny — gdy potrzebne jest nowe zachowanie: własna obsługa zdarzeń DOM, integracja z biblioteką, praca na strumieniu albo kontrakt kontrolki wartości (patrz Kontrolki wartości). Komponent tylko składa to, co silnik już potrafi.

Powiązane: Szablony Handlebars · Dostępne Akcje (ActionHandler) · ComponentView · SlotView

Ostatnio zaktualizowano:: 25.08.2026, 12:56
Contributors: Wiktor Koźmiński
Prev
Warianty stylistyczne
Next
Pliki, kamera i schemat z serwera