توجيه مكونات الويب

في بعض الأحيان يبدو أن مكونات الويب لا تصل إلى الإطار ، خاصة عند مقارنتها بالممثلين الأكثر شعبية. لكن الكثير من الأشياء الأكثر إلحاحًا التي لا يحجبها تنفيذ المعايير المدرجة في مفهوم مكونات الويب أمر سهل بما يكفي للربط باستخدام المكتبات أو كمية صغيرة من رمزها الأنيق. إحدى هذه الميزات هي توجيه الواجهة الأمامية. الميزة ليست ضرورية دائمًا ، وربما حتى مثيرة للجدل ، ولكنها موجودة في معظم الأطر وتستخدم من قبل الكثيرين. ماذا عن مكونات الويب؟ وسنحاول تنفيذ التوجيه باستخدام مكتبة navigo.

لجعل أوامر وحدة التحكم تعمل بشكل أفضل على Windows ، يمكنك تثبيت أدوات Unix من توزيع git لهذا النظام ، أو ، على ما يبدو ، استخدام الميزات الجديدة لـ WSL والمحطات الطرفية.

أولاً ، أنشئ مشروعًا:

mkdir testnavigo
cd testnavigo
npm init

وفي كثير من الأحيان نضغط على Enter حتى يتم تحريرها

ثم نضع المكتبة

npm i navigo --save

قم بإنشاء index.html

وقم بتوصيل المكتبة فيه وتحديد الفئة الرئيسية للتطبيق ؛ هنا سوف يلخص منطق التوجيه وإدارة جميع المكونات الفرعية.

أعطتنا مكونات الويب الفرصة لاستدعاء الخطاف تلقائيًا عندما يظهر عنصر في الشجرة التي تم تعيين فصلنا لها في شجرة كائنات المستعرض. في ذلك ، نقوم بتهيئة مكتبة التوجيه برمز مباشرة من المثال من github للمكتبة (في الحياة الواقعية ، يجب أن يتم ذلك بشكل أكثر جمالا مع التحميل المعياري).

<script src="/node_modules/navigo/lib/navigo.min.js"></script>

<my-app></my-app>

<script type="module">

   class MyApp extends HTMLElement {

       connectedCallback() {
           let root = null;
           let useHash = true; // Defaults to: false
           let hash = '#!'; // Defaults to: '#'
           this.router = new Navigo(root, useHash, hash);
       }
    }
   customElements.define('my-app', MyApp);
</script>


إضافة معالجة المسار:

connectedCallback() {
   let root = null;
   let useHash = true; // Defaults to: false
   let hash = '#!'; // Defaults to: '#'
   this.router = new Navigo(root, useHash, hash);
   router
       .on('page-a', () => {
           this.innerHTML = '';
           this.insertAdjacentHTML('beforeend', '<page-a></page-a>');
       })
       .on('page-b', () => {
           this.innerHTML = '';
           this.insertAdjacentHTML('beforeend', '<page-b></page-b>');
       })
       .on('*', () => {
           this.innerHTML = '';
           this.insertAdjacentHTML('beforeend', '<div>Please click links above</div>');
       })
       .resolve();
}


في كل مرة يتم فيها تغيير المسار ، يقوم المكون الخاص بنا بتحديث المحتوى الداخلي عن طريق إضافة علامة جديدة إليه. يبقى تسجيل هذه العلامات لمكونات الصفحة الجديدة.

class PageA extends HTMLElement {
   connectedCallback() {
       this.insertAdjacentHTML('beforeend', '<div>This is a page A</div>');
   }
}
class PageB extends HTMLElement {
   connectedCallback() {
       this.insertAdjacentHTML('beforeend', '<div>This is a page B</div>');
   }
}
customElements.define('page-a', PageA);
customElements.define('page-b', PageB);


في الجزء العلوي من الصفحة ، أضف روابط للتحقق من التنقل:

<a href="page-a" data-navigo>Page A</a>
<a href="page-b" data-navigo>Page B</a>


تتيح سمة data-navigo النقر فوقها ليتم معالجتها بواسطة جهاز التوجيه ، بدلاً من تقديم طلبات للواجهة الخلفية. وهو وقت البدء ، على سبيل المثال ، مثل هذا:

npx http-server


افتح 127.0.0.1 : 8080 في المتصفح أو أي شيء يكتبه لك هناك وتأكد من أن كل شيء يعمل.



الآن يمكننا توزيع كل شيء كما ينبغي في ملفات منفصلة ، وإرفاق القالب والتحميل الديناميكي للصفحات ، وإخراج المسارات إلى التكوين. ستتولى مكونات الويب العمل الرئيسي مع دورة حياة كائنات التطبيق ، فقط الأحداث التي يجب أن تتذكر قطع الاتصال بها (العودة) في الخطاف.

نظرًا لأنني أردت إظهار مدى سرعة تنفيذ ذلك ، ربما لن أمتد في المقالة أكثر من ذلك ؛)

حول بعض كتب بالفعل في المقالات:

البدء السريع مع WebComponents

و

WebComponents كأطر ، وتفاعل المكونات

انتظر الكشف الجديد ^ W مقالات ، مشاركة وما شابه!

يمكن الاطلاع على رمز المصدر الناتج هنا في المستودع الموجود على bitpack:

https://bitbucket.org/techminded/testnavigo/

All Articles