<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: Vue.js</title><link>https://academy.hsoub.com/programming/javascript/vuejs/page/2/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: Vue.js</description><language>ar</language><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; Vue.js</title><link>https://academy.hsoub.com/programming/javascript/vuejs/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-vuejs-r989/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_09/1.png.32683db95d5b2aa541dc840e561ecd79.png" /></p>

<p>
	مرحبًا بك في هذه السلسلة الجديدة التي سنتعلّم من خلالها كيف سنتعامل مع إطار العمل Vue.js. هذا الإطار الواعد الذي يُسهّل العمل في تطوير الواجهة الأمامية للتطبيقات Frontend Applications إلى حدّ بعيد.
</p>

<p>
	سنتدرّج في هذه السلسلة بشكل سلس، حيث سنتناول موضوعات بسيطة في البداية، ثم ومع تقدّمنا في الدروس سنغطي موضوعات أوسع وأشمل.
</p>

<p>
	ستلاحظ وجود تطبيقات بسيطة في كل درس، نشرح من خلالها فكرة أو أفكار محدّدة. ولكن في نهاية السلسلة سنختم بتطبيقين عمليين، يوضّحان معظم الأفكار التي تمّت تغطيتها مسبقًا. هذه السلسلة هي سلسلة تعليمية، الهدف منها هو أن تنطلق مع Vue.js بسهولة ويُسر، وبالتالي فهي ليست سلسلة مرجعيّة شاملة لإطار العمل Vue.js.
</p>

<p>
	سأفترض أنّه لديك معرفة جيدة بلغة JavaScript و بـ HTML أيضًا، كما ويُفضّل أن تمتلك معرفة أساسيّة بـ CSS.
</p>

<p>
	سنتطرق في هذا المقال إلى النقاط التالية:
</p>

<ul>
<li>
		ماهو إطار العمل framework في JavaScript؟
	</li>
	<li>
		تطبيقك الأوّل مع Vue.js.
	</li>
	<li>
		إضافة مزايا جديدة لتطبيقنا الأوّل.
	</li>
	<li>
		العمل على حاسوب محلّي.
	</li>
</ul>
<h2>
	ماهو إطار العمل framework في JavaScript؟
</h2>

<p>
	ببساطة و بمعزل عن أي تفاصيل تقنية، يساعدنا إطار العمل عمومًا في إنشاء تطبيقات عصرية حديثة، حيث يحتوي على الأدوات اللازمة لتسهيل حياة المبرمجين في إنشاء تطبيقات معقّدة بزمن قياسي، فلا يحتاج المبرمج أن يستخدم الأسلوب التقليدي القديم في التعامل مع نموذج كائنات المستند DOM باستخدام JavaScript، حيث يمكن باستخدام إطار العمل التعامل مع العناصر في DOM بشكل قياسي ومجرّد وسهل إلى حدّ بعيد.
</p>

<p>
	بدأ العمل مع JavaScript بتطوير مكتبات شهيرة مثل <a href="https://wiki.hsoub.com/jQuery" rel="external">jQuery</a> و Mootools، حيث سهّلت مثل هذه المكتبات العمل مع JavaScript على نحو كبير، وقلّلت مشاكل التوافقية بين المتصفحات المختلفة التي لم تكن تتبع معيارًا موحدًّا.
</p>

<p>
	تطوّرت الأمور بعد ذلك لتبدأ أُطر عمل متكاملة في الظهور يمكن أن نقسّمها إلى مرحلتين أساسيتين. المرحلة الأولى كانت مع ظهور أُطر عمل مثل Backbone و Ember و Knockout و AngularJS. أمّا المرحلة الثانية وهي المرحلة الحالية فكانت مع أطر عمل مثل <a href="https://wiki.hsoub.com/React" rel="external">React</a> و Angular و Vue.
</p>

<p>
	تٌعدّ Vue.js من أحدث أُطر العمل في JavaScript، وهي إطار عمل واعد، يجمع بين السهولة والمرونة والقوة، بالإضافة إلى صغر حجم الملف الخاص بها (فقط 26 كيلو بايت) مما يجعل تحميل صفحات الويب سهلة إلى حد بعيد. سنهتم بالإصدار Vue.js 2 مع التاكيد بأنّ ما سنأخذه هنا يمكن تطبيقه بسهولة في إصدارات لاحقة.
