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>
  export default {
    name: "component11",
    // طرق المكون
    methods: {
      // إدارة الحدث [click] على الزر
      createEvent() {
        // يتم إرسال حدث مقترن ببيانات
        this.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

تعليقات

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

9.4. المكون [Component1]

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


<template>
  <b-row>
    <!-- المكون الذي يطلق الحدث -->
    <b-col cols="2">
      <Component11 @someEvent="doSomething" />
    </b-col>
    <!-- الرسالة التي تعرضها طريقة إدارة الحدث-->
    <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",
    // المكونات
    components: {
      Component11
    },
    // حالة المكون
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // طرق إدارة الأحداث
    methods: {
      doSomething(data) {
        // data هو الكائن الذي تم ربطه بالحدث [someEvent]
        this.data = data;
        // يعرض التنبيه
        this.showMsg = true;
      }
    }
  };
</script>

العرض المرئي

Image

Image

تعليقات

  • السطر 5: [Component1] هو المكون الأصلي لـ [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