Middle
Vue.js'da reaktivlik qanday ishlaydi?
sobes.tech AI
AIdan javob
Vue.js-da reaktivlik "observator" (Observer) naqshiga asoslangan.
Vue instansiyasi yaratilganda, u data obyektdagi barcha xususiyatlarni aylanib chiqadi va ularni Object.defineProperty yordamida Vue 2 da yoki Proxy yordamida Vue 3 da getter va setterlarga aylantiradi.
Vue 2:
- Xususiyatga (getter) kirishda, Vue qaysi komponent uni ishlatayotganini kuzatadi.
- Xususiyat o'zgartirilganda (setter), Vue uni kuzatayotgan barcha komponentlarga yangilanishi (shablonni qayta chizish) uchun xabar beradi.
Vue 3:
- Ob'ekt bilan barcha operatsiyalarni (xususiyat qo'shish, o'chirish, qiymat o'zgartirish va boshqalar) ushlash uchun
Proxydan foydalanadi, bu Vue 2 ga nisbatan yanada to'liq reaktivlikni ta'minlaydi. Proxyyordamida, Vue 3 ning reaktivligi Vue 2 ning cheklovlaridan ozod bo'ladi (yangi xususiyatlarni qo'shish uchun$settalab qilinmaydi).
Reaktivlikning asosiy komponentlari:
- Observer: Ma'lumot xususiyatlarini getter va setterlarga aylantiradi (Vue 2) yoki ularni Proxy yordamida boshqaradi (Vue 3).
- Dep (Dependency): Har bir reaktiv xususiyat bilan bog'liq bo'lib, unga bog'liq Watcherlar ro'yxatini saqlaydi.
- Watcher: Komponent, hisoblangan xususiyat yoki watchers bo'lib, ular reaktiv ma'lumotlarga bog'liq. Ma'lumotlar o'zgarganda, Watcher xabardor qilinadi va mos harakatni bajaradi (masalan, komponentni qayta chizish).
Misol (Vue 2):
// Ichki amalga oshirish (soddalashtirilgan)
function defineReactive(obj, key, val) {
let dep = new Dep(); // Xususiyat uchun Dep yaratamiz
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter() {
// Agar global Watcher mavjud bo'lsa (komponentni chizish vaqtida)
if (Dep.target) {
dep.depend(); // Watcher'ni Dep ro'yxatiga qo'shish
}
return val;
},
set: function reactiveSetter(newVal) {
if (newVal === val) return;
val = newVal;
dep.notify(); // Barcha bog'liq Watcherlarni xabardor qilish
}
});
}
// Bu komponentda qanday ko'rinadi
new Vue({
data: {
message: 'Hello' // defineReactive message ga qo'llaniladi
},
template: '<div>{{ message }}</div>' // message ga kirishda, bu template ning Watcher'i Dep message ga qo'shiladi
});