</p>

<h2>
	تطبيقك الأول مع Vue.js
</h2>

<p>
	قبل البدء باستخدام Vue.js علينا أن نحصل على الملف الخاص به. لدينا عدّة خيارات لذلك، سأختار أحد أسهل الخيارات وهو الحصول على الملف الخاص بإطار العمل عن طريق شبكة تسليم محتوى CDN، ثم نتحدّث عن الخيارات الأخرى فيما بعد.
</p>

<p>
	يمكنك استخدام <a href="https://unpkg.com/vue@2.6.11/dist/vue.js" rel="external nofollow">رابط CDN</a> التالي للحصول على Vue.js؛ الرابط هو unpkg.com/vue@2.6.11/dist/vue.js سنحتاج حاليًا إلى الرابط فقط.
</p>

<p>
	انتقل الآن إلى الموقع <a href="https://jsfiddle.net/" rel="external nofollow">jsfiddle.net</a> الذي يوفّر بيئة تطوير بسيطة وممتازة لتجريب Vue.js دون تحميل أي شيء على حاسوبك. ستحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50882" href="https://academy.hsoub.com/uploads/monthly_2020_09/1.png.3b0876f2988b8648f7daf12e11ff279c.png" rel=""><img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50882" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/1.thumb.png.3969e34f65412f318de22cc9f06505a6.png"></a>
</p>

<p>
	انقر على الرابط URL الذي يظهر في القسم الأيسر في الأعلى من النافذة السابقة، بجوار كلمة Resources:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50883" href="https://academy.hsoub.com/uploads/monthly_2020_09/2.png.f93a8e77081617dcf091854cf0c4b9e7.png" rel=""><img alt="2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50883" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/2.png.f93a8e77081617dcf091854cf0c4b9e7.png"></a>
</p>

<p>
	بعد نقر الرابط السابق ستحصل على مربّع نص، انسخ فيه رابط CDN السابق، ثم انقر الزر المجاور الذي يظهر على شكل إشارة زائد:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50884" href="https://academy.hsoub.com/uploads/monthly_2020_09/3.png.b9cefbc2484c8a59531958a6d64fcb17.png" rel=""><img alt="3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50884" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/3.png.b9cefbc2484c8a59531958a6d64fcb17.png"></a>
</p>

<p>
	نكون بذلك قد أخبرنا بيئة التطوير المصغّرة أنّنا بصدد استخدام الملف الخاص بإطار العمل Vue.js.
</p>

