سلام دوستان. مفاهیم و ویژگیهایی توی ویوو یا هر فریمورکی وجود داره که مشابه هم هستن و گاها یک توسعهدهنده برای یک موضوع، چند تا راهحل در اختیار داره. اما این خوب نیست. اگه مسئله رو خوب بشناسیم، فقط یک راهحل باقی میمونه! و دلیلی وجود نداره که دو ویژگی با عملکردهای یکسان توی یک برنامه وجود داشته باشن. برای مثال توی ویوو پراپرتیهای computed، متدها و watcher ها شباهت زیادی به هم دارن. اما تو چه شرایطی مطمئن میشیم که فقط باید مثلا از پراپرتیهای computed استفاده کنیم؟ امروز میریم که متوجه بشیم.
توی این پست منظور از نمونه همون Vue Instance یا قسمت ویوومدل (vm) برنامه هست.
کد زیر رو در نظر بگیرید:
<div id="app"> {{ message }} </div>
message یک عضو (پراپرتی) از data هست که داریم اون رو نمایش میدیم. اعضای data اطلاعات خام هستن و باید خام بمونن. اگه بخوایم message رو بر اساس نیازمون نشون بدیم:
<div id="app"> {{ message.split('').reverse().join('') }} </div>
به نظرتون یک توسعهدهندهی دیگه میدونه message به چه صورتی داره نمایش داده میشه؟ با یکم صرف زمان و محاسبات ذهنی میتونه متوجه بشه که داریم رشته message رو به صورت معکوس نشون میدیم.
اگه بخوایم این رشتهی معکوس رو جاهای دیگه هم نشون بدیم چطور؟
<div id="app"> {{ message.split('').reverse().join('') }} <!-- --> {{ message.split('').reverse().join('') }} <!-- --> {{ message.split('').reverse().join('') }} </div>
چقدر کد تکراری! بدتر اینکه اگه بخوایم کارکتر اول message با حرف بزرگ لاتین نوشته بشه باید همهی اون تکرارها رو ویرایش کنیم! اینجاست که پراپرتیهای Computed به کار ما میان. ما میتونیم روی این پراپرتی خام (message) یک بار همهی این محاسبات رو انجام بدیم و بعد از این پراپرتی محاسبه شده رو توی View استفاده کنیم. به این پراپرتی جدید میگن Computed یا محاسبهشده.
پراپرتیهای Computed
این پراپرتیها رو توی نمونه تعریف میکنیم. ابتدا توی نمونه مثل خط ۶ کد زیر یک key به اسم computed تعریف میکنیم. این پراپرتی باید یک آبجکت باشه که توی اون میتونیم پراپرتیهای computed رو بصورت تابع تعریف کنیم. مثل خط ۷:
const app = new Vue({ el: "#app", data: { message: "Umbrella" }, computed: { reversedMsg: function() { return this.message.split('').reverse().join(''); } } });
ما اسم این پراپرتی محاسبهشده رو گذاشتیم . حالا توی هر جایی از برنامه میتونیم از اون درست مثل یک عضو data استفاده کنیم:
