فهرست سرفصل‌های 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 — Provide/Inject (Provide/Inject)

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

Provide/Inject (Provide/Inject)

«Provide/Inject» یعنی «اشتراک داده» بین کامپوننت ها بدون عبور دادن «پراپ (Prop)». مثل دفتر مشترک کلاس که همه می بینند؛ معلم می گذارد، شاگردها برمی دارند.

اشتراک داده با Provide/Inject چیست؟

در پروژه بزرگ، عبور دادن پراپ از چند لایه سخت است. با Provide/Inject فقط جای آغاز و جای دریافت را تنظیم می کنیم. بقیه مسیر ساده می شود.

Provide: داده را در دسترس بگذار

در ریشه یا هر کامپوننت، با provide() داده را عمومی می کنی. سپس فرزندها می توانند آن را تزریق کنند.

<template>
  <h1>Food</h1>
  <div @click="this.activeComp = 'food-about'" class="divBtn">About</div>
  <div @click="this.activeComp = 'food-kinds'" class="divBtn">Kinds</div>
  <div id="divComp">
    <component :is="activeComp"></component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeComp: 'food-about',
      foods: [
        { name: 'Pizza', imgUrl: '/img_pizza.svg' },
        { name: 'Apple', imgUrl: '/img_apple.svg' },
        { name: 'Cake', imgUrl: '/img_cake.svg' },
        { name: 'Fish', imgUrl: '/img_fish.svg' },
        { name: 'Rice', imgUrl: '/img_rice.svg' }
      ]
    };
  },
  provide() {
    return {
      foods: this.foods
    };
  }
};
<\/script>

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

Inject: داده را بگیر و استفاده کن

در فرزند، با inject همان کلید را می گیری. سپس مثل داده خودت استفاده می کنی.

<template>
  <h2>Different Kinds of Food</h2>
  <p><mark>Data is provided in App.vue and injected here.</mark></p>
  <div v-for="x in foods">
    <img :src="x.imgUrl">
    <p class="pName">{{ x.name }}</p>
  </div>
</template>

<script>
export default {
  inject: [
    'foods'
  ]
};
<\/script>

<style scoped>
  div {
    margin: 10px;
    padding: 10px;
    display: inline-block;
    width: 80px;
    background-color: #28e49f47;
    border-radius: 10px;
  }
  .pName {
    text-align: center;
  }
  img {
    width: 100%;
  }
<\/style>

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

گام های عملی

  1. داده مشترک را در ریشه تعریف و provide() کن.
  2. در فرزند، کلیدها را با inject بگیر.
  3. نمایش را با v-for یا بایندینگ انجام بده.

نکته: برای حالت های پیچیده، این الگو ساده است؛ اما برای مدیریت گسترده حالت، بهتر است معماری وضعیت جداگانه داشته باشی.

جمع بندی سریع

  • Provide می گذارد؛ Inject برمی دارد.
  • دیگر نیازی به زنجیره پراپ نیست.
  • کلیدهای یکسان را استفاده کن.
  • برای داده زیاد، سراغ مدیریت وضعیت برو.