MobX в Vue работает с реактивностью (как и Vue), но использует свою систему отслеживания изменений. Он понимает, что состояние изменилось, с помощью прокс (Proxy) и геттеров/сеттеров (get/set).
В MobX основная функция для создания реактивного состояния — observable()
. Она превращает объект в реактивный Proxy, который отслеживает чтение (get) и изменение (set) свойств.
import { observable } from "mobx";
const store = observable({
count: 0,
increment() {
this.count++;
},
});
console.log(store.count); // MobX "запоминает", что это свойство использовалось
store.increment(); // MobX "замечает", что свойство изменилось
Vue-компоненты подписываются на реактивные свойства, когда они рендерятся внутри
observer()
. import { defineComponent } from "vue";
import { observer } from "mobx-vue-lite";
export default observer(defineComponent({
setup() {
return {
store,
};
},
template: `<div>{{ store.count }}</div>`,
}));
MobX автоматически отслеживает зависимости во время рендера.
Когда компонент использует
store.count
, MobX **"запоминает", что он зависит от count
. Когда
count
изменяется, MobX перерисовывает только этот компонент. import { computed } from "mobx";
const store = observable({
count: 1,
get doubleCount() {
return this.count * 2;
},
});
console.log(store.doubleCount); // 2
store.count = 2;
console.log(store.doubleCount); // 4 (MobX понимает, что зависимость изменилась)
MobX не просто перерисовывает всё — он оптимизирует рендеринг.
запускается сразу и при изменении любого используемого свойства.
запускается только когда меняется конкретное наблюдаемое свойство.
выполняется один раз, когда условие становится
true
. import { autorun } from "mobx";
const store = observable({ count: 0 });
autorun(() => {
console.log("Count изменился:", store.count);
});
store.count = 1; // "Count изменился: 1"
store.count = 2; // "Count изменился: 2"
Ставь 👍 и забирай 📚 Базу знаний