English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
مقدمة
مكتبة observer هي أكثر مكتبات Vue الأساسية أهمية (بالنسبة لي)، حيث يمكنها تحقيق تحديث الديناميكية بين الرؤية والبيانات، ويعتمد هذا كليًا على دعم observer.
ملاحظة:هذا المقال مخصص لتحليل [email protected]
يتم وضع مكتبة observer في موقع src/core/observer في مشروع Vue، والمكتبة مقسومة إلى هذه الأجزاء:
الشكل التوضيحي التالي:
Observer
يتم تعريف كلاس Observer في src/core/observer/index.js، لننظر في بناء كلاس Observer أولاً
constructor (value: any) { this.value = value this.dep = new Dep() this.vmCount = 0 def(value, '__ob__', this) إذا كان Array.isArray(value) { const augment = hasProto ? protoAugment : نسخة Augment augment(value, arrayMethods, arrayKeys) this.observeArray(value) } this.walk(value) } }
القيمة هي الجسم المطلوب مراقبته، يتم إضافة خاصية __ob__ إلى القيمة في بناء المحول، كعلامة على أن القيمة قد تم مراقبتها من قبل Observer. إذا كانت القيمة هي صفوف، يتم استخدام observeArray لمرور القيمة، وتنفيذ وظيفة observe على كل عنصر من القيمة لمراقبته. إذا كانت القيمة هي جسم، يتم استخدام walk لمرور كل مفتاح في القيمة، وتنفيذ وظيفة defineReactive على كل مفتاح للحصول على التحكم في set/get لهذا المفتاح.
توضيح وظائف بعض الدوال المستخدمة أعلاه:
إذا لم تفهم النصوص أعلاه، يمكنك الرجوع إلى الشكل التالي:
Dep
Dep هو رابط بين Observer و Watcher، يمكن اعتبار Dep كنظام اشتراك يخدم Observer. ياشركر Watcher في Dep، وعندما يغير Observer البيانات، يتم إعلام جميع الملاحظات التي اشتركت بالتحديث من خلال Dep.
يقدم Dep عدة واجهات:
Watcher
Watcher يستخدم للاشتراك في التغيرات في البيانات وتنفيذ العمليات المطلوبة (مثل تحديث الواجهة). يعرف بناء Watcher كالتالي:
المؤسس (vm, expOrFn, cb, options) { هذا.vm = vm vm._watchers.push(this) // options إذا (options) { هذا.deep = !!options.deep هذا.user = !!options.user هذا.lazy = !!options.lazy هذا.sync = !!options.sync } this.deep = this.user = this.lazy = this.sync = false } this.cb = cb this.id = ++uid // uid for batching this.active = true this.dirty = this.lazy // for lazy watchers this.deps = [] this.newDeps = [] this.depIds = new Set() this.newDepIds = new Set() this.expression = process.env.NODE_ENV !== 'production' ? expOrFn.toString() : '' if (typeof expOrFn === 'function') { this.getter = expOrFn } this.getter = parsePath(expOrFn) if (!this.getter) { this.getter = function () {} process.env.NODE_ENV !== 'production' && warn( `فشل مراقبة المسار: "${expOrFn}" ` + 'للتحكم الكامل، استخدم دالة بدلاً من ذلك.', vm ) } } this.value = this.lazy ? undefined : this.get() }
في المعلمات، vm يمثل نموذج المكون، expOrFn يمثل الحقل البيانات الذي يتم الاشتراك فيه (مثل سلسلة من الأحرف، مثل a.b.c) أو دالة يجب تنفيذها، cb يمثل دالة التبليغ بعد تشغيل watcher، options هو نموذج الخيارات، يحتوي على تكوينات مثل deep، user، lazy وما إلى ذلك
على نموذج watcher هذه الطرق:
طرق قائمة
في الملف src/core/observer/array.js، قام Vue الفريق بتغيير طرق الأدوات push、pop、shift、unshift、sort、splice و reverse في قائمة Vue، مما يؤدي إلى تفعيل dep.notify() تلقائيًا عند استدعاء هذه الطرق في قائمة، مما يلغي مشكلة عدم تفعيل التحديث بعد تغيير القائمة باستخدام هذه الطرق.
هناك أيضًا توضيح في وثائق Vue الرسمية لهذا: http://cn.vuejs.org/v2/guide/list.html#الطرق-التغيرية
الخلاصة
هذا هو محتوى المقال كله، آمل أن تكون محتويات هذا المقال قد ساعدتكم في التعلم أو العمل، إذا كان لديكم أي استفسارات، يمكنكم ترك تعليقات للتفاعل.
بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويملك حقوق النشر أصحاب الملكية، تم جمع المحتوى من قبل المستخدمين على الإنترنت الذين قدموه بأنفسهم، ولا يمتلك هذا الموقع حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل هذا الموقع أي مسؤولية قانونية ذات صلة. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال #بـ @) للإبلاغ، وقدم الدليل على الدليل، وسيتم حذف المحتوى المزعوم بسرعة إذا تم التحقق منه.