Skip to content

9. المشروع [vuejs-07]: انتشار الأحداث في التسلسل الهرمي للمكونات

هيكل دليل المشروع كما يلي:

Image

9.1. البرنامج النصي الرئيسي [main.js]

يظل البرنامج النصي الرئيسي [main.js] دون تغيير.

9.2. المكون الرئيسي [App]

فيما يلي كود مكون [App]:


<template>
  <div class="container">
    <b-card>
      <b-alert show variant="success" align="center">
        <h4>[vuejs-07] : remontée d'événements dans la hiérarchie des composants</h4>
      </b-alert>
      <Component1 />
    </b-card>
  </div>
</template>
 
<script>
  import Component1 from './components/Component1'
  export default {
    name: "app",
    components: {
      Component1
    }
  };
</script>

يستخدم المكون [App] مكونًا جديدًا [Component1] (الأسطر 7 و13 و17).

9.3. مكون [Component11]

فيما يلي كود مكون [Component11]:


<template>
  <b-button @click="createEvent">Créer un événement</b-button>
</template>
<!-- script -->
<script>
  export default {
    name: "component11",
    // component methods
    methods: {
      // event management [click] on button
      createEvent() {
        // we send an event coupled to data
        this.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

تعليقات

  • الأسطر 1–3: يحتوي المكون [Component11] على زر واحد فقط يمكن النقر عليه. عند النقر عليه، يتم تنفيذ الأسلوب [createEvent] في الأسطر 11–14؛
  • السطر 13: تحتوي كل مثيل [View] على طريقة [$emit] تسمح بإصدار حدث:
    • المعلمة الأولى هي اسم الحدث الذي تم إصداره؛
    • المعلمة الثانية هي البيانات المرتبطة بهذا الحدث؛
    • ينتقل الحدث الذي تم إصداره صعودًا عبر التسلسل الهرمي للمكونات التي تحتوي على المكون [Component11]. وينتقل صعودًا عبر التسلسل الهرمي حتى يجد مكونًا قادرًا على معالجته. تبدأ هذه العملية بالمكون الأصلي لـ [Component11]؛

9.4. المكون [Component1]

فيما يلي كود مكون [Component1]:


<template>
  <b-row>
    <!-- le composant qui lance l'événement -->
    <b-col cols="2">
      <Component11 @someEvent="doSomething" />
    </b-col>
    <!-- message affiché par la méthode de gestion de l'évt-->
    <b-col>
      <b-alert show
               variant="warning"
               v-if="showMsg">Evénement [someEvent] intercepté par [Component1]. Valeur reçue={{data}}</b-alert>
    </b-col>
  </b-row>
</template>
 
<script>
  import Component11 from "./Component11";
  export default {
    name: "component1",
    // composants
    components: {
      Component11
    },
    // état du composant
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // méthodes de gestion des évts
    methods: {
      doSomething(data) {
        // data est l'objet qui a été associé à l'évt [someEvent]
        this.data = data;
        // affiche l'alerte
        this.showMsg = true;
      }
    }
  };
</script>

العرض المرئي

Image

Image

التعليقات

  • السطر 5: [Component1] هو العنصر الأصلي لـ [Component11] وبالتالي يمكنه "الاستماع" (هذا هو المصطلح) للأحداث التي يصدرها هذا المكون. نعلم أن [Component11] يمكنه إصدار الحدث [someEvent]. تشير السمة [@someEvent="doSomething"] إلى أنه في حالة حدوث الحدث [someEvent] الذي يصدره [Component11]، يجب تنفيذ الأسلوب [doSomething] في السطر 33؛
  • الأسطر 9-11: رسالة معروضة بواسطة طريقة [doSomething]. يتم التحكم في عرضها بواسطة القيمة المنطقية [showMsg] في السطر 28. يعرض التنبيه السمة [data] من السطر 27؛
  • السطر 33: تتلقى طريقة [doSomething]، التي يتم تنفيذها عند حدوث الحدث [someEvent] (السطر 5)، [data] المرتبطة بهذا الحدث كمعلمة. يتم تعيين هذه المعلمة إلى السمة [data] في السطر 27، والتي يتم عرضها في السطر 11؛
  • السطر 37: نضبط السمة [showMsg] على [true] لعرض التنبيه من الأسطر 9-11؛

9.5. تشغيل المشروع

Image