<p>
	انسخ الآن شيفرة HTML التالي إلى القسم الخاص بأكواد HTML من الصفحة الرئيسية لموقع jsfiddle:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4471_7" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"app"</span><span class="tag">&gt;</span><span class="pln">
    {{ message }}
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	ثم انسخ شيفرة JavaScript التالية والصقها ضمن القسم الخاص بشيفرات JavaScript في الصفحة الرئيسية الموقع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_11" style="">
<span class="kwd">var</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Vue</span><span class="pun">({</span><span class="pln">
  el</span><span class="pun">:</span><span class="pln"> </span><span class="str">'#app'</span><span class="pun">,</span><span class="pln">
  data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    message</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Hello Vue!'</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">})</span></pre>

<p>
	انقر الآن زر التشغيل Run الموجود في الزاوية اليسرى العليا من الصفحة. إذا نفذت الخطوات السابقة بدقة، ستلاحظ ظهور العبارة Hello Vue! في القسم الأيمن الأسفل من الصفحة. مبارك! لقد بنيت تطبيق Vue.js الأول لك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50885" href="https://academy.hsoub.com/uploads/monthly_2020_09/4.png.c618440921baf9969c0dedfc02172fe7.png" rel=""><img alt="4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50885" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/4.thumb.png.fee2087fecc7cf736d9595347ea450dc.png"></a>
</p>

<p>
	دعنا الآن نحلّل ما قمنا به حتى الآن. أتوقّع أنّ رُماز HTML الذي استخدمناه سهل وواضح، حيث أنشأنا عنصر div وأسندنا له المعرّف app، ووضعنا ضمن وسمي الفتح والإغلاق له التعبير التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_13" style="">
<span class="pun">{{</span><span class="pln"> message </span><span class="pun">}}</span></pre>

<p>
	هذا التعبير هو الأساس في Vue.js، سنتحدّث عنه بعد قليل. الآن لاحظ معي شيفرة JavaScript التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_15" style="">
<span class="kwd">var</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Vue</span><span class="pun">({</span><span class="pln">
  el</span><span class="pun">:</span><span class="pln"> </span><span class="str">'#app'</span><span class="pun">,</span><span class="pln">
  data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    message</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Hello Vue!'</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">})</span></pre>

<p>
	أعتقد أنّ بداية هذه الشيفرة مألوفة، حيث أنّنا نعمل على إنشاء كائن من النوع Vue باستخدام الكلمة المفتاحية <code>new</code>. لاحظ معي ماذا نمرّر إلى النوع Vue:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_17" style="">
<span class="pun">{</span><span class="pln">
  el</span><span class="pun">:</span><span class="pln"> </span><span class="str">'#app'</span><span class="pun">,</span><span class="pln">
  data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    message</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Hello Vue!'</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	المقطع السابق عبارة عن كائن آخر يُسمى بكائن الخيارات (options instance) يحوي الإعدادات التي نريد أن تكون ضمن كائن Vue.js الجديد. ففي الحقل <code>el</code> (يمثّل أول حرفين من كلمة <strong>el</strong>ement أي العنصر) نُسند القيمة '‎#app' والتي تمثّل معرّف عنصر HTML المُستَهدف (في حالتنا هذه هو عنصر <code>div</code> الذي أنشأناه قبل قليل)، أمّا الحقل <code>data</code> فيتم إسناد كائن آخر إليه يحتوي على حقل واحد وهو <code>message</code> وقيمته 'Hello Vue!'. لاحظ أنّ الكلمة 'message' هي نفسها الموجودة ضمن رُماز HTML السابق الموضوعة بحاضنة مزدوجة <code>{{ message }}</code>. وهكذا فعند تنفيذ البرنامج السابق سيعمل Vue على استبدال التعبير <code>{{ message }}</code> ضمن عنصر HTML الذي يحمل المعرّف app بالنص 'Hello Vue!‎' وهذا كلّ شيء.
</p>

<p>
	<strong>ملاحظة: </strong>رغم وجود من يميّز بين الكائن object والنسخة instance، إلّا أنني لا أفرّق بينهما من الناحية العمليّة. لذلك تراني أستخدم الترجمة "كائن" دومًا.
</p>

<p>
	حاول الآن إجراء بعض التغييرات على النص السابق، وأعد التنفيذ باستخدام الزر Run لتشاهد التغييرات الجديدة على الخرج.
</p>

<p>
	في الحقيقة إنّ ما جرى في هذا المثال يتعدّى عن كونه مجرّد عملية استبدال تعبير برسالة مجهزّة مسبقًا، إن ما يجري من وراء الكواليس هو عملية ربط كامل بين الحقل message الموجود ضمن شيفرة JavaScript وبين التعبير <code>{{ message }}</code> الموجود ضمن رُماز HTML وسنرى كيف ذلك في الفقرة التالية.
</p>

<h2>
	إضافة مزايا جديدة لتطبيقنا الأول
</h2>

<p>
	حان الوقت لإجراء بعض التحسينات على تطبيقنا الأول. انتقل إلى قسم HTML وأضف عنصر <a href="https://wiki.hsoub.com/HTML/input" rel="external">إدخال نصّي</a> input على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6504_19" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"app"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'text'</span><span class="pln"> </span><span class="atn">v-on:input</span><span class="pun">=</span><span class="atv">"updateInfo"</span><span class="tag">/&gt;</span><span class="pln">
  {{ message }}
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	لقد وضعت عنصر الإدخال فوق التعبير <code>{{ message }}</code> مباشرة. الشيء الجديد هنا هي السمة v-on:input وهي بحد ذاتها مكوّنة من قسمين الموجّه directive وهو: <code>v-on</code> والوسيط <code>input</code> المراد تمريره إلى الموجّه. يلعب الموجّه <code>v-on</code> دور مُنصِت حدث event listener. وفي حالتنا هذه فإنّنا نرغب بالإنصات لحدث الإدخال input (معامل [parameter]) لعنصر الإدخال النصي. لاحظ القيمة المُسندة الموجّه: <code>updateInfo</code> وهي بكل بساطة اسم التابع الذي سيتم استدعاؤه في حال تمّ إجراء أي إدخال ضمن عنصر الإدخال النصي من قِبَل المستخدم. سنعرّف هذا التابع الآن.
</p>

<p>
	استبدل الشيفرة القديمة الموجودة بالقسم المخصّص لشيفرات JavaScript في الصفحة الرئيسية للموقع بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_21" style="">
<span class="kwd">var</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Vue</span><span class="pun">({</span><span class="pln">
  el</span><span class="pun">:</span><span class="pln"> </span><span class="str">'#app'</span><span class="pun">,</span><span class="pln">
  data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    message</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Hello Vue!'</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  methods</span><span class="pun">:{</span><span class="pln">
      updateInfo</span><span class="pun">:</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">event</span><span class="pun">){</span><span class="pln">
        </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">message </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">value</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">})</span></pre>

<p>
	الفرق الوحيد بين المقطعين الجديد والقديم، أنّنا أضفنا القسم methods الذي يتم فيه تعريف جميع التوابع (methods) التي نرغب باستخدامها. واضح أنّنا سنعرّف التابع updateInfo الذي تحدثنا عنه قبل قليل. عرّفنا هذا التابع على أنّه function ومرّرنا إليه الكائن event وهو كائن يحتوي على بيانات الحدث الذي تمّ توليده تلقائيّا بسبب كتابة المستخدم ضمن مربّع النص. العبارة البرمجية الوحيدة الموجودة في هذا التابع هي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_23" style="">
<span class="kwd">this</span><span class="pun">.</span><span class="pln">message </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">value</span><span class="pun">;</span></pre>

<p>
	على نحو غريب قليلًا، ترمز الكلمة this هنا إلى الحقل data (المعرّف ضمن نفس كائن Vue.js) والذي يحتوي بدوره على الحقل message. سنوضّح سبب ذلك في درس لاحق. القسم الثاني من العبارة بسيط، وفيه نستخلص البيانات التي أدخلها المستخدم من خلال التعبير <code>event.target.value</code>.
</p>

<p>
	جرّب تنفيذ البرنامج الآن بنقر زر Run، ثم حاول كتابة أي شيء ضمن مربع النص، ستلاحظ أنّه سيتم تحديث الرسالة بشكل فوري بالنص الذي تكتبه!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50886" href="https://academy.hsoub.com/uploads/monthly_2020_09/5.png.9983f373a2ae811b6afc8256d7657a05.png" rel=""><img alt="5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50886" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/5.thumb.png.636ee1d4d2e9fd461c4a94ed1f3e55d2.png"></a>
</p>

<h2>
	العمل على حاسوب محلي
</h2>

<p>
	إذا لم ترغب أن تعمل على jsfiddle.net يمكنك العمل بالتأكيد في وضع عدم اتصال محليًّا على حاسوبك الشخصي. علينا أوّلًا تنزيل Vue.js عن طريق الرابط <a href="https://Vue.js.org/js/vue.js" rel="external nofollow">https://Vue.js.org/js/vue.js</a> (من الممكن أن يظهر محتوى الملف كاملًا ضمن صفحة عادية في المتصفح، انسخ محتويات الصفحة واحفظها ضمن جديد، سمّه: vue.js). في الحقيقة يمكنك استخدام هذه النسخة لأغراض التطوير البرمجية فقط، أمّا عندما يصبح التطبيق قيد الاستخدام العملي فيُنصح باستخدام النسخة التالية: <a href="https://Vue.js.org/js/vue.min.js" rel="external nofollow">https://Vue.js.org/js/vue.min.js</a>
</p>

<p>
	حصلت على النسختين السابقتين من الموقع الرسمي لإطار العمل Vue.js من الصفحة التالية: <a href="https://Vue.js.org/v2/guide/installation.html" rel="external nofollow">https://Vue.js.org/v2/guide/installation.html</a>
</p>

<p>
	أنشئ مجلّدًا وسمّه Vue.js-first-app، ثم انسخ ضمن هذا المجلّد ملف vue.js الذي نزّلته قبل قليل. باستخدام محرّر HTML المناسب لك، أنشئ ملف جديد واختر له مثلا الاسم index.html. ثم احفظه في نفس المجلّد السابق بجوار الملف vue.js، وبعد ذلك أضف إليه المحتوى التالي الذي قمت بتجميعه من محتويات التطبيق المحسّن الذي تناولناه في الفقرة السابقة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6504_25" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="pln"> </span><span class="atn">dir</span><span class="pun">=</span><span class="atv">"ltr"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">charset</span><span class="pun">=</span><span class="atv">"utf-8"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">Vue.js</span><span class="tag">&lt;/title&gt;</span><span class="pln">
    </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"vue.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">
  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"app"</span><span class="tag">&gt;</span><span class="pln">
      </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'text'</span><span class="pln"> </span><span class="atn">v-on:input</span><span class="pun">=</span><span class="atv">"updateInfo"</span><span class="tag">/&gt;</span><span class="pln">
      {{ message }}
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">

    </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/javascript"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="kwd">var</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Vue</span><span class="pun">({</span><span class="pln">
          el</span><span class="pun">:</span><span class="pln"> </span><span class="str">'#app'</span><span class="pun">,</span><span class="pln">
          data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            message</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Hello Vue!'</span><span class="pln">
          </span><span class="pun">},</span><span class="pln">
          methods</span><span class="pun">:{</span><span class="pln">
            updateInfo</span><span class="pun">:</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">event</span><span class="pun">){</span><span class="pln">
              </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">message </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">value</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">})</span><span class="pln">
    </span><span class="tag">&lt;/script&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	لاحظ معي أنّنا قد أضفنا مرجعًا لملف vue.js المحلّي عن طريق وسم script ضمن القسم head من المستند، وأضفنا شيفرة JavaScript المسؤولة عن تحديث خرج التطبيق ضمن القسم body من المستند.
</p>

<p>
	يمكنك متابعة كتابة تطبيقاتك على هذا النحو، ولو أنّني أفضّل استخدام منصّات مثل <a href="http://jsfiddle.net" rel="external nofollow">jsfiddle.net</a> و <a href="http://codepen.io" rel="external nofollow">codepen.io</a> على الأقل في هذه المرحلة التي نسبر بها أغوار Vue.js.
</p>

<h2>
	ختامًا
</h2>

<p>
	تناولنا في هذا الدرس مقدّمة سريعة إلى إطار العمل الواعد Vue.js حيث تعلّمنا كيف نبدأ مع Vue.js وكيف نكتب تطبيقات بسيطة توضّح لنا مدى السهولة والمرونة التي يتمتّع بها إطار العمل هذا. سنتابع عملنا في الدروس اللاحقة لنسبر أغوار Vue.js بشكل سهل ومتدرّج.
</p>

<h2>
	تمارين داعمة
</h2>

<p>
	سأزودك في التمرينين التاليين بمسألتين بسيطتين للتدرّب على المفاهيم الموجودة في هذا الدرس. يوجد بعد كل تمرين حل مقترح، حاول ألّا تنظر إلى الحلول المقترحة قبل تقديم حلولك.
</p>

<h3>
	تمرين 1
</h3>

<p>
	استخدم الوسيط click بدلًا من الوسيط input مع الموجّه v-on لكي يستجيب التطبيق عندما ينقر المستخدم على عنصر الإدخال بدًلا من الكتابة داخله وذلك في التطبيق المحسّن الذي تحدثنا عنه قبل قليل. اجعل التطبيق يعرض الرسالة "Clicked!" عندما ينقر المستخدم.
</p>
<style type="text/css">
.anntional__paragraph {
    border: 3px solid #f5f5f5;
    margin: 20px 0 14px;
    position: relative;
    display: block;
    padding: 25px 30px;
}</style>
<div class="anntional__paragraph">
	<p>
		<strong>الحل المقترح</strong>
	</p>

	<p>
		الحل في هذا التمرين بسيط. استبدل الوسيط input بالوسيط clicked ضمن رُماز HTML ثم وفي القسم المخصّص لشيفرة JavaScript، استبدل بالسطر التالي:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_29" style="">
<span class="kwd">this</span><span class="pun">.</span><span class="pln">message </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">value</span><span class="pun">;</span></pre>

	<p>
		السطر:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_31" style="">
<span class="kwd">this</span><span class="pun">.</span><span class="pln">message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Clicked!'</span><span class="pun">;</span></pre>
</div>

<h3>
	تمرين 2
</h3>

<p>
	في هذا التمرين ستُنشئ تطبيق آلة حاسبة بسيط يقوم بعملية حسابية واحدة وهي جمع عددين. أقترح الواجهة البسيطة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="50887" href="https://academy.hsoub.com/uploads/monthly_2020_09/6.png.1898de0ad818198c8f0aafc5e9ced4e0.png" rel=""><img alt="6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="50887" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_09/6.png.1898de0ad818198c8f0aafc5e9ced4e0.png"></a>
</p>

<p>
	الميزة في هذا التطبيق أنّه إذا بدأ المستخدم بالكتابة في أي مربّع، يجب أن يقوم التطبيق بإيجاد المجموع بشكل فوري أثناء إدخاله الأرقام. لن نقوم في هذا التمرين بالتحقّق من صحة إدخال المستخدم.
</p>

<div class="anntional__paragraph">
	<p>
		<strong>الحل المقترح</strong>
	</p>

	<p>
		طريقة التنفيذ مشابهة جدّا للتطبيقات التي تناولناها في هذا الدرس. سأضيف حقلين إضافيين فقط لتخزين قيمتي المعاملين الأيمن والأيسر لعملية الجمع. شيفرة HTML المقترحة هي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6504_33" style="">
<span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"app"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'text'</span><span class="pln"> </span><span class="atn">v-on:input</span><span class="pun">=</span><span class="atv">"updateLeftOper"</span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;label&gt;</span><span class="pln">+</span><span class="tag">&lt;/label&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">'text'</span><span class="pln"> </span><span class="atn">v-on:input</span><span class="pun">=</span><span class="atv">"updateRightOper"</span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;label&gt;</span><span class="pln">=</span><span class="tag">&lt;/label&gt;</span><span class="pln">
  </span><span class="tag">&lt;label&gt;</span><span class="pln">{{result}}</span><span class="tag">&lt;/label&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

	<p>
		أما شيفرة JavaScript المقترحة فهي على الشكل التالي:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6504_35" style="">
<span class="kwd">var</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Vue</span><span class="pun">({</span><span class="pln">
  el</span><span class="pun">:</span><span class="pln"> </span><span class="str">'#app'</span><span class="pun">,</span><span class="pln">
  data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    result</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">
    leftOper</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">
    rightOper</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  methods</span><span class="pun">:{</span><span class="pln">
      updateLeftOper</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">event</span><span class="pun">){</span><span class="pln">
        </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">leftOper </span><span class="pun">=</span><span class="pln"> parseFloat</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">value</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">result </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">leftOper </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">rightOper</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    updateRightOper</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">event</span><span class="pun">){</span><span class="pln">
        </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">rightOper </span><span class="pun">=</span><span class="pln"> parseFloat</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">target</span><span class="pun">.</span><span class="pln">value</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">result </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">leftOper </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">rightOper</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">})</span></pre>

	<p>
		إذا لم تستطع استيعاب الشيفرة السابقة تمامًا فلا بأس، سنتكلم المزيد عن هذه الأمور لاحقًا.
	</p>
</div>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/javascript/vuejs/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-vuejs-%D9%84%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-dom-r990/" rel="">استخدام Vue.js للتعامل مع DOM</a>
	</li>
	<li>
		النسخة الكاملة لكتاب <a href="https://academy.hsoub.com/files/22-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-vuejs/" rel="">أساسيات إطار العمل Vue.js</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">989</guid><pubDate>Wed, 09 Sep 2020 18:06:00 +0000</pubDate></item></channel></rss>
