Состояние в $mol ведёт себя как электронная таблица: вы объявляете, как вычисляется значение, и всё, что от него зависит, обновляется само. Ни сторов, ни диспатчей, ни хуков-эффектов — граф зависимостей сам отслеживает, что пересчитывать.
Метод, помеченный @ $mol_mem, — это кешируемая реактивная ячейка. Она выполняется один раз, запоминает результат и пересчитывается только тогда, когда изменилось что-то из прочитанного ею.1namespace $.$${2export class $my_counterextends$.$my_counter{3@ $mol_memcount(){return 0}45@ $mol_memdoubled(){6return this.count()*27}8}9}doubled читает count, поэтому автоматически подписывается на count. Измените count — и каждое вью, показывающее doubled, обновится, при этом подписываться руками не на что.
Одно это различие держит реактивный код предсказуемым:@ $mol_mem — чистое вычисление: только читайте другие ячейки и возвращайте значение.@ $mol_action — эффект: запись в состояние, сетевые вызовы и таймеры — сюда.Запись в ячейку изнутри @ $mol_mem создаёт петлю обратной связи (запись инвалидирует зависимость, та пересчитывается, что снова пишет). $mol сообщает об этом как о циклической подписке. Лечение всегда одно: держите побочные эффекты в действиях, а вычисления — чистыми.В @ $mol_mem можноно нельзяОбработчики кнопок генерируются как @ $mol_mem в базовом классе; переопределяйте их через @ $mol_action, чтобы они могли безопасно писать:1@ $mol_action2submit(){3this.saved(true)4}