برنامه نویسی 221 بازدید

Vue.js یک فریمورک وب‌اپلیکیشن با استفاده آسان است که می‌توان از آن برای توسعه اپلیکیشن‌های تعاملی فرانت بهره جست. در این مقاله به بررسی شیوه مدیریت رویداد در کامپوننت Vue.js می‌پردازیم و با شیوه استفاده از v-model در کامپوننت‌های سفارشی و همچنین روش ارسال داده‌ها بین کامپوننت‌های والد و فرزند آشنا خواهیم شد.

گوش دادن به رویدادهای کامپوننت فرزند

در Vue.js امکان ارسال رویدادها از کامپوننت فرزند به والد جهت اجرای کد در کامپوننت والد وجود دارد. برای نمونه اگر بخواهیم یک دکمه به هر مطلب اضافه کنیم تا فونت صفحه را عوض کند، می‌توانیم به صورت زیر عمل کنیم:

  • فایل src/index.js
Vue.component("post", {
  props: ["post"],
  template: `
    <div>
      <h2>{{post.title}}</h2>
      <div>{{post.content}}</div>
      <button v-on:click="$emit('change-font')">
        Change Font
      </button>
    </div>
  `
});
new Vue({
  el: "#app",
  data: {
    posts: [{ title: "Foo", content: "foo" }, { title: "Bar", content: "bar" }],
    font: ""
  },
  methods: {
    changeFont() {
      this.font = this.font === "" ? "courier" : "";
    }
  }
});

ما متد changeFont را اضافه کرده‌ایم تا امکان تغییر فونت در اپلیکیشن Vue وجود داشته باشد. این متد زمانی که رویداد change-font از سوی کامپوننت post ارسال شود، فراخوانی خواهد شد. رویداد change-font زمانی از سوی post ارسال می‌شود که کاربر روی دکمه Change Font کلیک کند. این رویداد با استفاده از متد emit$ ارسال می‌شود. رشته‌ای که فرستاده می‌شود، همان نام رویداد است.

  • فایل index.html
<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div v-bind:style="{'font-family': font}">
        <post
          v-for="post in posts"
          v-bind:post="post"
          v-on:change-font="changeFont"
        ></post>
      </div>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

در قالب یک خصوصیت به نام v-bind:style داریم که فونت div را به صورت دینامیک با استفاده از دستور زیر تعیین می‌کند:

v-bind:style=”{‘font-family’: font}”

زمانی که رویداد change-font دریافت می‌شود، متد changeFont فراخوانی می‌شود تا فونت بین دو گزینه فونت Courier و فونت پیش‌فرض تغییر یابد.

متد emit$ نیز یک آرگومان دوم با مقداری که می‌خواهیم به والد بازگشت یابد می‌گیرد. برای نمونه می‌توانیم کد تغییر فونت را به صورت زیر بازنویسی کنیم.

  • فایل src/index.js
Vue.component("post", {
  props: ["post"],
  template: `
    <div>
      <h2>{{post.title}}</h2>
      <div>{{post.content}}</div>
      <button v-on:click="$emit('change-font', 'courier')">
        Change Font
      </button>
    </div>
  `
});
new Vue({
  el: "#app",
  data: {
    posts: [{ title: "Foo", content: "foo" }, { title: "Bar", content: "bar" }],
    font: ""
  },
  methods: {
    changeFont(font) {
      this.font = this.font === font ? "" : font;
    }
  }
});

در کد فوق عبارت ‘courier’ را به تابع emit$ ارسال می‌کنیم. آیتم موجود در آرگومان دوم به صورت event$ در کامپوننت والد در اختیار ما قرار می‌گیرد.

  • فایل index.html
<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div v-bind:style="{'font-family': font}">
        <post
          v-for="post in posts"
          v-bind:post="post"
          v-on:change-font="changeFont($event)"
        ></post>
      </div>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

در این کد، اقدام به ارسال template$ می‌کنیم که شامل ‘courier’ است و به متد changeFont ارسال می‌شود. این متد، فونت را بین font که ما به صورت آرگومان ارسال کردیم و یک رشته خالی تغییر می‌دهد. بنابراین همان کار قبلی را انجام می‌دهد. بدین ترتیب می‌توانیم داده‌ها را از کامپوننت فرزند به کامپوننت والد ارسال کنیم.

استفاده از v-model روی کامپوننت‌ها

v-model همان ترکیب v-bind:value و v-on:input با هم است. یعنی:

<input v-model="text">

معادل همان کد زیر است:

<input v-bind:value="text" v-on:input="text= $event.target.value" >

از آنجا که کامپوننت‌ها props را می‌گیرند و رویدادها را ارسال می‌کنند، می‌توانیم value و اتصال رویداد input را در دایرکتیو v-model ترکیب کنیم. برای نمونه می‌توانیم از آن برای ساختن ورودی سفارشی خاص خود به صورت زیر بهره بگیریم:

  • فایل src/index.js
Vue.component("styled-input", {
  props: ["value"],
  template: `
    <input
      v-bind:style="{'font-family':'courier'}"
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)"
    >
  `
});
new Vue({
  el: "#app",
  data: {
    text: ""
  }
});

در کد فوق، ‌کامپوننت style-input را طوری ایجاد کردیم که فونت ورودی را به Courier تغییر دهیم. ضمناً از v-bind:value برای به دست آوردن مقدار prop به نام value و ارسال رویداد input به صورت متنی که در کادر ورودی وارد شده است استفاده می‌کنیم.

  • فایل index.html
<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <styled-input v-model="text"></styled-input>
      <br />
      {{text}}
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

در کد فوق، می‌توانیم از v-model برای اتصال به فیلد داده text استفاده کنیم، زیرا v-model همان ترکیب v-bind:value و v-on:input است. styled-input رویداد input را ارسال کرده و prop به نام value را می‌گیرد و از این رو می‌توانیم آن‌ها را در v-model ترکیب کنیم.

سخن پایانی

امکان ارسال رویدادها با استفاده از emit$ از کامپوننت فرزند به والد وجود دارد. این متد دو آرگومان می‌گیرد که آرگومان نخست رشته‌ای برای نام رویداد و دومی شیئی است که باید به والد ارسال شود.

کامپوننت والد به شیء ارسالی از فرزند از طریق گوش دادن به رویداد با دایرکتیو v-on دسترسی دارد و سپس آن‌ها را از آیتم ارسالی از فرزند با شیء event$ بازیابی می‌کند.

v-bind:value و v-on:input همان v-model هستند، بنابراین v-bind:value و v-on:input می‌توانند در یک v-model واحد ترکیب شوند و در کامپوننت‌های سفارشی مورد استفاده قرار گیرند. بدین ترتیب کار ساخت ورودی‌های سفارشی بسیار آسان می‌شود.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» دانش‌آموخته ریاضیات و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار نیز با مجله فرادرس همکاری دارد.

بر اساس رای 1 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *