Mind.js реализует реактивную архитектуру, где изменение состояния данных автоматически отражается на связанных компонентах. Механизм реактивности построен на наблюдателях и подписках, что позволяет минимизировать ручное управление DOM и упрощает синхронизацию данных.
Реактивные свойства создаются с помощью функции
reactive(). Она принимает объект и возвращает его обёртку,
которая отслеживает все чтения и записи:
import { reactive } from 'mind.js';
const state = reactive({
count: 0,
user: {
name: 'Alice',
age: 25
}
});
Любое изменение свойства state.count или
state.user.age автоматически уведомляет подписчиков, что
позволяет компонентам перерисовываться при изменении данных.
Функция watch используется для
отслеживания изменений конкретного свойства. Она принимает два
аргумента: реактивное свойство и функцию-обработчик:
import { watch } from 'mind.js';
watch(() => state.count, (newValue, oldValue) => {
console.log(`Count изменился с ${oldValue} на ${newValue}`);
});
Ключевые моменты работы watch:
computed создаёт свойства, значение
которых автоматически пересчитывается при изменении зависимостей. Это
аналог производных данных:
import { computed } from 'mind.js';
const doubleCount = computed(() => state.count * 2);
Особенности computed:
effect запускает функцию сразу и
повторно при изменении зависимостей. Отличие от computed в
том, что effect предназначен для побочных действий, а не
для вычисления значения:
import { effect } from 'mind.js';
effect(() => {
console.log(`Текущее значение count: ${state.count}`);
});
Особенности:
Mind.js поддерживает глубокую реактивность: любые вложенные объекты и массивы становятся наблюдаемыми. При изменении вложенного свойства уведомляются все подписчики.
Пример:
state.user.name = 'Bob'; // триггерит эффекты, зависящие от state.user.name
state.user.age++; // триггерит эффекты, зависящие от state.user.age
Для массивов реактивность распространяется на методы изменения:
state.items = reactive([]);
state.items.push('новый элемент'); // триггерит подписки
Mind.js использует динамическое отслеживание зависимостей, что позволяет минимизировать лишние вычисления. Любое свойство хранит список эффектов и подписчиков, которые обновляются только при реальном изменении.
Рекомендации по оптимизации:
computed для вычислений, зависящих от
нескольких свойств.Создание интерактивного счётчика с отображением производных значений:
const state = reactive({ count: 0 });
const double = computed(() => state.count * 2);
effect(() => {
console.log(`Count: ${state.count}, Double: ${double.value}`);
});
state.count++; // Count: 1, Double: 2
state.count++; // Count: 2, Double: 4
Здесь видно:
double пересчитывается автоматически при
изменении state.count.Mind.js предоставляет полную поддержку массивов:
const items = reactive(['apple', 'banana']);
watch(() => items.length, (newLength) => {
console.log(`Количество элементов: ${newLength}`);
});
items.push('cherry'); // триггерит watch
items.splice(1, 1); // удаляет 'banana' и триггерит watch
Особенности:
push, pop, splice,
shift, unshift и сортировка автоматически
вызывают обновления.computed для фильтрации или
сортировки в реактивном виде.