ميزات Vue للتذكر

قررنا في فريق Ptah الذهاب إلى أبعد من SPA المعتاد وحاولنا استخدام Vue كمصمم للصفحة المقصودة. والآن نريد مشاركة جزء من تجربتنا.

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

وظائف التقديم


قوالب المكونات هي أحد الأشياء التي يحبها المطورون لـ Vue. إنها بسيطة ومنطقية ، وبفضلها فإن إطار العمل له عتبة دخول منخفضة. بنية القالب كافية في 90 ٪ من الحالات لكتابة كود منطقي وجميل. ولكن ماذا تفعل إذا كنت في الـ 10٪ المتبقية ، ولا يمكنك كتابة مكون مضغوط؟ سوف تساعدك وظيفة التقديم.

دعونا نرى ما يستخدمه المثال من الوثائق:

Vue.component('anchored-heading', {
 render: function (createElement) {
   return createElement(
     'h' + this.level,   //  
     this.$slots.default //   
   )
 },
 props: {
   level: {
     type: Number,
     required: true
   }
 }
})

و الراسية-العنوان المكون يقبل مستوى الملكية ويرسم علامة العنوان. وبالتالي تسجيل

<anchored-heading :level="1">, !</anchored-heading>

سيتم تحويلها إلى

<h1>, !</h1>

إذا تم وصف هذا المكون باستخدام قالب قياسي ، فسوف يحتوي على ما يصل إلى 6 شروط v-if تصف مستويات مختلفة من الرؤوس:

<h1 v-if="level === 1">
 <slot></slot>
</h1>
<h2 v-if="level === 2">
 <slot></slot>
</h2>
<h3 v-if="level === 3">
 <slot></slot>
</h3>
<h4 v-if="level === 4">
 <slot></slot>
</h4>
<h5 v-if="level === 5">
 <slot></slot>
</h5>
<h6 v-if="level === 6">
 <slot></slot>
</h6>

كيف تعمل؟


تأخذ طريقة التقديم وسيطتين. الوسيطة الأولى لـ createElement هي وظيفة تصف عنصر Vue الذي يجب إنشاؤه. في المجتمع ، من المعتاد اختصار الإنشاء إلى حرف واحد - ح . الحجة الثانية هي السياق ، للوصول إلى بيانات السياق. يأخذ

createElement ثلاث حجج:

  1. العنصر المراد إنشاؤه. يمكن أن يكون هذا ليس فقط علامة HTML ، ولكن أيضًا اسم مكون. هذه الحجة مطلوبة.
  2. كائن بالبيانات. قد يحتوي على قائمة بالفئات والأنماط ومعلمات الإدخال للمكون وطرق التعامل مع الأحداث وما إلى ذلك. لمزيد من التفاصيل ، راجع الوثائق. حجة اختيارية
  3. العقد الافتراضية التابعة. يمكن أن يكون إما سلسلة أو صفيف. في المثال أعلاه ، هذا هو . $ Slots.default .

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

Vue.component('v-style', {
 render: function (h) {
   return h('style', this.$slots.default)
 }
})

الآن داخل القوالب ، بدلاً من علامة النمط ، يمكنك استخدام نمط v .

لذلك ، بمجرد أن يبدو لك أن الميزات القياسية لقوالب Vue ليست كافية - فكر في وظائف التقديم. تبدو معقدة فقط للوهلة الأولى ، ولكن يمكنك استخدام جميع الميزات التي توفرها JS فيها.

ميكسين


هل لديك العديد من المكونات المماثلة مع رمز مكرر؟ يساعد Mixins أو الشوائب على الامتثال لمبدأ DRY - يمكن استخدام وظيفة mixins في عدة مكونات في وقت واحد.

لنأخذ مثالاً. لنفترض أن لدينا مكونين من نفس المنطق:

export default  {
  name: 'TextElement',

  data () {
    return {
      elementName: 'Text',
      showEditor: false,
      editor: null
    }
  },
  
  methods: {
    initEditor () {
      this.showEditor = true
      this.editor = new Editor(this.elementName)
    }
  }
}

export default  {
  name: 'ButtonElement',

  data () {
    return {
      elementName: 'Button',
      showEditor: false,
      editor: null
    }
  },
  
  methods: {
    initEditor () {
      this.showEditor = true
      this.editor = new Editor(this.elementName)
    }
  }
}

المكونات مختلفة ، ولكن لها نفس المنطق. للقيام بذلك ، ستحتاج إلى إنشاء ملف js عادي. سيكون من المنطقي وضعه في دليل mixins بجوار المكونات.

// mixin.js
export default  {
  data () {
    return {
      showEditor: false,
      editor: null
    }
  },
  
  methods: {
    initEditor () {
      this.showEditor = true
      this.editor = new Editor(this.elementName)
    }
  }
}

// TextElement.vue
import mixin from './mixins/mixin'

export default  {
  name: 'TextElement',

  mixins: [mixin]  //  

  data () {
    return {
      elementName: 'Text',
    }
  },
}

// ButtonElement.vue
import mixin from './mixins/mixin'

export default  {
  name: 'ButtonElement',

  mixins: [mixin]

  data () {
    return {
      elementName: 'Button'
    }
  }
}

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

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

تقديم / حقن


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

كيف تعمل؟


أولاً ، نحتاج إلى تحديد البيانات في المكون الرئيسي ، والذي سنمرره إلى نسله.

// Parent.vue        
export default {
  provide: {
   device: 'is-desktop'
  }
}

يجب الآن دمج البيانات المنقولة في المكون الفرعي.

// Child.vue    
export default {
  inject: ['device'],

  created () {
   console.log(this.device) // => "is-desktop"
  }
}

كما ترى من المثال ، كل شيء بسيط للغاية. ولكن يجب ملاحظة ناقص واحد مهم - البيانات من حزمة تقديم / حقن ليست تفاعلية بشكل افتراضي! ومع ذلك ، يتم التحايل بسهولة على هذا العيب باستخدام Object.defineProperty :

provide () {
 let device = {}
 Object.defineProperty(device, 'type', { enumerable: true, get: () => this.device })
 return { device }
},

data () {
 return {
   device: 'is-desktop'
 }
}

الآن تغيير هذا الجهاز في الوالدين سيغيره في الأحفاد.

ميتا المكون


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

لذا ، من الواضح أنه سيكون لدينا مكون قسم سيكون بمثابة حاوية للعناصر و 4 مكونات للعناصر نفسها. سيكون الهيكل تقريبًا على النحو التالي:

/ sections
 -- FirstScreen.vue
/ elements
 -- Text.vue
 -- Logo.vue
 -- Button.vue
 -- SocialIcons.vue

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

<component :is="%componentName%"/>

عنصر المكون مع : هو السمة ، والذي يكتب ببساطة اسم المكون. وبفضله ، يتم حل مهمتنا ببساطة:

<script>
export default  {
  name: 'FirstScreen',

  data () {
    return {
      elements: [
        'Text',
        'Logo',
        'Button',
      ],
    }
  }
}
</script>

<template>
  <div class="first-screen">
    <component v-for="element in elements" :is="element"/>
  </div>
</template>

في مصفوفة العناصر ، كتبنا أسماء المكونات ثم ببساطة إخراج هذه المكونات في حلقة داخل قالب FirstScreen . الآن ، من أجل إضافة عنصر برموز الشبكات الاجتماعية إلى قسمنا ، نحتاج فقط إلى تنفيذ this.elements.push ("SocialIcons") .

All Articles