Skip to content

Vue Islands

Progressives Framework mit großartiger Developer Experience und Ökosystem.

Überblick

Bundle-Größe: 34-35kb (Vue Runtime + Compiler)

Vue ist ein voll ausgestattetes Framework mit exzellenter Dokumentation und Tooling.

Grundstruktur

javascript
// islands/counter.js
import { createApp } from 'vue';

const CounterComponent = {
  props: {
    title: {
      type: String,
      default: 'Counter'
    }
  },
  data() {
    return {
      count: 0
    };
  },
  computed: {
    doubled() {
      return this.count * 2;
    }
  },
  methods: {
    increment() {
      this.count++;
    },
    decrement() {
      this.count--;
    }
  },
  template: `
    <div class="p-6 bg-white rounded-lg border">
      <h3 class="text-lg font-semibold mb-4">{{ title }}</h3>
      <p class="mb-2">Count: {{ count }}</p>
      <p class="mb-4 text-gray-600">Doubled: {{ doubled }}</p>
      <div class="flex gap-2">
        <button @click="decrement" class="px-4 py-2 bg-gray-600 text-white rounded">-</button>
        <button @click="increment" class="px-4 py-2 bg-blue-600 text-white rounded">+</button>
      </div>
    </div>
  `
};

export default class CounterIsland {
  constructor(element, props = {}) {
    const initialData = JSON.parse(element.dataset.initialData || '{}');
    this.app = createApp(CounterComponent, { ...initialData, ...props });
    this.app.mount(element);
  }

  destroy() {
    this.app?.unmount();
  }
}

Kernkonzepte

Reactivity - Data

javascript
data() {
  return {
    message: 'Hello',
    count: 0,
    items: []
  };
}

Computed Properties

Automatisch aktualisierte berechnete Werte:

javascript
computed: {
  doubled() {
    return this.count * 2;
  },
  filteredItems() {
    return this.items.filter(i => i.active);
  }
}

Methods

Event-Handler und Funktionen:

javascript
methods: {
  increment() {
    this.count++;
  },
  async loadData() {
    const data = await fetch('/api/data').then(r => r.json());
    this.items = data;
  }
}

Template-Direktiven

html
<!-- Conditional -->
<div v-if="show">Content</div>

<!-- Loop -->
<li v-for="item in items" :key="item.id">{{ item.name }}</li>

<!-- Events -->
<button @click="increment">{{ count }}</button>

<!-- Two-way binding -->
<input v-model="message">

Vorteile

  • Reaktives System - Automatisches UI-Update
  • Template-Syntax - HTML-ähnlich
  • Großes Ökosystem - Vuetify, Quasar, etc.
  • Gute Balance - Features vs. Bundle-Größe

Nachteile

  • Bundle-Größe - 34-35kb (größer als Svelte/Preact)
  • Lernkurve - Vue-spezifische Konzepte

Vollständige Beispiele

Siehe Beispiele mit Islands für vollständige Implementierungen:

Webmate Studio Component Development Dokumentation