فهرست سرفصل‌های Vue
خانه (HOME) معرفی (Intro) دایرکتیوها (Directives) v-bind (v-bind) v-if (v-if) v-show (v-show) v-for (v-for) رویدادها (Events) v-on (v-on) متدها (Methods) تغییردهنده های رویداد (Event Modifiers) فرم ها (Forms) v-model (v-model) بایندینگ CSS (CSS Binding) ویژگی های محاسبه شده (Computed Properties) واچرها (Watchers) قالب ها (Templates) چرا، چگونه و راه اندازی (Why, How and Setup) اولین صفحه SFC (First SFC Page) کامپوننت ها (Components) پراپس (Props) کامپوننت های v-for (v-for Components) $emit() ($emit()) ویژگی های عبوری (Fallthrough) (Fallthrough Attributes) استایل Scoped (Scoped Styling) کامپوننت های محلی (Local Components) اسلات ها (Slots) v-slot (v-slot) اسلات های Scoped (Scoped Slots) کامپوننت های پویا (Dynamic Components) Teleport (Teleport) درخواست HTTP (HTTP Request) رفرنس های تمپلیت (Template Refs) هوک های چرخه عمر (Lifecycle Hooks) Provide/Inject (Provide/Inject) مسیریابی (Routing) ورودی های فرم (Form Inputs) انیمیشن ها (Animations) انیمیشن با v-for (Animations with v-for) بیلد (Build) Composition API (Composition API) ویژگی های توکار (Built-in Attributes) ویژگی 'is' ('is' Attribute) ویژگی 'key' ('key' Attribute) ویژگی 'ref' ('ref' Attribute) کامپوننت های توکار (Built-in Components) <KeepAlive> (<KeepAlive>) <Teleport> (<Teleport>) <Transition> (<Transition>) <TransitionGroup> (<TransitionGroup>) المان های توکار (Built-in Elements) <component> (<component>) <slot> (<slot>) <template> (<template>) نمونه کامپوننت (Component Instance) $attrs ($attrs) $data ($data) $el ($el) $parent ($parent) $props ($props) $refs ($refs) $root ($root) $slots ($slots) $emit() ($emit()) $forceUpdate() ($forceUpdate()) $nextTick() ($nextTick()) $watch() ($watch()) دایرکتیوها (Directives) v-bind (v-bind) v-cloak (v-cloak) v-for (v-for) v-html (v-html) v-if (v-if) v-else-if (v-else-if) v-else (v-else) v-memo (v-memo) v-model (v-model) v-on (v-on) v-once (v-once) v-pre (v-pre) v-show (v-show) v-slot (v-slot) v-text (v-text) گزینه های نمونه (Instance Options) داده ها (data) متدها (methods) محاسبه شده ها (computed) watch (watch) پراپس (props) emits (emits) expose (expose) هوک های چرخه عمر (Lifecycle Hooks) beforeCreate (beforeCreate) created (created) beforeMount (beforeMount) mounted (mounted) beforeUpdate (beforeUpdate) updated (updated) beforeUnmount (beforeUnmount) unmounted (unmounted) errorCaptured (errorCaptured) renderTracked (renderTracked) renderTriggered (renderTriggered) activated (activated) deactivated (deactivated) serverPrefetch (serverPrefetch) مثال ها (Examples) تمرین ها (Exercises) کوییز (Quiz) سیلابس (Syllabus) برنامه مطالعه (Study Plan) سرور (Server) گواهینامه (Certificate)
نتیجه‌ای برای جستجو یافت نشد.
Vue

Vue — واچرها (Watchers)

آخرین بروزرسانی: 1404/08/21

واچرها (Watchers)

«واچر (Watcher)» یعنی نگهبان یک «خاصیت داده (Data Property)». هر وقت مقدارش عوض شود، واچر خودکار اجرا می شود و کاری انجام می دهد؛ مثل زنگ هشدار مدرسه.

مفهوم واچر و جایگاهش

مثل data و methods و computed، بخش رزروشده watch داریم. در آن، برای هر خاصیت داده، متدی همنام می نویسیم تا تغییراتش را بگیرد.

const app = Vue.createApp({
  data() {
    return {
      // ...
    };
  },
  watch: {
    // ...
  },
  computed: {
    // ...
  },
  methods: {
    // ...
  }
});

مشاهده در ادیتور

نکته: واچر را هرگز مستقیم صدا نمی زنیم. فقط با تغییر مقدار اجرا می شود.

نمونه: جلوگیری از بازه غیرمجاز

با اسلایدر مقدار rangeVal را عوض می کنیم. واچر اجازه 20 تا 60 را نمی دهد.

<input type="range" v-model="rangeVal">
<p>{{ rangeVal }}<\/p>
<script>
const app = Vue.createApp({
  data() {
    return {
      rangeVal: 70
    };
  },
  watch: {
    rangeVal(val) {
      if (val > 20 && val < 60) {
        if (val < 40) {
          this.rangeVal = 20;
        } else {
          this.rangeVal = 60;
        }
      }
    }
  }
});
<\/script>

مشاهده در ادیتور

دسترسی به مقدار جدید و قبلی

واچر دو آرگومان می گیرد: مقدار جدید و مقدار قبلی. پس می توانیم اختلاف را حساب کنیم.

<div v-on:click="updatePos"><\/div>
<p>{{ xDiff }}<\/p>
<script>
const app = Vue.createApp({
  data() {
    return {
      xPos: 0,
      xDiff: 0
    };
  },
  watch: {
    xPos(newVal, oldVal) {
      this.xDiff = newVal - oldVal;
    }
  },
  methods: {
    updatePos(evt) {
      this.xPos = evt.offsetX;
    }
  }
});
<\/script>

مشاهده در ادیتور

بازخورد لحظه ای اعتبار ورودی

ایمیل را نگاه می کنیم. اگر @ اضافه شد و قبلاً نبود، پیام «درست شد!» می دهیم.

<input type="email" v-model="inpAddress">
<p v-bind:class="myClass">{{ feedbackText }}<\/p>
<script>
const app = Vue.createApp({
  data() {
    return {
      inpAddress: '',
      feedbackText: '',
      myClass: 'invalid'
    };
  },
  watch: {
    inpAddress(newVal, oldVal) {
      if (!newVal.includes('@')) {
        this.feedbackText = 'The e-mail address is NOT valid';
        this.myClass = 'invalid';
      } else if (!oldVal.includes('@') && newVal.includes('@')) {
        this.feedbackText = 'Perfect! You fixed it!';
        this.myClass = 'valid';
      } else {
        this.feedbackText = 'The e-mail address is valid :)';
      }
    }
  }
});
<\/script>

مشاهده در ادیتور

واچرها در برابر متدها و computed

متدها با رویداد صدا می خورند. واچرها خودکار با تغییر داده اجرا می شوند. computed خروجی پویا مثل داده می دهد؛ اما واچر «اقدام» انجام می دهد.

گام های عملی

  1. خاصیت داده را تعریف کن. مثال: rangeVal.
  2. در watch، متد همنام آن خاصیت بساز.
  3. درون واچر، منطق واکنش را پیاده کن.

جمع بندی سریع

  • واچر نگهبان تغییرات داده است.
  • خودکار و واکنشی اجرا می شود.
  • دو آرگومان می گیرد: جدید و قبلی.
  • برای اعتبارسنجی و همگام سازی عالی است.

ادامه مسیر: ویژگی های محاسبه شده برای خروجی پویا؛ و قالب ها برای سازمان دهی نما. همچنین واچر Vue را به عنوان مرجع نگه دار.