اشترك و تابع

تطوير الويب

image

دليل شامل لاستخدام Alpine.js مع Laravel Livewire لإنشاء واجهات ديناميكية خفيفة وسريعة

Alpine.js هو إطار عمل JavaScript خفيف جدًا زي Vue.js، لكنه مصمم عشان يكون بسيط وسهل الاستخدام، وهاد بيخليه مثالي للعمل مع Laravel Livewire.

مميزاته: ✅ خفيف كتير (~10KB فقط). ✅ ما بحتاج بناء أو تثبيت معقد. ✅ بيتعامل مع الـ DOM بسهولة باستخدام السمة x-data. ✅ متكامل مع Livewire بشكل رائع، وهاد بيخليه خيار ممتاز للواجهات الديناميكية.

2. كيف تثبّت Alpine.js؟ فيه طريقتين عشان تضيف Alpine.js لمشروعك:

✅ 1. عبر CDN (الأبسط) أضف هذا الكود داخل <head> في Blade:

<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script> 

✅ 2. عبر npm (للمشاريع المتقدمة)

npm install alpinejs 

وبعدها استورده في ملف JavaScript الرئيسي:

import Alpine from 'alpinejs'; window.Alpine = Alpine; Alpine.start(); 

3. أساسيات Alpine.js ✅ 1. x-data: تخزين البيانات داخل العنصر

تستخدم لتعريف البيانات داخل العنصر HTML، وبتشبه data() في Vue أو public properties في Livewire.

<div x-data="{ message: 'مرحبًا بك في Alpine.js!' }"> <p x-text="message"></p> </div> 

🔹 هنا، يتم استبدال x-text="message" بالنص الموجود داخل message.

✅ 2. x-show: إظهار وإخفاء العناصر

يستخدم لإظهار أو إخفاء العناصر بناءً على شرط.

<div x-data="{ isVisible: false }"> <button @click="isVisible = !isVisible">تبديل الرؤية</button> <p x-show="isVisible">مرحبًا، أنا ظاهر الآن!</p> </div> 

🔹 عند الضغط على الزر، سيتغير isVisible مما يجعل النص يظهر أو يختفي.

✅ 3. x-if: إنشاء وإزالة العناصر من الـ DOM

<div x-data="{ show: false }"> <button @click="show = !show">تبديل العنصر</button> <template x-if="show"> <p>تم إنشاء العنصر!</p> </template> </div> 

🔹 يختلف عن x-show لأنه بيشيل العنصر من الـ DOM تمامًا عند إخفائه.

✅ 4. x-bind: ربط القيم بالخصائص

<div x-data="{ color: 'red' }"> <p :style="{ color: color }">هذا نص ملون!</p> </div> 

🔹 يستخدم x-bind أو : لتغيير القيم بناءً على البيانات.

✅ 5. x-on: التعامل مع الأحداث

<div x-data="{ count: 0 }"> <button @click="count++">زيادة</button> <p>القيمة الحالية: <span x-text="count"></span></p> </div> 

🔹 يمكن استخدام @click بدلاً من x-on:click.

✅ 6. x-model: ربط البيانات مع الإدخال

<div x-data="{ name: '' }"> <input type="text" x-model="name"> <p>اسمك هو: <span x-text="name"></span></p> </div> 

🔹 يعمل زي wire:model في Livewire وبيحدّث البيانات تلقائيًا.

✅ 7. x-transition: إضافة تأثيرات انتقالية

<div x-data="{ show: false }"> <button @click="show = !show">إظهار / إخفاء</button> <p x-show="show" x-transition>أنا أتحرك بسلاسة!</p> </div> 

🔹 يضيف تأثيرات عند الإظهار والإخفاء.

4. التكامل بين Alpine.js و Livewire ✅ استخدام wire:ignore لمنع التحديثات التلقائية

عند استخدام CKEditor أو Tom Select، قد يقوم Livewire بإعادة تحميل العناصر، مما يؤدي إلى فقدان البيانات. الحل هو استخدام wire:ignore:

<div wire:ignore> <input type="text" x-data x-model="text"> </div> 

✅ إرسال الأحداث من Alpine إلى Livewire باستخدام $wire

<div x-data> <button @click="$wire.call('saveData')">احفظ البيانات</button> </div> 

🔹 يستدعي هذا دالة saveData داخل مكون Livewire.

✅ استخدام Alpine.store لتخزين القيم بين المكونات

Alpine.store('cart', { items: [], addItem(item) { this.items.push(item) } }); 

ثم يمكن استخدامه داخل HTML:

<button @click="$store.cart.addItem('منتج جديد')">إضافة إلى السلة</button> <p>عدد المنتجات في السلة: <span x-text="$store.cart.items.length"></span></p> 

5. سيناريو عملي: نموذج إضافة منتج في المزاد ✅ المتطلبات:

استخدام Alpine.js لعرض وإخفاء النموذج.

استخدام Livewire لإرسال البيانات إلى السيرفر.

✅ الكود:

<div x-data="{ open: false }"> <button @click="open = true">إضافة منتج</button> <div x-show="open" @click.away="open = false"> <form wire:submit.prevent="saveProduct"> <input type="text" wire:model="productName" placeholder="اسم المنتج"> <button type="submit">إرسال</button> </form> </div> </div> 

✅ كود Livewire:

class AddProduct extends Component { public $productName; public function saveProduct() { Product::create(['name' => $this->productName]); $this->reset('productName'); } public function render() { return view('livewire.add-product'); } } 


6. مقارنة Alpine.js مع Vue.js و jQuery

7. متى تستخدم Alpine.js مع Livewire؟ ✅ إذا كنت بحاجة لتحسين التفاعل السريع في الواجهة بدون الحاجة إلى Vue أو React.

✅ إذا كنت بدك تخلي التطبيق خفيف وسريع بدون تحميل مكتبات ضخمة.

✅ إذا كنت تستخدم Livewire وبدك تضيف لمسات ديناميكية بدون تعقيد.

🔥 خلاصة Alpine.js مع Livewire 🔥 🔹 Alpine.js مثالي للإضافات التفاعلية البسيطة مع Livewire.

🔹 يقلل الحاجة إلى Vue.js أو jQuery، مما يبسط المشروع.

🔹 يدمج بسهولة مع Livewire دون مشاكل في الأداء.

🔹 أفضل حل للمشاريع الصغيرة والمتوسطة التي تحتاج إلى واجهة ديناميكية.