Vue.js Composition API: Wie man expose in <script setup> richtig einsetzt

In der modernen Vue.js-Entwicklung spielt die Composition API eine zentrale Rolle bei der Strukturierung von Komponenten. Mit dem <script setup>-Syntax wird die Entwicklung noch eleganter und übersichtlicher. Doch wie funktioniert expose in dieser Umgebung? Und wozu braucht man es eigentlich?

Was ist expose in Vue.js?

Die Funktion expose ermöglicht es, bestimmte Eigenschaften oder Methoden aus einer Komponente für externe Zugriffe freizugeben – zum Beispiel von Elternkomponenten über $refs. Standardmäßig sind alle öffentlichen Daten und Methoden in der Composition API bereits verfügbar, aber expose erlaubt präzise Kontrolle darüber, was genau freigegeben werden soll.

Grundlegende Verwendung mit <script setup>

In einer Komponente mit <script setup> sieht die Verwendung von expose folgendermaßen aus:

<template>
  <div class="my-component">
    <p>{{ internalMessage }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';

// Interne Daten, die nicht außerhalb der Komponente verfügbar sein sollen
const internalMessage = ref('Dies ist eine interne Nachricht');
const count = ref(0);

// Öffentliche Methoden, die von außen aufgerufen werden können
function increment() {
  count.value++;
}

function getCounter() {
  return count.value;
}

// Mit expose werden nur diese Methoden freigegeben
expose({
  increment,
  getCounter
});
</script>

Praktisches Beispiel: Ein Modal-Komponent mit expose

Stellen Sie sich eine wiederverwendbare Modal-Komponente vor, die von einer Elternkomponente geöffnet werden soll:

<!-- Modal.vue -->
<template>
  <q-dialog v-model="isVisible" @hide="onHide">
    <q-card class="modal-card">
      <q-card-section>
        <div class="text-h6">{{ title }}</div>
      </q-card-section>
      <q-card-section>
        {{ message }}
      </q-card-section>
      <q-card-actions align="right">
        <q-btn 
          label="Schließen" 
          color="primary" 
          @click="closeModal"
        />
      </q-card-actions>
    </q-card>
  </q-dialog>
</template>

<script setup>
import { ref } from 'vue';

const isVisible = ref(false);
const title = ref('');
const message = ref('');

// Öffentliche Methoden für externe Nutzung
function openModal(newTitle, newMessage) {
  title.value = newTitle;
  message.value = newMessage;
  isVisible.value = true;
}

function closeModal() {
  isVisible.value = false;
}

// Nur diese Methoden werden freigegeben
expose({
  openModal,
  closeModal
});

function onHide() {
  // Event-Handler für das Schließen des Modals
}
</script>

Nutzung in der Elternkomponente

Die Elternkomponente kann nun über $refs auf die veröffentlichten Methoden zugreifen:

<template>
  <div class="parent">
    <q-btn 
      label="Modal öffnen" 
      color="primary" 
      @click="openModal"
    />

    <Modal ref="modalRef" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import Modal from './Modal.vue';

const modalRef = ref(null);

function openModal() {
  // Aufruf der veröffentlichten Methode
  if (modalRef.value) {
    modalRef.value.openModal('Neue Nachricht', 'Dies ist eine dynamische Meldung');
  }
}
</script>

Wann sollte man expose verwenden?

1. Zugriff auf interne Zustände

Wenn Sie Komponenten erstellen, die von außen gesteuert werden sollen, aber den internen Zustand nicht vollständig preisgeben wollen.

2. Wiederverwendbare Komponenten

Bei der Erstellung von Bibliothekskomponenten oder Design-Systemen ist es sinnvoll, nur die notwendigen Schnittstellen freizugeben.

3. Komplexere Interaktionen

Wenn Sie Komponenten mit komplexen Zustandsmanagement benötigen, die über einfache Props nicht ausreichend gesteuert werden können.

Best Practices und Tipps

1. Klar definierte Schnittstellen

Verwenden Sie expose nur für Methoden und Eigenschaften, die wirklich benötigt werden:

<script setup>
// Verboten - alles freigeben
expose({
  method1,
  method2,
  data1,
  data2
});

// Empfohlen - nur notwendige Elemente
expose({
  publicMethod,
  getData
});
</script>

2. Konsistente Namensgebung

Verwenden Sie klare, beschreibende Namen für die freigegebenen Methoden:

<script setup>
function startProcess() { /* ... */ }
function stopProcess() { /* ... */ }

// Klare Benennung der freigegebenen Funktionen
expose({
  startProcess,
  stopProcess
});
</script>

3. Kombination mit Pinia

In Kombination mit Pinia können Sie expose nutzen, um spezifische Zustandsoperationen freizugeben:

<script setup>
import { useMyStore } from '../stores/myStore';
import { ref } from 'vue';

const store = useMyStore();
const localData = ref('');

function updateStoreData(value) {
  store.updateData(value);
  localData.value = value;
}

expose({
  updateStoreData
});
</script>

Fazit

Die expose-Funktion in der Vue.js Composition API mit <script setup> ist ein mächtiges Werkzeug zur Kontrolle von Komponenten-APIs. Sie ermöglicht es Ihnen, den internen Zustand zu schützen, gleichzeitig aber notwendige Schnittstellen für externe Interaktionen freizugeben.

Durch die Kombination mit Quasar-Komponenten und Pinia können Sie komplexe, wiederverwendbare Komponenten erstellen, die sowohl flexibel als auch sicher sind. Die präzise Kontrolle über öffentliche APIs trägt dazu bei, Ihre Anwendung wartbarer und skalierbarer zu machen.

Verwenden Sie expose sinnvoll – nicht als Standardlösung für alle Fälle, sondern als gezieltes Werkzeug für spezifische Use-Cases, um die Qualität Ihres Vue.js-Code zu verbessern.