Skip to content

17. پروژه [vuejs-15]: استفاده از افزونه [Vuex]

پروژه [vuejs-15] بر پایه پروژه [vuejs-14] ساخته شده است و از یک شیء واکنشی [session] که توسط [Vuex] تولید شده است، استفاده می‌کند. ساختار پروژه به شرح زیر است:

Image

17.1. نصب وابستگی [vuex]

Image

17.2. اسکریپت [./session.js]

شیء [session] به صورت زیر در می‌آید:


// پلاگین Vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);

// جلسه یک استور Vuex است
const session = new Vuex.Store({
  state: {
    // آرایه شبیه‌سازی‌ها
    lignes: []
  },
  mutations: {
    // تولید لیست شبیه‌سازی‌ها
    generateLignes(state) {
      // eslint-disable-next-line no-console
      console.log("mutation generateLignes");
      // ابتدایی‌سازی [state.lignes]
      state.lignes =
        [
          { id: 3, marié: "oui", enfants: 2, salaire: 35000, impôt: 1200 },
          { id: 5, marié: "non", enfants: 2, salaire: 35000, impôt: 1900 },
          { id: 7, marié: "non", enfants: 0, salaire: 30000, impôt: 2000 }
        ];
      //eslint-disable-next-line no-console
      console.log(state.lignes);
    },
    //حذف شاخص شماره خط
    deleteLigne(state, index) {
      // eslint-disable-next-line no-console
      console.log("mutation deleteLigne");
      // شماره خط حذف شده است [index]
      state.lignes.splice(index, 1);
    }
  }
});
// صادرات شیء [session]
export default session;

