<h3><a name="vpoll-auto-polling" href="#vpoll-auto-polling"></a>v-poll: Otomatik Anket</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code><p>
Son güncelleme: @{{ lastUpdated }}

<p>Tarayıcı sekmesi ön planda değilken otomatik olarak duraklatılır.</p>

<h3><a name="vintersect-viewport-trigger-infinite-scroll" href="#vintersect-viewport-trigger-infinite-scroll"></a>v-intersect: Görüntüleme Tetikleyici (Sonsuz Kaydırma)</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code><p>
<span v-loading="">Daha fazla yükleniyor...</span>

<p>Diğer direktifler arasında <code>v-navigate</code> (SPA navigasyonu), <code>v-dirty</code> (kaydedilmemiş değişiklik uyarısı), <code>v-offline</code> (çevrimdışı durumu), <code>v-sort</code> (sürükle-bırak sıralama) ve <code>v-transition</code> (Görünüm Geçişleri API'si) yer alır.</p>

<h2><a name="three-component-formats" href="#three-component-formats"></a>Üç Bileşen Formatı</h2>

<h3><a name="classbased-default" href="#classbased-default"></a> Sınıf Tabanlı (Varsayılan)</h3>

<p>Yukarıdaki Sayaç örneği: ayrı PHP sınıfı + Blade şablonu.</p>

<h3><a name="single-file-component" href="#single-file-component"></a>Tek Dosya Bileşeni</h3>

<p>PHP mantığı ve şablon aynı <code>.blade.php</code> dosyasında:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code><?php use LiVue\Component;

new class extends Component {
public int $count = 0;

public function increment(): void
{
    $this->count++;
}

};
?>

@{{ count }}

<p>Basit bileşenler için en iyi şekilde kullanılır. <code>php artisan make:livue MyComponent --single</code> ile oluşturun.</p>

<h3><a name="multi-file-component" href="#multi-file-component"></a>Çoklu Dosya Bileşeni</h3>

<p>Ayrı PHP, Blade, JS ve CSS dosyalarından oluşan bir klasör:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>resources/views/livue/my-widget/

├── my-widget.php # anonim sınıf
├── my-widget.blade.php # şablon
├── my-widget.js # Vue Composition API (isteğe bağlı)
└── my-widget.css # otomatik kapsamlı (isteğe bağlı)

<p>CSS, <code>data-livue-scope-{name}</code> niteliğini kullanarak otomatik olarak kapsamlanır. Müşteri tarafı JS mantığı gerektiren karmaşık bileşenler için en iyisidir.</p>

<h2><a name="page-components-fullpage-routing" href="#page-components-fullpage-routing"></a>Sayfa Bileşenleri: Tam Sayfa Yönlendirme</h2>

<p>LiVue bileşenleri, yönlendirme denetleyicisi olarak hizmet verebilir:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>// routes/web.php

LiVue::route(‘/dashboard’, App\LiVue\Dashboard::class)
->name(‘dashboard’)
->middleware(‘auth’);

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>#[Layout('layouts.admin')]

[Title(‘Dashboard’)]

class Dashboard extends Component
{
protected function head(): array
{
return [
‘description’ => ‘Yönetici dashboard’,
‘og:title’ => ‘Dashboard’,
];
}
}

<p><code>description</code>, <code>robots</code>, <code>og:*</code>, <code>twitter:*</code>, <code>canonical</code>, <code>json-ld</code> ve diğer SEO ile ilgili etiketleri destekler.</p>

<h2><a name="lifecycle-hooks" href="#lifecycle-hooks"></a>Yaşam Döngüsü Kancaları</h2>

<div class="table-wrapper-paragraph">
    <table>
        <thead>
            <tr>
                <th>Kanca</th>
                <th>Zamansal Konum</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><code>boot()</code></td>
                <td>Her istekte (ilk + AJAX)</td>
            </tr>
            <tr>
                <td><code>mount(...$params)</code></td>
                <td>İlk render, props alır</td>
            </tr>
            <tr>
                <td><code>hydrate()</code></td>
                <td>AJAX isteği, durum geri yüklemeden sonra</td>
            </tr>
            <tr>
                <td><code>dehydrate()</code></td>
                <td>Durum serileştirilmeden önce</td>
            </tr>
            <tr>
                <td><code>updating($key, $value)</code></td>
                <td>Özellik güncellemelerinden önce, değeri değiştirebilir</td>
            </tr>
            <tr>
                <td><code>updated($key, $value)</code></td>
                <td>Özellik güncellemelerinden sonra</td>
            </tr>
        </tbody>
    </table>
</div>

<p>Ayrıca özel özellik versiyonları da mevcuttur, örneğin <code>updatingEmail()</code>, <code>updatedEmail()</code> gibi.<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>public function mount(User $user): void

{
$this->name = $user->name;
$this->email = $user->email;
}

public function updatingEmail(string $value): string
{
return strtolower(trim($value)); // Otomatik küçük harfe çevirme ve boşlukları temizleme
}

<h2><a name="php-attributes-overview" href="#php-attributes-overview"></a>PHP Özelliklerine Genel Bakış</h2>

<p>LiVue, yapılandırma için PHP 8 Özelliklerini yoğun bir şekilde kullanır:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>// Özellik

[Validate(‘required|min:3’)] // Laravel doğrulama kuralları

[Url(as: ‘q’, history: true)] // URL sorgu dizisine senkronize et

[Session(key: ‘prefs’)] // Sayfalar arasında kalıcı hale getirin

[Guarded] // Şifrelenmiş, JS’ye görünmez

[Reactive] // Ebeveyn yeniden render edildikçe otomatik güncelleme

// Yöntem

[Computed] // Hesaplanan sonuçları önbelleğe al

[Confirm(‘Are you sure?’)] // Onay iletişim kutusu göster

[Renderless] // HTML yeniden render’lamayı atla

[On(‘event-name’)] // Olay dinleyici

// Sınıf

[Island] // İzole edilmiş Vue uygulaması örneği

[Lazy] // Görüntü alanına girince yükle

[TabSync] // Sekmeler arasında durumu senkronize et

<p><code>#[Url]</code> özelliği özellikle yararlıdır; arama sayfası sorguları, URL çubuğuna yansıtılır, böylece kullanıcılar arama sonuçları URL'lerini doğrudan paylaşabilir.</p>

<p><code>#[Lazy]</code> ve <code>placeholder()</code> birleştirildiğinde iskelet yükleme sağlar:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>#[Lazy]

class HeavyChart extends Component
{
public function placeholder(): string
{
return ‘livue.chart-skeleton’;
}

public function mount(): void
{
    $this->data = DB::table('analytics')->get()->toArray();
}

}

<h2><a name="vue-ecosystem-integration" href="#vue-ecosystem-integration"></a>Vue Ekosistem Entegrasyonu</h2>

<p>LiVue'nın Livewire'a göre en büyük avantajı budur. Alt yapıda Vue 3 çalıştığı için, Vue eklentilerini doğrudan kullanabilirsiniz:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight javascript"><code>import LiVue from 'livue';

import { createVuetify } from ‘vuetify’;

const vuetify = createVuetify({
theme: { defaultTheme: ‘dark’ }
});

LiVue.setup((app) => {
app.use(vuetify);
app.component(‘MyButton’, MyButton);
app.directive(‘focus’, {
mounted(el) { el.focus(); }
});
});

LiVue.start();

<p>Pinia bulunur — yalnızca <code>import { defineStore } from 'pinia'</code> ile başlayın.</p>

<p>Client-side mantık için Blade şablonlarında <code>@script</code> kullanın:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>@script

import { useCartStore } from ‘./stores/cart’;
const cart = useCartStore();
livue.watch(‘count’, (val) => console.log(‘count değişti:’, val));
@endscript

<h2><a name="streaming-realtime-ai-output" href="#streaming-realtime-ai-output"></a>Streaming: Gerçek Zamanlı AI Çıkışı</h2>

<p>LiVue, NDJSON formatında yerleşik akış desteği sunar. Bu, LLM API'leriyle entegre etmek için kullanışlıdır:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>class AiChat extends Component

{
use WithStreaming;

public function ask(string $question): void
{
    foreach ($stream as $chunk) {
        $this->stream(to: 'output', content: $chunk);
    }
}

}

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code><p>Cevap bekleniyor...</p>


<h2><a name="realtime-communication-laravel-echo-integration" href="#realtime-communication-laravel-echo-integration"></a>Gerçek Zamanlı İletişim: Laravel Echo Entegrasyonu</h2>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code>#[On('echo:orders,OrderCreated')]

public function handleNewOrder($event)
{
$this->orders[] = $event;
}

[On(‘echo-private:user.123,ProfileUpdated’)]

public function handleProfileUpdate($event)
{
$this->profile = $event[‘profile’];
}

<p>Halka açık, özel ve varlık kanallarını destekler.</p>

<h2><a name="comparison-with-livewire-and-inertia" href="#comparison-with-livewire-and-inertia"></a>Livewire ve Inertia ile Karşılaştırma</h2>

<div class="table-wrapper-paragraph">
    <table>
        <thead>
            <tr>
                <th></th>
                <th>LiVue</th>
                <th>Livewire</th>
                <th>Inertia.js</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Frontend</td>
                <td>Vue 3</td>
                <td>Alpine.js</td>
                <td>Vue/React/Svelte</td>
            </tr>
            <tr>
                <td>Şablonlar</td>
                <td>Blade + Vue direktifleri</td>
                <td>Blade + Alpine</td>
                <td>Bağımsız .vue dosyaları</td>
            </tr>
            <tr>
                <td>API Gerekir mi</td>
                <td>Hayır</td>
                <td>Hayır</td>
                <td>Hayır</td>
            </tr>
            <tr>
                <td>Vue Ekosistemi</td>
                <td>Tam destek</td>
                <td>Hayır</td>
                <td>Tam destek</td>
            </tr>
            <tr>
                <td>Durum Yönetimi</td>
                <td>Sunucu destekli</td>
                <td>Sunucu destekli</td>
                <td>Müşteri tarafında</td>
            </tr>
            <tr>
                <td>Streaming</td>
                <td>Yerleşik</td>
                <td>Hayır</td>
                <td>Hayır</td>
            </tr>
            <tr>
                <td>Adalar Mimarisi</td>
                <td>Destekleniyor</td>
                <td>Hayır</td>
                <td>Hayır</td>
            </tr>
            <tr>
                <td>Sekme Senkronizasyonu</td>
                <td>Yerleşik</td>
                <td>Hayır</td>
                <td>Hayır</td>
            </tr>
            <tr>
                <td>Olgunluk</td>
                <td>Yeni proje</td>
                <td>Olgun</td>
                <td>Olgun</td>
            </tr>
        </tbody>
    </table>
</div>

<p>Öneriler:</p>
<ul>
    <li>Vue ekosistemini kullanıyorsanız (Vuetify, Element Plus vb.) ancak tam frontend/backend ayrımına ihtiyaç duymuyorsanız → <strong>LiVue</strong></li>
    <li>Vue'ya ihtiyaç duymuyorsanız, en basit reaktif UI'ya ihtiyacınız varsa → <strong>Livewire</strong></li>
    <li>Frontend ekibi bağımsız olarak çalışıyor, tam SPA kontrolüne ihtiyaç duyuyorsa → <strong>Inertia.js</strong></li>
</ul>

<p>LiVue şu anda v1.4.8 sürümünde ve hala erken aşama bir yazılımdır. Yeni projelerde denemeye değer, ancak üretim için taahhütte bulunmadan önce olgunluğu dikkate alın.</p>

Kaynak: Orijinal Makale

Bu Makaleyi Paylaş