Skip to content

10. المشروع [vuejs-08]: الأحداث المستقلة عن التسلسل الهرمي للمكونات، ودورة حياة المكونات

يوضح المشروع [vuejs-08] كيف يمكن للمكونات غير المرتبطة مباشرة في التسلسل الهرمي للمكونات أن تتواصل مع بعضها البعض عبر الأحداث. الشجرة الهيكلية للمشروع [vuejs-08] هي كما يلي:

Image

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

يظل البرنامج النصي [main.js] كما كان في الأمثلة السابقة.

10.2. البرنامج النصي [even-bus.js]

البرنامج النصي [event-bus.js] هو الأداة التي سنستخدمها لإرسال الأحداث والاستماع إليها:


import Vue from 'vue';
const eventBus = new Vue();
export default eventBus;

يقتصر البرنامج النصي [event-bus] على إنشاء مثيل للفئة [Vue] (السطران 1-2) وتصديره (السطر 3). تحتوي الفئة [Vue] على طريقتين لإدارة الأحداث:

  • [Vue].$emit(الاسم، البيانات): تسمح بإصدار حدث باسم [nom] ومرتبط بالبيانات [donnée
  • [Vue].$on(الاسم، fn): تسمح باعتراض الحدث المسمى [nom] ومعالجته بواسطة الدالة [fn]. وستتلقى الدالة [fn] كمعلمة البيانات [donnée] المرتبطة بالحدث من قبل مُرسِل الحدث؛

لا ترتبط إدارة الأحداث هذه بالتسلسل الهرمي للمكونات. يجب فقط أن تستخدم المكونات التي ترغب في التواصل بهذه الطريقة نفس مثيل الفئة [Vue] لإرسال/استقبال الأحداث. في مثالنا، سنستخدم المثيل [eventBus] المحدد بواسطة البرنامج النصي [event-bus.js] السابق.

10.3. الطريقة الرئيسية [App.vue]

فيما يلي كود العرض الرئيسي [App]:


<template>
  <div class="container">
    <b-card>
      <b-alert show variant="success" align="center">
        <h4>[vuejs-08] : événements indépendants de la hiérarchie des composants, cycle de vie des composants</h4>
      </b-alert>
      <!-- المكونات الثلاثة التي تتواصل عبر الحدث -->
      <Component1 />
      <Component3 />
      <Component2 />
    </b-card>
  </div>
</template>

<script>
  import Component1 from "./components/Component1";
  import Component2 from "./components/Component2";
  import Component3 from "./components/Component3";
  export default {
    name: "app",
    // المكونات
    components: {
      Component1,
      Component2,
      Component3
    }
  };
</script>
  • الأسطر 8-10: تستخدم العرض الرئيسي [App] ثلاثة مكونات [Component1, Component2, Component3] ستتواصل عبر الأحداث. تقع المكونات الثلاثة على نفس المستوى في العرض [App]. علاوة على ذلك، لن تكون هناك علاقة هرمية بينها؛

10.4. المكون [Component1]

رمز المكون [Component1] هو كما يلي:


<template>
  <b-row>
    <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 eventBus from "../event-bus.js"
  export default {
    name: "component1",
    // حالة المكون
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // طرق إدارة الأحداث
    methods: {
      // إدارة الحدث [someEvent]
      doSomething(data) {
        this.data = data;
        this.showMsg = true;
      }
    },
    // إدارة دورة حياة المكون
    // حدث [created] - تم إنشاء المكون
    created() {
      // استماع إلى الحدث [someEvent]
      eventBus.$on("someEvent", this.doSomething);
    }
  };
</script>

تعليقات

  • الأسطر 4-6: تنبيه يعرض البيانات [data] الموجودة في السطر 18. سيتم تهيئة هذه البيانات بواسطة معالج الأحداث [doSomething] الموجود في السطر 25. يتم تنشيط هذا المدير عند استلام الحدث [someEvent] (السطر 34). يتم عرض التنبيه بناءً على قيمة السمة [showMsg] في السطر 19. ويتم تعيين هذه السمة أيضًا بواسطة مُعالج الأحداث [doSomething] في السطر 25؛
  • السطر 32: الدالة [created] هي معالج أحداث. وهي تدير الحدث [created]، وهو حدث يتم إصداره خلال دورة حياة المكون. وهناك أحداث أخرى مثل [beforeCreate, created, beforeMount, mounted, beforeUpdate, updated, beforeDestroy, destroyed]. يتم إصدار الحدث [created] عند إنشاء المكون؛
  • السطر 12: يتم استيراد مثيل [eventBus] من الفئة [Vue]؛
  • السطر 34: تُستخدم للاستماع إلى الحدث [someEvent]. وعندما يحدث هذا الحدث، يتم استدعاء الطريقة [doSomething] الموجودة في السطر 25؛
  • السطر 25: تتلقى الطريقة [doSomething] كمعلمة [dataوهي البيانات التي ربطها مرسل الحدث [someEvent] بالحدث؛
  • السطران 26-27: يتم تعديل حالة المكون بحيث يعرض تنبيه السطور 4-6 البيانات المستلمة؛

10.5. المكون [Component2]

المكون [Component2] هو كما يلي:


<template>
  <div>
    <b-button @click="createEvent">Créer un événement</b-button>
  </div>
</template>
<!-- نص برمجي -->
<script>
  import eventBus from '../event-bus.js'
  export default {
    name: "component2",
    // طرق إدارة الأحداث
    methods: {
      createEvent() {
        eventBus.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

تعليقات

  • السطر 3: زر لإنشاء حدث. عندما ينقر المستخدم على هذا الزر، يتم استدعاء الأسلوب [createEvent] الموجود في السطر 13؛
  • السطر 8: يتم استيراد المثيل [eventBus] المُعرَّف بواسطة البرنامج النصي [event-bus.js]؛
  • السطر 14: تُستخدم هذه المثيل لإصدار حدث باسم [someEvent] مرتبط بالبيانات [{ x: 2, y: 4 }]. وفي النهاية، عندما ينقر المستخدم على الزر الموجود في السطر 3، يتم إصدار الحدث [someEvent]. وإذا تذكرنا تعريف [Component1]، فسوف يعترض هذا الحدث؛

10.6. المكون [Component3]

رمز هذا المكون هو كما يلي:


<template>
  <b-row>
    <b-col>
      <b-alert show
               v-if="showMsg">Evénement [someEvent] intercepté par [Component3]. Valeur reçue={{data}}</b-alert>
    </b-col>
  </b-row>
</template>

<script>
  import eventBus from "../event-bus.js"
  export default {
    name: "component3",
    // حالة المكون
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    methods: {
      // إدارة الحدث [someEvent]
      doSomething(data) {
        this.data = data;
        this.showMsg = true;
      }
    },
    // إدارة دورة حياة المكون
    // الحدث [created] - تم إنشاء المكون
    created() {
      // الاستماع إلى الحدث [someEvent]
      eventBus.$on("someEvent", this.doSomething);
    }
  };
</script>

[Component3] هو نسخة مطابقة لـ [Component1]. وهو موجود فقط لإظهار أن الحدث الواحد يمكن اعتراضه بواسطة عدة مكونات.

10.7. تنفيذ المشروع [vuejs-08]

Image

Image

Image