نظرات

  • خطوط ۲–۴: افزونه [Vuex] در چارچوب [Vue] ادغام می‌شود؛
  • خط ۷: جلسه به یک شی از نوع [Vuex.Store] تبدیل می‌شود؛
  • خطوط ۸–۱۱: ویژگی [state] شامل وضعیت مشترک برنامه [Vue] است. این ویژگی برای همه اجزای برنامه قابل دسترسی خواهد بود. در اینجا آرایه شبیه‌سازی [lignes] (خط ۱۰) را به اشتراک می‌گذاریم؛
  • خطوط ۱۲–۳۵: ویژگی [mutations] شامل متدهایی است که محتوای شیء [state] را تغییر می‌دهند؛
  • خطوط ۱۴–۲۶: ویژگی [generateLignes] تابعی است که مقدار اولیه را برای ویژگی [state.lignes] تولید می‌کند. در اینجا، [state] را به‌عنوان پارامتر می‌پذیرد. خطوط ۱۸–۲۳: ویژگی [state.lignes] مقداردهی اولیه می‌شود؛
  • خطوط ۲۸–۳۵: ویژگی [deleteLigne] تابعی است که یک سطر را از آرایه [state.lignes] حذف می‌کند. پارامترهای آن عبارتند از:
    • [stateکه نمایانگر شیء خطوط 8–11 است؛
    • [index]، که شماره ردیف مورد نظر برای حذف است؛
  • توابع خاصیت [mutations] همیشه به عنوان اولین پارامتر خود، ابجکتی را می‌پذیرند که نمایانگر خاصیت [state] خط 8 است. پارامترهای زیر توسط کدی که تغییر را فراخوانی می‌کند، ارائه می‌شوند؛
  • خط ۳۷: شیء [session] صادر می‌شود.

برخلاف پروژه قبلی [vuejs-13 در اینجا پلاگینی برای در دسترس قرار دادن جلسه برای کامپوننت‌ها از طریق ویژگی [Vue.$session] نخواهیم داشت.

17.3. اسکریپت اصلی [./main.js]

اسکریپت اصلی به شرح زیر تکامل یافته است:


// واردات‌ها
import Vue from 'vue'
import App from './App.vue'

//افزونه‌ها
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue);

//بوت‌استرپ
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

// جلسه
import session from './session';

// پیکربندی
Vue.config.productionTip = false

// ایجاد پروژه [App]
new Vue({
  name: "app",
  // با استفاده از استور Vuex
  store: session,
  render: h => h(App),
}).$mount('#app')

نظرات

  • خط ۱۴: جلسه وارد می‌شود؛
  • خط ۲۳: این مقدار در یک ویژگی به نام [store] به نمای اصلی ارسال می‌شود (این الزامی است). به لطف افزونه [Vuex]، این ویژگی سپس برای همه اجزا در یک ویژگی به نام [Vue.$store] در دسترس قرار می‌گیرد. بنابراین این پیکربندی بسیار شبیه به پیکربندی پروژه قبلی است: در حالی که در یک کامپوننت ما معمولاً از طریق نشانه [this.$session] به سشن دسترسی داشتیم، اکنون از طریق نشانه [this.$store] به آن دسترسی خواهیم داشت؛

17.4. نما اصلی [App]

نما اصلی [App] به شرح زیر تغییر می‌کند:


<template>
  <div class="container">
    <b-card>
      <!-- پیام -->
      <b-alert show variant="success" align="center">
        <h4>[vuejs-14] : utilisation du plugin [Vuex]</h4>
      </b-alert>
      <!-- جدول HTML -->
      <Table />
    </b-card>
  </div>
</template>

<script>
import Table from "./components/Table";
export default {
  // نام
  name: "app",
  // کامپوننت‌ها
  components: {
    Table
  },
  //چرخه عمر
  created() {
    //تولید جدول شبیه‌سازی
    this.$store.commit("generateLignes");
  }
};
</script>

توضیحات

  • خط ۹: نمای [App] از کامپوننت [Table] استفاده می‌کند اما دیگر رویدادها را از آن دریافت نمی‌کند، زیرا استور [Vuex] واکنشی است؛
  • خطوط ۲۴–۲۷: متد [created] بلافاصله پس از ایجاد کامپوننت [App] اجرا می‌شود. در این متد، ماتیون [generateLignes] اجرا می‌شود که مقدار اولیه آرایه شبیه‌سازی را تولید می‌کند. به نحو خاص دستور توجه کنید. شایان ذکر است که نشانه [this.$store] به خصوصیت [store] از view که در [main.js] instantiated شده است، اشاره دارد:

// نمونه‌سازی نما [App]
new Vue({
  name: "app",
  // استفاده از استور Vuex
  store: session,
  render: h => h(App),
}).$mount('#app')

بنابراین نشانه [this.$store] به شیء [session] اشاره می‌کند. سپس برای اجرای تغییر نام‌گذاری‌شده [generateLignes]، می‌نویسیم [this.$store.commit("generateLignes")]. این تغییر یک تابع است؛

17.5. کامپوننت [Table]

کامپوننت [Table] به شرح زیر تکامل می‌یابد:


<template>
  <div>
    <!-- فهرست خالی -->
    <template v-if="lignes.length==0">
      <b-alert show variant="warning">
        <h4>Votre liste de simulations est vide</h4>
      </b-alert>
      <!-- دکمهٔ تازه‌سازی-->
      <b-button variant="primary" @click="rechargerListe">Recharger la liste</b-button>
    </template>
    <!-- لیست غیرخالی-->
    <template v-if="lignes.length!=0">
      <b-alert show variant="primary" v-if="lignes.length==0">
        <h4>Liste de vos simulations</h4>
      </b-alert>
      <!-- جدول شبیه‌سازی‌ها -->
      <b-table striped hover responsive :items="lignes" :fields="fields">
        <template v-slot:cell(action)="row">
          <b-button variant="link" @click="supprimerLigne(row.index)">Supprimer</b-button>
        </template>
      </b-table>
    </template>
  </div>
</template>

<script>
export default {
  //وضعیت محاسباتی
  computed: {
    lignes() {
      return this.$store.state.lignes;
    }
  },
  //وضعیت داخلی
  data() {
    return {
      fields: [
        { label: "#", key: "id" },
        { label: "Marié", key: "marié" },
        { label: "Nombre d'enfants", key: "enfants" },
        { label: "Salaire", key: "salaire" },
        { label: "Impôt", key: "impôt" },
        { label: "", key: "action" }
      ]
    };
  },
  // متدها
  methods: {
    supprimerLigne(index) {
      // eslint-disable-next-line
      console.log("Table supprimerLigne", index);
      // خط حذف شد
      this.$store.commit("deleteLigne", index);
    },
    // بارگذاری مجدد لیست نمایش داده شده
    rechargerListe() {
      // eslint-disable-next-line
      console.log("Table rechargerListe");
      // بازتولید لیست شبیه‌سازی‌ها
      this.$store.commit("generateLignes");
    }
  }
};
</script>

توضیحات

  • [template] در خطوط ۱–۲۴ بدون تغییر باقی می‌ماند؛
  • خطوط ۳۰–۳۲: ویژگی محاسباتی [lignes] اکنون از [store] در [Vuex] استفاده می‌کند؛
  • خطوط ۴۹–۵۴: برای حذف یک سطر از جدول HTML، از مبدل [deleteLigne] که از [store] در [Vuex] گرفته شده است، استفاده می‌شود. شماره [index] ردیف حذف‌شدنی (ردیف ۵۳) به‌عنوان پارامتر ارسال می‌شود؛
  • خطوط ۵۶–۶۱: برای بارگذاری مجدد جدول HTML با یک لیست جدید، از جهش [generateLignes] از [store] در [Vuex] استفاده می‌کنیم؛

17.6. Conclusion

ویژگی‌های [Vue.$session] از پروژه [vuejs-13] و [Vue.$store] از پروژه [vuejs-15] بسیار شبیه به هم هستند. آنها یک هدف مشترک را دنبال می‌کنند: به اشتراک‌گذاری اطلاعات بین ویو‌ها. مزیت شیء [store] این است که واکنش‌گرا است، در حالی که شیء [session] واکنش‌گرا نیست. با این حال، پروژه [vuejs-14] نشان داد که واکنش‌گرا کردن شیء [session] با کپی کردن آن در ویژگی‌های واکنش‌گرای ویوها، کار ساده‌ای است.