Zum Inhalt springen

Komponenten Grundlagen

Komponenten sind wiederverwendbare, in sich geschlossene UI-Bausteine. Sie kapseln Template, Logik und optional Styles in einer Einheit.

Eine Vue-Anwendung ist typischerweise als Baum von verschachtelten Komponenten organisiert.

App
/ \
Header Main
/ \
Sidebar Content
/ \
Article Article

Vue bietet verschiedene Wege, Komponenten zu definieren:

VarianteBuild-ToolAPI StyleAnwendungsfall
Plain JS + Inline TemplateNeinOptionsEinfache Erweiterungen
Plain JS + Template StringNeinOptionsOhne Build-Setup
SFC + Options APIJaOptionsKlassischer Ansatz
SFC + Composition APIJaCompositionModerner Standard

Ohne Build-Tool kann Vue direkt im Browser verwendet werden:

<div id="app">
<my-counter></my-counter>
</div>
<script type="module">
import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
const MyCounter = {
template: `
<button @click="count++">Count: {{ count }}</button>
`,
data() {
return { count: 0 }
}
}
createApp({
components: { MyCounter }
}).mount('#app')
</script>

Single-File Components mit der klassischen Options API:

MyCounter.vue
<script>
export default {
data() {
return { count: 0 }
},
methods: {
increment() {
this.count++
}
}
}
</script>
<template>
<button @click="increment">Count: {{ count }}</button>
</template>
<style scoped>
button { font-weight: bold; }
</style>

Single-File Components mit der modernen Composition API (empfohlen):

MyCounter.vue
<script setup>
import { ref } from 'vue'
const count = ref(0)
function increment() {
count.value++
}
</script>
<template>
<button @click="increment">Count: {{ count }}</button>
</template>
<style scoped>
button { font-weight: bold; }
</style>

Komponenten müssen registriert werden, bevor sie im Template verwendet werden können.

main.js
import { createApp } from 'vue'
import App from './App.vue'
// Komponenten importieren
import BaseButton from './components/BaseButton.vue'
import BaseCard from './components/BaseCard.vue'
const app = createApp(App)
// Global registrieren
app.component('BaseButton', BaseButton)
app.component('BaseCard', BaseCard)
app.mount('#app')
<script>
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'
export default {
components: {
ComponentA,
ComponentB
}
}
</script>
<template>
<ComponentA />
<ComponentB />
</template>

Mit <script setup> sind importierte Komponenten automatisch verfügbar:

<script setup>
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'
// Keine explizite Registrierung nötig!
</script>
<template>
<ComponentA />
<ComponentB />
</template>
<template>
<MyComponent />
<BaseButton />
</template>
  • Unterscheidbar von nativen HTML-Elementen
  • IDE-Unterstützung besser

Offizielle Vue Dokumentation: