Skip to content

3. مشروع [vuejs-01]: الأساسيات

لشرح الكود الذي تم تنفيذه في [vuejs-00 سنقوم بتبسيطه في [vuejs-01]. نقوم بنسخ مجلد [vuejs-00] إلى [vuejs-01]:

Image

يتكون مشروع [vuejs-01] أساسًا من أربعة ملفات:

  • [main.js] [2] هو نقطة الدخول للمشروع؛
  • [App.vue، HelloWorld.vue] [3-4] هما مكونان من مكونات [Vue.js]، ويحتويان اختياريًا على العناصر التالية:
    • [<template>...</template>]: كود HTML؛
    • [<script>...</script>]: كود JavaScript المرتبط بكود HTML؛
    • [<style>...</style>]: أنماط CSS المرتبطة برمز HTML؛
  • [public/index.html] [5]: مستند HTML الذي يعرضه الأمر [npm run serve]؛

ملف [public/index.html] الذي يتم عرضه عند تشغيل المشروع هو هذا الملف:


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>vuejs</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

وبالتالي، لا يعرض ملف HTML هذا أي شيء بشكل ثابت. لا يوجد كود HTML هنا. العرض ديناميكي: سيقوم كود JavaScript الخاص بالمشروع بإنشاء HTML الذي سيحل محل علامة [<div id=’app’>] في السطر 14 بالكامل. كود HTML الذي تم إنشاؤه بواسطة JavaScript الخاص بالمشروع وإدراجه بدلاً من علامة [<div>] في السطر 14 يأتي من علامات [template] لمكونات [vue.js]، وهي الملفات التي تحمل اللاحقة [.vue].

يتم إدراج كود HTML ديناميكيًا في السطر 14 بواسطة البرنامج النصي [vuejs-01/main.js] التالي:


// imports
import Vue from 'vue'
import App from './App.vue'
 
// configuration
Vue.config.productionTip = false
 
// instanciation projet [App]
new Vue({
  render: h => h(App),
}).$mount('#app')

تعليقات

  • السطر 2: يتم توفير كائن [Vue] بواسطة إطار عمل [vue.js]؛
  • السطر 3: يتم توفير الكائن [App] بواسطة الملف [vuejs-01/App.vue]؛
  • السطر 6: تكوين كائن [Vue]؛
  • الأسطر 9-11: هذه هي الأسطر التي:
    • توليد كود HTML للتطبيق. السطر 10: يقوم ملف [App.vue] بتوليده؛
    • تحميل كود HTML الذي تم إنشاؤه في السطر 10 إلى قسم [<div id='app'></div>] في ملف [public/index.html]؛

يمكن لأي مشروع [Vue.js] الاحتفاظ بملف [index.html] كما هو.

تم تبسيط ملف [App.vue] من المشروع الأولي [vuejs-00] على النحو التالي في مشروع [vuejs-01]:


<template>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <HelloWorld msg="Notre première application Vue.js" />
  </div>
</template>
 
<script>
import HelloWorld from "./components/HelloWorld.vue";
 
export default {
  name: "app",
  components: {
    HelloWorld
  }
};
</script>

تعليقات

  • يتكون جزء [.vue] من ثلاثة أقسام كحد أقصى:
    • [<template>...</template>] : كود HTML؛
    • [<script>...</script>] : كود JavaScript المرتبط بكود HTML؛
    • [<style>...</style>]: أنماط CSS المرتبطة برمز HTML؛

هنا، لا يوجد قسم [style].

  • الأسطر 1–6: كود HTML للجزء (الصفحة، المكون، العرض، ...)؛
  • الأسطر 2-5: يمكن أن يحتوي قسم [template] على عنصر واحد فقط. نضع عادةً قسم [div] يشمل كل HTML الخاص بالجزء. يمكننا أيضًا وضع علامة <template
  • السطر 3: صورة؛

Image

  • السطر 4: مكون باسم [HelloWorld]. مبدأ [Vue.js] هو إنشاء صفحات ويب باستخدام أجزاء محددة في ملفات [.vue]، مثل [App.vue] هنا. يتم تعريف هذا المكون بواسطة ملف [HelloWorld.vue] المحدد في السطر 9 من البرنامج النصي JavaScript المرتبط؛
  • السطر 4: يمكن للمكون قبول المعلمات. المعلمة هنا هي السمة [msg]؛
  • الأسطر 8-17: نصوص JavaScript الخاصة بالجزء (أو المكون)؛
  • السطر 9: لاستخدام مكون [HelloWorld] داخل مكون [App]، يجب استيراد تعريفه إلى قسم [script]؛
  • الأسطر 11-16: يحدد البرنامج النصي كائنًا ويصدره لجعله متاحًا خارجيًا؛
  • السطر 12: تحدد السمة [name] اسم المكون الذي تم تصديره؛
  • الأسطر 13–15: تسرد السمة [components] المكونات التي يستخدمها المكون [App]. يتم تصديرها معه؛

السطر 9: لا يجب أن يكون لمكون [HelloWorld] نفس اسم الملف الذي يحدده. يمكن استيراده باسم [X] وتصديره كمكون [Bonjour]:

Image

  • السطر 14: يتم تصدير المكون [X] تحت اسم [Bonjour]. ثم يتم استخدامه تحت هذا الاسم، في السطر 4؛

الإصدار الأول هو الأكثر شيوعًا، لذا سنقوم بتعريف مكوناتنا بهذه الطريقة؛


<template>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <HelloWorld msg="Notre première application Vue.js" />
  </div>
</template>
 
<script>
import HelloWorld from "./components/HelloWorld.vue";
 
export default {
  name: "app",
  components: {
    HelloWorld
  }
};
</script>

السطر 14 هو اختصار للكود [HelloWorld : HelloWorld]: يتم تصدير المكون [HelloWorld] (على اليمين، المستورد في السطر 9) تحت الاسم [HelloWorld] (على اليسار).

Image

نقوم بتبسيط مكون [HelloWorld.vue] على النحو التالي:


<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>
</template>
 
<script>
export default {
  name: "HelloWorld",
  props: {
    msg: String
  }
};
</script>

تعليقات

  • يحتوي المكون [HelloWorld] على نفس بنية الملفات التي يحتوي عليها المكون الرئيسي [App]؛
  • السطر 3: يقوم هذا بتقييم تعبير JavaScript، وهو في هذه الحالة التعبير [msg]؛
  • الأسطر 10–12: تحدد خصائص المكون، وبشكل أكثر تحديدًا معلماته. عندما قام المكون [App] بإنشاء مثيل لمكون [HelloWorld]، فقد استخدم الصيغة التالية:

<HelloWorld msg="Notre première application Vue.js" />

يتم إنشاء مثيل لمكون [HelloWorld] عن طريق تعيين قيمة للمعلمة (السمة) [msg]. إذا نظرنا إلى [القالب] لمكون [HelloWorld]، يصبح كما يلي:


<div>
    <h1>Notre première application Vue.js</h1>
</div>
  • الأسطر 7–14: خصائص المكون المُعرَّفة ككائن يتم تصديره؛
    • السطر 9: يتم تصدير المكون تحت اسم [HelloWorld]؛
    • الأسطر 10–12: يتم تعريف معلماته بواسطة الخاصية [props]؛

في النهاية، إذا قمنا بدمج قوالب المكونين [App، HelloWorld] المستخدمين، فسيكون ملف [index.html] المعروض كما يلي:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  <title>vuejs</title>
</head>
<body>
  <noscript>
    <strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <div>
      <h1>Notre première application Vue.js</h1>
    </div>
  </div></body>
</html>

نقوم بتشغيل التطبيق عن طريق تعديل الأمر [serve] [1] في ملف [package.json]:

Image

ثم يتم عرض الصفحة [2].

الآن دعونا نلقي نظرة على كود هذه الصفحة:

Image

  • في [1]، انقر بزر الماوس الأيمن؛
  • في [2]، كود مصدر الصفحة. يمكننا أن نرى أن هذا هو الكود من ملف [index.html] الأولي، وهذا ليس ما تم عرضه. كانت صفحة [index.html] هي التي تم تحميلها في البداية بالفعل. ثم، بشكل ديناميكي، قام كود JavaScript بتعديل هذه الصفحة، ولكن لم يتم عرض ذلك لنا؛

عندما يتم إنشاء الصفحات ديناميكيًا بواسطة JavaScript، فإن الخيار [2] يصبح عديم الفائدة. يجب عليك الانتقال إلى أدوات المتصفح (F12 في Firefox) لعرض كود الصفحة المعروضة حاليًا:

Image

  • في [1]، أداة فحص DOM (نموذج كائن المستند) للمستند المعروض؛
  • في [2]، ما يحتويه DOM فعليًا؛
  • [3-4]، الأدوات التي سنستخدمها لعرض كائنات JavaScript المستخدمة بواسطة إطار عمل [Vue.js]؛
  • [4] هو امتداد (هنا لـ Firefox) لتصحيح أخطاء تطبيقات [Vue.js]:
    • لـ Firefox: [https://addons.mozilla.org/fr/firefox/addon/vue-js-devtools/]؛
    • لـ Chrome: [https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd]؛

دعونا نفحص علامة التبويب [Vue] [4]:

Image

تُظهر لنا طريقة العرض [1-4] بنية [Vue.js] للوثيقة: حيث يحتوي جذر الوثيقة [2] (index.html) على مكون [App] (3)، الذي يحتوي بدوره على مكون [HelloWorld] (4). ويؤدي النقر على [4] إلى عرض خصائص مكون [HelloWorld] [5].

في [4] (على اليمين)، نرى المؤشر [$vm0]. هذا هو اسم المتغير الذي يمكننا استخدامه في وحدة تحكم JavaScript [6] للإشارة إلى كائن [HelloWorld]. لنفعل ذلك:

Image

  • في [2]، نقوم بتقييم التعبير [$vm0]، الذي يعرض بنيته. عادةً، لن نحتاج إلى استخدام هذه البنية مباشرةً؛

لنختتم بتوضيح إمكانية [إعادة التحميل السريع] للأمر [serve] المستخدم لتشغيل المشروع:

  • في [App.vue]، قم بتغيير الرسالة المعروضة إلى [HelloWorld]:

Image

  • في [1]، نقوم بتعديل الرسالة المعروضة؛
  • في [2-3]، يتم تحديث الصفحة تلقائيًا دون أي إجراء من جانبنا؛

سنقوم الآن بإنشاء مشاريع [vuejs-xx] متنوعة لتوضيح الميزات الرئيسية لـ [Vue.js]. ونقصد بكلمة "رئيسية" "الميزات التي سنستخدمها في عميل [Vue.js] لخادم حساب الضرائب". وسيتم حذف الميزات "الرئيسية" الأخرى إذا لم يتم استخدامها في العميل. وبالتالي، لا يُقصد من هذا العرض أن يكون عرضًا شاملاً لـ [Vue.js].