→ درس المبتدئين Vue.js 1: المثال Vue
→ Vue.js للمبتدئين ، الدرس 2: سمات الربط
← Vue.js الدرس 3: العرض الشرطي
→ Vue.js للمبتدئين الدرس 4: عرض القوائم
→ Vue .js للمبتدئين الدرس الخامس: معالجة الأحداث
← Vue.js للمبتدئين الدرس 6: فئات وأنماط الربط
← Vue.js للمبتدئين الدرس 7: الخصائص المحسوبة
← مبتدئين Vue.js الدرس 8: المكونات
الغرض من الدرس
هدفنا الرئيسي هو لعرض البيانات التي وصفها خصائص الكائن البيانات
brand
و product
، كخط واحد.
الكود الأولي
هذا هو الكود الموجود في
index.html
الوسم <body>
الذي سنبدأ به:
<div id="app">
<div class="product">
<div class="product-image">
<img :src="image" />
</div>
<div class="product-info">
<h1>{{ product }}</h1>
<p v-if="inStock">In stock</p>
<p v-else :class="{ outOfStock: !inStock }">Out of Stock</p>
<ul>
<li v-for="detail in details">{{ detail }}</li>
</ul>
<div
class="color-box"
v-for="variant in variants"
:key="variant.variantId"
:style="{ backgroundColor:variant.variantColor }"
@mouseover="updateProduct(variant.variantImage)"
></div>
<button
v-on:click="addToCart"
:disabled="!inStock"
:class="{ disabledButton: !inStock }"
>
Add to cart
</button>
<div class="cart">
<p>Cart({{ cart }})</p>
</div>
</div>
</div>
</div>
ها هو الكود
main.js
:
var app = new Vue({
el: '#app',
data: {
product: 'Socks',
brand: 'Vue Mastery',
image: './assets/vmSocks-green.jpg',
inStock: true,
details: ['80% cotton', '20% polyester', 'Gender-neutral'],
variants: [
{
variantId: 2234,
variantColor: 'green',
variantImage: './assets/vmSocks-green.jpg'
},
{
variantId: 2235,
variantColor: 'blue',
variantImage: './assets/vmSocks-blue.jpg'
}
],
cart: 0
},
methods: {
addToCart() {
this.cart += 1
},
updateProduct(variantImage) {
this.image = variantImage
}
}
})
لاحظ أنه تمت إضافة خاصية جديدة مسماة إلى كائن البيانات
brand
.
مهمة
نريد أن يتم دمج ما يتم تخزينه فيه
brand
وفي product
داخل سطر واحد. بمعنى آخر ، نحتاج إلى عرض <h1>
النص في العلامة Vue Mastery Socks
، وليس فقط Socks
. لحل هذه المشكلة ، عليك أن تتساءل كيف يمكنك ربط قيمتين من قيم السلسلة مخزنتين في مثيل Vue.
حل المشكلة
سوف نستخدم الخصائص المحسوبة لحل هذه المشكلة. نظرًا لأن هذه الخصائص لا تخزن القيم ولكنها تحسبها ، فلنضيف خاصية إلى كائن الخيارات المستخدم عند إنشاء مثيل Vue
computed
وإنشاء خاصية محسوبة باسم title
:
computed: {
title() {
return this.brand + ' ' + this.product;
}
}
نعتقد أن كل شيء يتم ترتيبه بكل بساطة ووضوح. عندما يتم استدعاء الأسلوب
title()
، فإنه يؤدي سلسلة سلسلة brand
و product
ثم إرجاع سلسلة جديدة الناتجة عن ذلك.
الآن علينا فقط عرضه
title
في علامة <h1>
صفحتنا.
تبدو هذه العلامة الآن كما يلي:
<h1>{{ product }}</h1>
والآن سنجعله هكذا:
<h1>{{ title }}</h1>
دعنا نلقي نظرة على الصفحة ونتحقق من وظيفة ما فعلناه للتو.
تم تغيير عنوان الصفحة
كما ترى ، يتم عرض العنوان
Vue Mastery Socks
، مما يعني أننا فعلنا كل شيء بشكل صحيح.
أخذنا قيمتين من بيانات مثيل Vue وأنشأنا قيمة جديدة بناءً عليها. إذا تم
brand
تحديثالقيمة فيأي وقت ، على سبيل المثال - تمت كتابة سلسلة إلى هذه الخاصيةVue Craftery
، فلا داعي لإجراء أي تغييرات على رمز الخاصية المحسوبة. ستستمر هذه الخاصية في إرجاع السلسلة الصحيحة ، والتي ستبدو الآن مثلVue Craftery Socks
. title
ستظلالخاصية المحسوبةتستخدم الخاصيةbrand
، تمامًا كما كان من قبل ، ولكن الآنbrand
ستتم كتابة القيمة الجديدة إليها.
كان هذا مثالًا بسيطًا للغاية ، ولكنه مثال قابل للتطبيق تمامًا في الممارسة. لنلقِ نظرة الآن على استخدام أكثر تعقيدًا للخصائص المحسوبة.
مثال أكثر تعقيدًا
نقوم الآن بتحديث الصورة المعروضة على الصفحة باستخدام ملف
updateProduct
. نمررها variantImage
، ثم نكتب إلى الخاصية image
ما دخلت في هذه الطريقة بعد تحريك الماوس فوق المربع الملون المقابل. يبدو الرمز ذو الصلة كما يلي:
updateProduct(variantImage) {
this.image = variantImage;
}
تعمل هذه الآلية بشكل جيد ، ولكن إذا احتجنا إلى تغيير ليس فقط الصورة ، ولكن أيضًا شيء آخر ، بناءً على مربع اللون الذي يحوم الماوس فوقه ، فهذا يعني الحاجة إلى إعادة تشكيل هذا الرمز. دعنا ننزل اليها.
وبالتحديد ، بدلاً من تخزين خاصية في البيانات
image
، سنستبدلها بخاصية selectedVariant
. نقوم بتهيئته إلى 0.
selectedVariant: 0,
لماذا 0؟ النقطة المهمة هي أننا نخطط لتعيين هذه الخاصية بناءً على فهرس (
index
) العنصر الذي انتهى الماوس. يمكننا إضافة فهرس للبناء v-for
:
<div
class="color-box"
v-for="(variant, index) in variants"
:key="variant.variantId"
:style="{ backgroundColor:variant.variantColor }"
@mouseover="updateProduct(variant.variantImage)"
></div>
لاحظ أن المكان الذي اعتاد البناء عليه
v-for=«variant in variants»
هو الآن الرمز v-for=»(variant, index) in variants»
.
الآن ، بدلاً من المرور
variant.variantImage
إلى updateProduct
، دعنا ننتقل إلى هذه الطريقة index
:
@mouseover="updateProduct(index)"
الآن دعنا ندخل في كود الطريقة
updateProduct
. هذا هو المكان الذي نحصل فيه على الفهرس. وبدلاً من كتابة القيمة الجديدة this.image
، اكتب index
إلى this.selectedVariant
. أي أن selectedVariant
القيمة index
المقابلة للمربع الذي تم تحريك مؤشر الماوس عليه ستقع فيه . سنضع أيضًا ، لأغراض التصحيح ، أمرًا لتسجيل القيمة في هذه الطريقة index
.
updateProduct(index) {
this.selectedVariant = index;
console.log(index);
}
إذا قمنا الآن بتحديث الصفحة وفتحنا وحدة تحكم أدوات المطور ، يمكننا التأكد من أنه عندما نمرر فوق المربعات ، تكون القيمتان 0 و 1 في وحدة التحكم.
التحقق من وظيفة الآلية التي أنشأناها
ومع ذلك ، لم تعد الصورة معروضة على الصفحة. يظهر تحذير في وحدة التحكم.
تحذير وحدة التحكم
النقطة هي أننا أزلنا الخاصية
image
واستبدلناها بخاصيةselectedValue
، لكن هذه الخاصية لا تزال مستخدمة في تطبيقنا. دعنا نصلح المشكلة عن طريق إعادتهاimage
إلى مثيل Vue ، ولكن هذه المرة كخاصية محسوبة. سيبدو الرمز المقابل كما يلي:
image() {
return this.variants[this.selectedVariant].variantImage;
}
هنا نعيد خاصية
variantImage
عنصر المصفوفة this.variants[this.selectedVariant]
. كمؤشر يتم من خلاله الوصول إلى عنصر المصفوفة ، يتم استخدام خاصية this.selectedVariant
تساوي 0 أو 1. هذا ، على التوالي ، يمنحنا الوصول إلى عنصر الصفيف الأول أو الثاني.
إذا قمت بتحديث الصفحة الآن ، فسيتم عرض الصورة وستستجيب لتحريك الماوس فوق المربعات الملونة. ولكن الآن يتم تنفيذ هذه الآلية باستخدام خاصية محسوبة.
الآن بعد أن قمنا بإعادة تشكيل الكود الخاص بالطريقة
updateProduct
التي تعمل الآن على تحديث حالة الخاصية selectedVariant
، يمكننا العمل مع البيانات الأخرى المخزنة في كائنات من المصفوفة variants
، مثل الحقل variantQuantity
الذي سنضيفه الآن إلى الكائنات:
variants: [
{
variantId: 2234,
variantColor: 'green',
variantImage: './assets/vmSocks-green.jpg',
variantQuantity: 10
},
{
variantId: 2235,
variantColor: 'blue',
variantImage: './assets/vmSocks-blue.jpg',
variantQuantity: 0
}
],
دعنا نتخلص من الخاصية العادية
inStock
، تمامًا كما هو الحال عند العمل مع خاصية image
، قم بإنشاء خاصية محسوبة جديدة بنفس الاسم ، والتي ستعتمد قيمتها المعادة على selectedVariant
و variantQuantity
:
inStock(){
return this.variants[this.selectedVariant].variantQuantity
}
هذه الخاصية تشبه إلى حد بعيد خاصية محسوبة
image
. لكننا الآن نأخذ من الكائن المقابل ليس خاصية variantImage
، بل خاصية variantQuantity
.
إذا قمت الآن بتحريك الماوس فوق المربع ،
inStock
فستكون كمية البضائع المقابلة التي تساوي صفرًا ، و 0 ستسقط ، و 0 في JavaScript قيمة يمكن تحويلها إلى قيمة منطقية false
. لهذا السبب ، سيتم عرض رسالة على الصفحة Out of Stock
.
لاحظ أن الزر يتفاعل أيضًا بشكل صحيح عند ضبطه
inStock
على 0 كما كان من قبل .
يعتمد الزر والملصق على كمية كل منتج ،
لماذا يستمر كل شيء في العمل بشكل صحيح؟ النقطة المهمة هي
inStock
أنه لا يزال يُستخدم لربط فصلdisableButton
دراسي بزرنا. والفرق الوحيد بين الإصدار الجديد من التطبيق والإصدار السابق هو أنه أصبح الآنinStock
خاصية محسوبة وليست خاصية عادية.
تعرف على المزيد حول الخصائص المحسوبة
يتم تخزين الخصائص المحسوبة مؤقتًا. أي أن نتائج حساب هذه الخصائص يتم تخزينها في النظام حتى يتم تغيير البيانات التي تعتمد عليها هذه النتائج. نتيجة لذلك ، عندما يتغير
variantQuantity
، سيتم مسح ذاكرة التخزين المؤقت. وفي inStock
المرة التالية التي يتم فيها الوصول إليها ، ستعيد الخاصية نتيجة جديدة ، والتي سيتم وضعها في ذاكرة التخزين المؤقت.
مع أخذ ذلك في الاعتبار ، يمكننا القول أنه إذا كانت الحسابات كثيفة الموارد مطلوبة للحصول على قيمة معينة ، فمن الأفضل استخدام خاصية محسوبة لتنفيذها ، بدلاً من طريقة. يجب استدعاء الطريقة في كل مرة تكون فيها القيمة المقابلة مطلوبة.
أيضًا ، من المهم أن تتذكر أنه لا يجب عليك تغيير البيانات المخزنة في مثيل Vue في كود الخاصية المحسوب. في هذا الرمز ، كل ما عليك القيام به هو إجراء عمليات حسابية بناءً على البيانات الموجودة. يجب أن تكون هذه الوظائف نظيفة وخالية من الآثار الجانبية.
ورشة عمل
أضف خاصية منطقية جديدة إلى كائن البيانات المستخدم لإنشاء مثيل Vue
onSale
. سيشير إلى ما إذا كانت عملية البيع جارية. إنشاء خاصية محسوبة sale
على أساس brand
، product
وتشكيل onSale
بند ، تم الإبلاغ عن أنه تم تنفيذ البيع الآن أم لا. قم بإخراج هذا الخط في بطاقة المنتج.
→ هنا نموذج يمكنك استخدامه لحل هذه المشكلة
→ هنا حل للمشكلة
النتيجة
في هذا الدرس ، تعلمنا عن الخصائص المحسوبة. فيما يلي أهم الأشياء التي تعلمناها عنهم:
- الخصائص المحسوبة تحسب القيم ، لا تخزنها.
- يمكن للخصائص المحسوبة استخدام البيانات المخزنة في التطبيق لإنشاء بيانات جديدة منه.
إذا كنت تقوم بواجبك في هذه الدورة ، فأخبرنا ما إذا كنت تقوم بما يتم تقديمه لك حصريًا ، أم أنك ستذهب إلى أبعد من ذلك؟
→ درس المبتدئين Vue.js 1: المثال Vue
→ Vue.js للمبتدئين ، الدرس 2: سمات الربط
← Vue.js الدرس 3: العرض الشرطي
→ Vue.js للمبتدئين الدرس 4: عرض القوائم
→ Vue .js للمبتدئين الدرس الخامس: معالجة الأحداث
← Vue.js للمبتدئين الدرس 6: فئات وأنماط الربط
← Vue.js للمبتدئين الدرس 7: الخصائص المحسوبة
← مبتدئين Vue.js الدرس 8: المكونات