Skip to content

رِندر شرطی - Conditional Rendering

v-if

از دستور v-if برای رِندر شرطی روی یک بلوک استفاده می‌شود. بلوک فقط در صورتی رِندر می‌شود که عبارت داخل دستور یک مقدار صحیح برگرداند.

template
<h1 v-if="awesome"> Vue عالی است! </h1>

v-else

می‌توانید از دستور v-else برای مشخص کردن قسمت "else" برای v-if استفاده کنید:

template
<button @click="awesome = !awesome"> تغییر وضعیت </button>

<h1 v-if="awesome"> Vue عالی است! </h1>
<h1 v-else> اوه نه 😢 </h1>

Vue عالی است!

یک عنصر v-else باید بلافاصله بعد از یک عنصر v-if یا v-else-if قرار بگیرد - در غیر این صورت شناخته نخواهد شد.

v-else-if

v-else-if، همانطور که از اسمش پیداست، به عنوان یک بلوک "else if" برای v-if عمل می‌کند. همچنین می‌تواند به صورت زنجیره‌ای، چندین بار استفاده شود:

template
<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div>

مشابه v-else، یک عنصر v-else-if باید بلافاصله بعد از یک عنصر v-if یا v-else-if قرار بگیرد.

v-if روی <template>

از آنجا که v-if یک دایرکتیو است، باید روی یک عنصر قرار بگیرد. اما اگر بخواهیم بیش از یک عنصر را تغییر دهیم چطور؟ در این صورت می‌توان از v-if روی عنصر <template> استفاده کرد که به عنوان یک پوشش مخفی عمل می‌کند. نتیجه نهایی رِندر شده شامل عنصر <template> نخواهد بود.

template
<template v-if="ok">
  <h1>Title</h1>
  <p>Paragraph 1</p>
  <p>Paragraph 2</p>
</template>

همچنین می‌توانیم از v-else و v-else-if روی <template> استفاده کنیم.

v-show

گزینه دیگر برای نمایش شرطی یک عنصر، دستور v-show است. استفاده از آن تا حد زیادی مشابه است:

template
<h1 v-show="ok">Hello!</h1>

تفاوت در این است که یک عنصر با v-show همیشه رِندر می‌شود و در DOM باقی می‌ماند. v-show فقط ویژگی display عنصر را در css آن تغییر می‌دهد.

v-show از عنصر <template> پشتیبانی نمی‌کند و همچنین v-else را قبول نمی‌کند.

v-if در مقابل v-show

v-if یک رِندر شرطی "واقعی" است چون اطمینان حاصل می‌کند که event listenerها و کامپوننت‌های فرزند داخل بلوک شرطی به درستی در طول جابجایی از بین بروند و دوباره ساخته شوند.

v-if همچنین دارای تاخیر در لود شدن است (lazy): اگر شرط در ابتدا false باشد، هیچ کاری انجام نمی‌دهد - بلوک شرطی تا زمانی که شرط برای اولین بار true شود رِندر نمی‌شود.

در مقابل، v-show خیلی ساده‌تر است - عنصر همیشه صرف نظر از شرط اولیه رِندر می‌شود، با تغییر وضعیت مبتنی بر CSS عمل می‌کند.

به طور کلی، v-if هزینه‌ی تغییر وضعیت بالاتری دارد در حالی که v-show هزینه‌ی رِندر اولیه بالاتری دارد. پس اگر نیاز است چیزی به طور مکرر تغییر کند از v-show استفاده کنید و اگر شرط احتمالا در رانتایم تغییر نمی‌کند از v-if استفاده کنید. (مترجم: استفاده از v-if راحت‌تر است)

v-if با v-for

توجه داشته باشید

استفاده از v-if و v-for روی یک عنصر به دلیل اولویت ضمنی، توصیه نمی‌شود. برای جزئیات به style guide مراجعه کنید.

زمانی که v-if و v-for هر دو روی یک عنصر استفاده می‌شوند، ابتدا v-if ارزیابی می‌شود. برای جزئیات به list rendering guide مراجعه کنید.

رِندر شرطی - Conditional Rendering has loaded