كان الدافع وراء كتابة هذه المقالة مقالًا
آخر عن كتابة
Vue ، وبالتالي ،
Vuex . لدهشتي ، لم أجد إشارة إلى وحدة نمطية ، والتي ، في رأيي ، هي الأفضل من نوعه في Vuex. البحث عن Habr ، وبالفعل عن Runet (في الواقع ، وفي المصادر الإنجليزية ، ليس من السهل العثور على أي مراجع على الفور) ، للأسف ، لم تسفر عن أي نتائج. هذه المقالة ليست تحليلًا مفصلًا ودليلًا متعدد الصفحات حول الاستخدام والتكوين ، بل هي وسيلة لمشاركتك معك ، عزيزي Vue-ninja ، وهي أداة تؤدي وظيفتها بشكل مثالي.
vuex الذكية وحدة
من ليس لديه وقت على الإطلاق:
جيثب .
الغرض الرئيسي من الوحدة ، كما قد تفكر ، هو التغطية الكاملة لتخزين Vuex بأنواعها. داخليا ومباشرة في المكونات نفسها. تمت كتابة الوحدة بواسطة المساهم الرئيسي (
@ ktsn ) في
مكتبات Vuex و
vue-class .
ماء
للاعتراف ،
لم يبدأ
طريقي في
Typescript مؤخرًا ، بما في ذلك ومع أشياء مثل الديكور ، لذلك لا يمكنني مقارنة هذه المكتبة مع النظائر الأخرى. أدت محاولاتي لتكوين واستخدام أدوات أخرى (على سبيل المثال ،
وحدة تصميم وحدات vuex ) إلى مشاكل مختلفة ، والتي في النهاية لم تسمح لي بطريقة ما أن أدرك ما
أحتاجه (أو أنا فقط لم أعرف كيف أطبخها ، كما يقولون). كنت محظوظًا جدًا باستخدام
الوحدة النمطية vuex-smart - ظهرت المكتبة في اللحظة التي كنت أترجم فيها المشروع (والمستودع) إلى Typescript. الآن كل شيء يعمل بشكل جيد ، والرمز هو ارضاء العين.
أمثلة
تحتوي المكتبة ، في رأيي ، على وثائق جيدة تغطي جميع الحالات المحتملة التي ستواجهها (وإذا لم يكن الأمر كذلك ، في الاختبارات يمكنك أن تجد كل شيء آخر غير تافه). ومع ذلك ، من أجل التخفيف بشكل ما من المقالة على الأقل بطريقة ما مع الكود ، سأقدم أمثلة أساسية عن الاتصال والاستخدام ، وبعض الأمثلة على "الحياة" ، وكيف تعمل بالتزامن مع
الديكور (هناك فارق بسيط هناك).
إنشاء وحدة
يتم إنشاء وحدة باستخدام الطبقات. قد يبدو هذا مخيفًا بشكل غير معتاد للبعض ، لكن صدقوني ، تعتاد على ذلك بسرعة.
متجر / الجذر
صلة
/store/index.ts import Vue from 'vue' import * as Vuex from 'vuex' import { createStore } from 'vuex-smart-module' import RootStore from './root' Vue.use(Vuex) export const store = createStore( RootStore, { strict: process.env.NODE_ENV !== 'production' } )
وحدات
يشبه توصيل الوحدات النمطية طريقة حدوث ذلك في نظام Vuex العادي. يجب تحديدها في خاصية الوحدات النمطية لـ RootStore:
import FooStore from './modules/foo' export default new Module({ state: RootState, getters: RootGetters, mutations: RootMutations, actions: RootActions, modules: { FooStore } })
استخدام داخل مكون
يمكنك استخدام الحفظ من خلال الخاصية العالمية بهذا. $ Store ، ومن خلال التعيين ، والتي تشبه من نواح كثيرة الموجودة في Vuex:
import Vue from 'vue'
الكتابة
مثال على كتابة الالتزام وإرسال:
import { categories } from '@/api' export type Category { attributes: { hasPrice: boolean; icon: string lvl: number name: string slug: string }; id: number } export interface IParams { city_id: number } class AppState { categories: Category[] = [] } class AppMutations extends Mutations<AppState> { setCategories(categories: Category[]) { this.state.categories = categories } } class AppActions extends Actions< AppState, AppGetters, AppMutations, AppActions > { async getCategories({params}: {params: IParams}): Promise<Category[]> { return categories.get({params}).then( ({ data }: { data: Category[] }) => { this.commit("setCategories", data) return data } ) } }
استقبالات
الاتصال باستخدام ديكورات (ديكورات الملكية )
import { Vue, Component } from "vue-property-decorator"
باستخدام وحدة داخل الوحدة النمطية
/store/module/bar.ts import { Store } from 'vuex' import { Getters, Actions, Module, Context } from 'vuex-smart-module'
إعادة تعيين المدفن
في بعض الأحيان قد يكون من الضروري إعادة تعيين وحدة التخزين إلى القيم الافتراضية ، يتم ذلك بكل بساطة:
class FooState { } class FooMutations extends Mutations<FooState> { reset () { const s = new FooState() Object.keys(s).forEach(key => { this.state[key] = s[key] }) } }
خاتمة
أتمنى أن تكون مهتمًا ، أو على الأقل تعرفت على هذه المكتبة. من يدري ، ربما يبدأ من المشروع التالي (أو ربما إعادة بناء المشاريع الحالية قاب قوسين أو أدنى؟) أنت ، مثلي ، ستبدأ في استخدام الوحدة النمطية vuex-smart (أو Typescript بشكل عام)؟ شخصيًا ، كان الانتقال إلى Typescript مؤلمًا إلى حد ما (لمدة تتراوح بين 1.5 و 2 عامًا ، وقد قمت بمحاولات للتبديل إليه من 3 إلى 4 مرات على الأقل ، ولكن في كل مرة واجهت فيها بعض المشاكل ، وسوء الفهم. مرتان أو أكثر من الوقت من قبل ، لأنه الآن لا يمكنك "رسمها بسرعة". ولكن مرة واحدة ، أثناء التنقل على "الجانب المشرق من الكتابة الثابتة" ، شعرت بقوة الأنواع وكيف تسمح في النهاية تسريع عملية التطوير ، وهو أمر مهم بنفس القدر ، تصحيح الكود (ربما في نفس 2- 3 مرات) ، وكذلك تسهيل دعمها الإضافي.
سكرتير خاص لا تنسى أن تضع نجمة على هذه الوحدة. :)
شكرفي الختام ، أود أن أشكر زوجتي الحبيبة على صبرها ، قطة على الهادر اللطيف بالقرب من الطاولة ، الجيران للصمت ، وبالطبع على اهتمامكم!